垃圾回收机制
堆分为 新生代(Young) 与 老年代(Old)
Young区 分为Eden区和两个Survivor区
新创建的对象都在Eden区,当Eden区满后会触发Minor GC,把Eden区回收后仍然存活的对象复制到其中一个空的Survivor区; 同时,另一个Survivor区中存活的对象也复制到这个Survivor中,保证总有一个Survivor区是空的
Old区
Young的Eden区满后会触发Minor GC,把Eden区回收后仍存活的对象放到Survivor区中,如果此时Survivor区仍然存不下这些存活的对象,GC收集器会把这些对象直接存放到Old区;如果在Survivor区中的对象足够老,也直接放到Old区.如果Old区也满了,则触发Full GC,回收整个堆内存
Perm区
存放的主要是类的Class对象, 垃圾回收也是由Full GC触发
垃圾回收算法
标记-清除算法
对于每个存活的对象,进行标记.标记完成,开始进行清理(未标记)不再存活的对象
缺点:产生过多碎片,导致内存不连续,分配大对象时,无法找到足够的内存触发gc,效率不是太高
复制算法
用于生存率较低的场景
把内存分为若干个区域,每次只使用其中一部分,对于存货的对象,copy到另一个区域,对于剩余的对象进行垃圾回收
缺点:造成内存浪费
优点: 无碎片
标记-整理算法
类似于标记清理,后续不是直接对对象进行清理,而是进行移动存活对象,边界外进行清除
JVM采用分代的垃圾回收算法
新生代 死的快,存活率低 采用 复制算法 Minor GC
老年代 存活长 采用标记清理 Full GC