1.新生代的垃圾回收算法是复制算法
2.新生代内存空间不足,会触发Minor GC回收掉新生代垃圾对象
新生代内存有两块内存区域
方法一:标记整理算法-------不好的垃圾回收思路
直接对一块内存空间,回收垃圾对象,保留存活对象
问题:
内存碎片太多,会造成大量的内存浪费.很多的内存碎片无法使用.
方法二: -------合理的垃圾回收思路
复制算法:
把新生代内存划分为两块内存区域,然后只使用一块内存,待那块内存快满的时候,把里面存活的对象一次性转移到另一块内存区域中,保证没有内存碎片,接着一次性回收原来的那块内存区域中的垃圾,再次空出来一块内存区域,两块内存区域就这么重复循环使用.
缺点:
只有一半的内存可以使用,内存的使用效率低.
复制算法的优化: Eden区和Survivor区
绝大多数的对象都是周期非常短的对象,只有很少是长期存活的对象.
3.由复制算法衍生出来的新生的分区
真正的复制算法是把新生代内存对象分为三块. 1个Eden区 和2个Survivor区
Eden区占80% Survivor区占10%
这样做的好处:
只有10% 的内存空间是闲置的,90%的内存空间被使用上了.
平时使用的是一块Eden区和一块Survivor区.
Eden:Survivor=8:1
对象刚开始时分配在Eden区,Eden区快满时,触发垃圾回收.此时把Eden区中的存活对象一次性转移到一块空着的Survivor区中,接着Eden区被清空,再次分配新对象到Eden区. Eden区和一块Suivivor区中都是有对象的,其中Survivor区里存放的是上一次MinorGC后存活的对象. 如果下次Eden区满,再次触发MInor GC,就会把Eden区和放着上一次Minor GC后存活对象的Suivivor区中的存活对象,转移到另一块的Suivivor区中.
始终保持一块Survivor区是空着的,就这样一直循环使用这三块内存区域.
这样垃圾回收的性能,内存碎片的控制,内存使用的效率都非常好.