编写GC友好代码(1)

本文深入探讨了如何优化JVM内存管理,包括如何利用JVM偏好生命周期短、小的对象,减少对象池的使用,合理管理Array-based数据结构,以及避免Java内存泄漏。同时提供了关于如何编写GC友好的代码的实用建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看到李建斌《JVM内存管理/GC模型/编写GC友好的代码》的ppt,将其中的实例部分摘录下来。
另外JavaOne2007上有篇《Garbage-Collection-Friendly Programming》的68页PPT,介绍得挺不错,下载地址http://img.pusuo.net/2009-08-13/110313148.pdf

JVM喜欢生命周期短的,小的对象
JVM创建对象的速度非常高,已经非常接近C++
GC回收生命周期短的对象非常高效
前面提到的新生代复制算法,对于生命周期短的对象,不需要扫描和复制就能回收


使用更多生命周期短的、小的、不改变指向(immutable)的对象
不要害怕创建临时对象作为中间计算的结果

不要滥用对象池(Object Pool)
出于节俭的心态,程序员总是倾向于使用对象池作为缓冲
除非创建对象的开销较大,否则对象池不一定能提高性能,反而会影响GC效率
比如从数据库query生成对象,pooling是有帮助的;但如果不涉及到DB/IO/Network/紧张资源的对象创建,pooling反而有反效果
对象池生命周期长,每次full gc都要处理(mark, compact,etc)
如果涉及多线程共享问题,对象池还可能带来同步等额外开销,得不偿失
容易产生内存泄漏


当使用Array-based的数据结构(ArrayList,HashMap)时,尽量减少resize
比如new ArrayList时,尽量估算size,在创建的时候把size确定
减少resize可以避免没有必要的array copying,gc碎片等问题
如果一个List只需要顺序访问,不需要随机访问(Random Access),用LinkedList代替ArrayList
LinkedList本质是链表,不需要resize, 但只适用于顺序访问


避免Java内存泄漏
Java内存泄漏VS C/C++内存泄漏
C/C++内存泄漏:把东西锁到抽屉里面,但钥匙丢了(Object unreachable)
Java内存泄漏:把有用和没用的东西都摆满房间,清洁工(GC)分不清哪些是有用的,哪些是没用的。没用的东西没办法清理。(Object reachable but unused)
Java内存泄漏类型
传统型:Heap越来越大,直到OOM
临时型:Heap临时变得很大,在某个时刻会突然变很小。导致频繁Full GC

Java内存泄漏的经典原因
对象定义在错误的范围(Wrong Scope)
异常(Exception)处理不当
集合数据管理不当
String陷阱

对象定义在错误的范围(WrongScope)




JVM喜欢生命周期短的对象,这样做已经足够高效





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值