跳转至
用户认证 - eMac Tech Docs

用户认证

重要提醒

为了您的权益以及学习体验,请不要外借账号!

如果您没有账号或忘记密码,请联系管理员重置密码。

请输入您的登录信息

内存优化

flowchart TD
    subgraph JVM内存
        heap[堆(Heap)]
        method_area[方法区]
        vm_stack[虚拟机栈]
        native_stack[本地方法栈]
        pc[程序计数器]
    end

JVM内存模型回顾

内存泄漏检测

  1. 常见泄漏场景

    • 静态集合
    • 未关闭资源
    • 监听器未注销
    • 线程未终止
  2. 检测工具

    # 生成堆转储
    jmap -dump:format=b,file=heap.hprof <pid>
    
    # 分析工具:
    - Eclipse MAT
    - VisualVM
    - YourKit
    

内存优化技巧

// 1. 对象复用
StringBuilder sb = new StringBuilder(1024); // 预分配大小

// 2. 避免自动装箱
int sum = 0;
for (int i = 0; i < list.size(); i++) {
    sum += list.get(i).intValue(); // 避免
    sum += list.get(i);            // 自动装箱
}

// 3. 使用基本类型集合
IntList intList = new IntArrayList(); // trove4j

缓存优化策略

  1. 缓存级别

    • 堆内缓存:Caffeine
    • 堆外缓存:Ehcache
    • 分布式缓存:Redis
  2. 缓存策略

    // Caffeine示例
    Cache<String, Object> cache = Caffeine.newBuilder()
        .maximumSize(10_000)
        .expireAfterWrite(10, TimeUnit.MINUTES)
        .build();
    

对象池技术

// Apache Commons Pool2
GenericObjectPool<ExpensiveObject> pool = new GenericObjectPool<>(
    new BasePooledObjectFactory<ExpensiveObject>() {
        @Override
        public ExpensiveObject create() {
            return new ExpensiveObject();
        }
    }
);

// 使用对象
ExpensiveObject obj = pool.borrowObject();
try {
    // 使用对象
} finally {
    pool.returnObject(obj);
}

最佳实践

  1. 监控GC日志
  2. 合理设置堆大小
  3. 避免大对象分配
  4. 谨慎使用finalize()
  5. 定期进行内存分析