您的位置:首页 > 编程语言 > Java开发

java GC机制的一些总结

2016-04-28 12:05 246 查看
主要从三个方面考虑GC机制

1,哪些内存需要回收

2,什么时候回收

3,如何回收

1,哪些内存需要回收(可达性分析)

java虚拟机通过可达性分析算法知道一个对象是否需要被回收,可达性分析算法的简要介绍就是:选择一系列对象作为GC Roots,从这些对象向下搜索,他所经过的路径就是一个引用链,如果某些对象和GC Roots没有任何的连接的时候,就判定这些对象是无法存活的了,需要被清理掉!



如同上图,对象4和对象5,对象6就是即将被清除的对象

在这里也有一个问题,在进行可达性分析的时候,要求对象之间的关系处于一个静止的状态,不会出现动态的变化,否则无法进行下一步,java官方称之为stop the world,为了解决这个问题就引入了一个安全点的概念,jvm会设置一个安全点的标记,之后每个程序都会去轮询这个标记,发现中断标志就挂起等待。stop the world是无法避免的,无论使用哪种垃圾收集器

2,什么时候回收以及怎样回收

jvm中把堆中的对象分成新生代和老年代,首先对象优先分配在新生代中,因为新生代中的对象大多是朝生夕死的,生存周期很短,所以采用的是标记-复制的方式回收内存的,新生代区域中,分为一块较大的eden区域和两块较小的survive区域(记为survive1和survive2),每次将还存活的对象从survive1和eden区域中复制到survive2区域,之后清除survive1和eden区域中的内存,此时存活的内存就进入了survive2中,

(1)他们被赋予了一个年龄,每进行一次新生代清理他们就会增加1岁,虚拟机本身会设置一个年龄分界的默认值,超过这个默认值的时候就会进入到老年代中

(2)还有另外的一种情况就是同意年龄的survive2中的对象的内存超过了surivive2内存的一半,这些对象也会自动的进入老年代中

(3)大对象直接进入老年代,比如说一些长的字符串和数组

(4)还有一种就是空间担保的方式,因为老年代是不知道survive2中的对象的大小的,所以让survive中的对象进入到老年代是有风险的,因为老年代中的内存可能是不够的,这时候老年代就会把之前进入的那些对象的大小的平局值作为一个经验来判断是否要进行一次老年代的垃圾回收,如果远远大于经验值,就会导致担保失败,进行一次老年代的垃圾回收

老年代中由于内存回收的效率比较低,所以不经常进行内存的回收,使用的是标记整理的算法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: