深入理解Java虚拟机-垃圾收集算法及收集器

1,如何判断对象是否还在被引用?

    a,引用计数算法:给对象添加一个引用计数器,当对象被引用时,计数器+1,当引用失效时,计数器-1,计数器为0时,表示对象已经不再被使用。引用计数法会因为循环引用导致对象无法被回收。

    b,可达性分析算法:通过一系列的“GC Roots”作为起始点,从这些点开始向下搜索,搜索所有走过的路称为引用链。当一个对象到GC Roots不可达时,表示该对象不再被使用,可以回收了。

2,GC Roots包括:

    a,虚拟机栈中引用的对象

    b,方法区中类静态属性引用的对象

    c,方法区中常亮引用的对象

    d,本地方法栈中JNI(Native方法)引用的对象。

3,finalize()方法:任何对象的finalize方法只会被系统自动调用一次,在对象被GC时,对象可以通过该方法自救一次,当该对象再次被GC时,虚拟机不会再次调用该方法。

4,标记-清除算法(Mark-Sweep):通过标记需要回收的对象,然后清楚被标记的对象。

    a,效率不高

    b,会产生碎片

5,复制算法(Copying):将内存分为两块,每次讲还在使用的对象复制到另一块中,然后清理掉当前快的所有内存空间。

    a,内存缩小为一半,代价优点高

    b,回收后内存没有碎片

6,HotSpot虚拟机采用复制算法,将内存分为三块,两个Survivor空间,一个Eden空间,空间比例1:1:8。新生对象在Eden区域创建,GC时将Eden中依然存活的对象和一个Survivor中的对象复制到另一个Survivor空间中去。此时浪费的空间只有10%

7,标记-整理算法(Mark-Compact):通过标记还在使用的对象,并将还在存活的对象都向一端移动,然后清理另外一端的内存。

8,分代收集算法:将Java堆划分为新生代和老年代,针对不同的年代特点采用适当的收集算法。

9,Hotspot虚拟机垃圾收集器如下,中间横线之上的部分为年轻代垃圾收集器,横线之下的为老年代垃圾收集器,如果两个垃圾收集器之间存在连线,说明它们可以搭配使用

深入理解Java虚拟机-垃圾收集算法及收集器