JVM垃圾回收机制

发布时间 2023-05-27 14:01:04作者: 程序员_YHB

判断一个对象是否存活的方法:

(1)引用计数法:给每个对象设置一个引用计数器,对象被引用时就+1,引用失效时就-1,当对象的引用为0时,该对象就被视为垃圾对象,等待垃圾回收。但是该方法不能解决循环引用问题。例如:A引用B,B应用A。现在的虚拟机一般不用这种方法。

(2)可达性分析法:沿着GC Roots对象(根对象)的引用链向下搜索,能找到的则为存活对象,不能找到的则为垃圾对象。

可以作为GC Roots对象的有以下几种:

(1)虚拟机中引用的对象。

(2)方法区类静态属性引用的变量。

(3)方法区常量池引用的对象。

(4)本地方法栈JNI引用的对象。

垃圾回收算法:

(1)标记清除:会产生内存碎片,现在基本不用这种算法。

(2)标记复制:不会产生内存碎片,新生代GC用这种算法。

(3)标记整理:不会产生内存碎片,老年代GC用这种算法。

(4)分代回收:java虚拟机一般将内存分成新生代和老生代,在新生代中,有大量对象死去和少量对象存活,所以采用复制算法,只需要付出少量存活对象的复制成本就可以完成收集;老年代中因为对象的存活率极高,没有额外的空间对他进行分配担保,所以采用标记清理或者标记整理算法进行回收。