内存优化
flowchart TD
subgraph JVM内存
heap[堆(Heap)]
method_area[方法区]
vm_stack[虚拟机栈]
native_stack[本地方法栈]
pc[程序计数器]
end
JVM内存模型回顾
内存泄漏检测
-
常见泄漏场景:
- 静态集合
- 未关闭资源
- 监听器未注销
- 线程未终止
-
检测工具:
# 生成堆转储 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
缓存优化策略
-
缓存级别:
- 堆内缓存:Caffeine
- 堆外缓存:Ehcache
- 分布式缓存:Redis
-
缓存策略:
// 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);
}
最佳实践
- 监控GC日志
- 合理设置堆大小
- 避免大对象分配
- 谨慎使用finalize()
- 定期进行内存分析