编写GC友好代码(1)

来源:互联网 发布:数据结构和算法的书籍 编辑:程序博客网 时间:2024/05/21 10:01
看到李建斌《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喜欢生命周期短的对象,这样做已经足够高效





0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 9个月小孩不吃辅食怎么办 十一个月宝宝拉肚子拉水怎么办 小孩好动上课也坐不住会怎么办 幼儿大班关于环保的手抄报怎么办 捷达车打开丝位子风扇总转怎么办 小班个案分析:好动的孩子该怎么办 孩子突然过于的兴奋不睡觉是怎么办 刚出生的宝宝听力未通过怎么办 孩子多动症被老师打不上学怎么办 小孩在校被学生打家长该怎么办? 8岁儿童好动上课不注意听课怎么办 怀孕第一个月喝了啤酒怎么办 不知道自己怀孕喝了酒怎么办 怀孕一个月不知道喝酒了怎么办 老师说孩子上课不专心听讲怎么办 二年级孩子上课不认真听讲怎么办 二年级的孩子浮躁上课不认真怎么办 三年级的小孩上课不认真听讲怎么办 大班孩子上课不专心听讲玩怎么办 老师跟家长说小孩上课讲话怎么办 别的家长动手打自己的孩子怎么办? 一岁3个月宝宝骨龄偏小怎么办 宝宝9个月了越来越粘人怎么办? 孩子突然说话结巴口吃了怎么办啊 很久不说话了不敢说话了怎么办 宝宝2岁了还不会说话怎么办 2岁的宝宝还不会说话怎么办 小宝宝有四个月了母乳不够吃怎么办 一个月的宝宝吐奶厉害怎么办 新生儿吐奶吐一次吐的特别多怎么办 把孩子打了一次现在说话结巴怎么办 宝宝五岁了口吃越来越严重了怎么办 幼儿把自己的舌头扣破皮了怎么办 6岁宝贝烧到39度怎么办 2岁半的宝宝说话结巴怎么办 2周3宝宝不会说话胆小怎么办 宝宝我2岁多了说话有点结巴怎么办 两岁宝宝说话突然结巴了怎么办 两岁3宝宝叫她名字不理人怎么办 九个月的宝宝身高不达标怎么办 3岁宝宝又吐又拉怎么办