JVM垃圾回收机制
1.什么是gc ?
gc 垃圾收集回收 是对jvm的内存进行标记和回收,将内存中不再使用的对象进行回收,以便分配给新的对象使用。
2.gc回收哪里的内存?
jvm内存模型中堆区内存,分代收集主要是指堆区的内存(新生代和旧生代),但方法区(持久代)也有少部分比例。(jdk1.6后取消)
3.gc回收什么样的内存?
通过根部搜索算法, gc roots 搜索通过的路径成为引用链,当一个对象没有引用链接的时候,说明对象不可及,是需要被回收的。
4.gc操作的过程/何时回收?描述一个具体的过程
1.当试图为java对象在eden区初始化一块内存区域的时候,如果此时eden区足够,则申请结束。
2.若eden区不足,则触发一次gc操作,将存活的对象复制到s0区,并清理eden区。
3.若此时eden区和s0区不足,进行gc操作,将eden+s0区的存活的对象复制到另一个空闲空间s1,然后清理eden+s0区的内存空间。
4.当两个存活区s0和s1来回切换15次,将存活的对象复制到老年代
5.若老年代的空间不足,则major gc 采用标记整理算法清理老年代对象。
5.怎么进行回收?回收算法?—现在JVM使用的GC回收算法—-分代回收算法
a.对新生代(存活时间较短) ——采用复制算法进行回收
具体过程:所谓复制是值 eden区到 survior0 或 survior1区之间copy
把存活对象复制到一个空闲的s区
当eden区满的时候,触发gc,将存活的对象复制到s0区,此时回收eden区的内存
,当eden区再次满了的时候,触发gc,将eden和s0区存活的对象复制到另一个空闲空间s1,此时回收eden和s1区的内存,这样总会有一个空闲的空间s0/s1,作为下一次minor gc存放对象的准备空间。始终会有一个10%空闲的survivor区间,作为下一次Minor GC存放对象的准备空间。
b.对年老代(存活时间较长,而且没有备用的空闲空间)
—-采用标记-整理算法
将存活下来的对象进行标记,向一端移动,保证内存完整性,然后将最后一个活着的对象地址以后的空间全部清理。
—或采用标记-清除算法
从GC ROOTS开始,遍历堆内存区域的所有根对象,对在引用链上的对象都进行标记。存活的对象标记,不存活的进行就进行清理。