黑马程序员技术交流社区
标题:
【成都校区】JVM虚拟机垃圾回收算法和内存分配机制简介
[打印本页]
作者:
ybs16602837817
时间:
2018-11-29 14:12
标题:
【成都校区】JVM虚拟机垃圾回收算法和内存分配机制简介
垃圾回收算法:
1、标记-清除算法:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。缺点:效率低,会产生大量不连续的内存碎片。
2、复制算法:将可用内存划分成大小相等的两块,每次只使用其中的一块,当这块的内存用完时,就将还存活的对象复制到另一块内存中,然后再把原来的内存空间清理掉。缺点:内存缩小为原来的一半。
3、标记-整理算法:首先标记出需要回收的对象,接着将所有存活的对象都向一端移动,然后清理掉端边界以外的内存。
4、分代收集算法:根据各个年龄代的特点选择合适的收集算法。在新生代中,每次垃圾收集都有大量的对象死去,因此采用复制算法。老年代中,因为对象的存活率高,没有额外的空间对他进行担保,因此使用“标记-清除”和“标记-整理”算法。
内存分配机制:
1、对象优先在Eden分配:当Eden没有足够的空间进行分配时,虚拟机将发起一次Minor GC。
2、大对象直接进入老年代:避免Eden区及两个Survivor区之间发生大量的内存复制。
3、长期存活的对象将进入老年代:对象在Eden区出生,并经过一次Minor GC后仍存活,年龄加1,若年龄超过阈值(默认15),则被晋升到老年代。
4、动态年龄判断:Survivor空间中相同年龄所有对象大小大于Survivor空间的一半,年龄大于或等于该年龄的对象直接进入老年代。
5、空间分配担保:Minor GC前,虚拟机会检查老年代最大可用连续空间是否大于新生代所有对象总空间,若成立,则Minor GC是安全的。若不成立,则检查是否允许担保失败,如果允许,检查老年代最大可用连续空间是否大于历次晋升到老年代的平均大小,大于,则尝试进行Minor GC;如果小于或者不允许冒险,则Full GC。
补充说明:HotSpot虚拟机把年轻代分成三部分:一个Eden区和两个Survivor区(即From区和To区),比例为8:1:1。在GC开始的时候,对象会存在Eden和From区,To区是空的,进行GC时,Eden区存活的对象会被复制到To区,From区存活的对象会根据年龄值决定去向,阈值达到一定值的对象会被移动到老年代中,没有达到阈值的对象会被复制到To。这时Eden区和From区已经被清空了。接下来From区和To区交换角色,以保证To区在GC开始时是空的。Minor GC会一直重复这样的过程,直到To区被填满,To被填满之后,会将所有对象移动到老年代中。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2