JVM学习(一)判断对象是否可回收和回收算法

一、对象已死吗?

  • 引用计数算法不能解决循环引用问题,所以java虚拟机不用这种算法判断对象是否能回收。
  • java,c#甚至古董Lisp都是通过可达性分析算法来判断对象是否存活的。


    JVM学习(一)判断对象是否可回收和回收算法_第1张图片
    image.png
  • 引用,java1.2之后,将引用分为强引用,软引用,弱引用,虚引用4种。
  • 即使在可达性分析算法中不可达的对象,也不是非死不可的。至少需要两次标记过程。finalize()方法是对象逃脱死亡命运的最后一次机会。
  • 回收方法区(HotSpot的永久代)。废弃常量和无用的类。

二、垃圾收集算法

1.标记-清除算法

最基础,后续的算法都是基于这种思路。
不足:(1)效率不高;(2)造成内存碎片;


JVM学习(一)判断对象是否可回收和回收算法_第2张图片
image.png

2、复制算法

可用内存容量分为大小相同的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另一块上面。


JVM学习(一)判断对象是否可回收和回收算法_第3张图片
image.png

现代商业虚拟机都采用这种收集算法来回收新生代。
一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor。HotSpot默认的Eden和survivor比例是8:1.
如果另外一块Survivor空间没有足够的空间存放上一次新生代手机下来的存活对象时,这些对象直接通过分配担保机制进入老年代。

3、标记-整理算法

适用于老年代。
让所有存货对象都向一端移动,然后直接清理掉端边界以外的内存。


JVM学习(一)判断对象是否可回收和回收算法_第4张图片
image.png

4、分代收集算法

就是给内存分成了新生代和老年代,给新生代用的复制算法,给老年代用的标记-清除或者标记-整理算法。

你可能感兴趣的:(JVM学习(一)判断对象是否可回收和回收算法)