您的位置:首页 > 其它

JVM-GC笔记(二)--- 对象如何回收

2016-07-25 22:59 162 查看
首先,目前主流的JVM实现中都采用了分代收集的算法,我们常常听到的新生代,老年代就是基于这个算法。
新生代:存放那些朝生夕死的对象
老年代:存放存活时间超过指定数值的对象
还有永久代,也就是方法区。存放了类结构,静态数据等,此区域JVM规范中并不要求回收。

1,标记-清除算法
原理:通过可达性分析标记无效对象,然后清除。
问题:产生大量内存碎片,碎片过多时,导致内存不够,提前触发GC

2,复制算法(适合新生代朝生夕死的特点)
原理:将堆分为两个区域A,B。分配对象时,在A区域分配,A不够分配时,将A中有效的对象转移到B中,然后清除A。接下来分配对象到B,B不够分配时,将有效对象转移到A中,如此反复。
问题:空间效率太低
解决:将堆分为一个eden区域,两个survivor区域。把eden和其中一个survivor看作原理中的A,另一个survivor看作B。转换时,把有效对象从eden和survivor中转移到另一个survivor中,然后在此survivor和eden中分配对象,如此反复。目前eden:survivor = 8:1

3,标记-整理算法
原理:同标记-清除算法类似,标记后,将可用的对象移动到一边,清除边界意外的其他对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: