JVM学习(一)判断对象是否可回收和回收算法
2018-08-03 本文已影响5人
lunabird
一、对象已死吗?
- 引用计数算法不能解决循环引用问题,所以java虚拟机不用这种算法判断对象是否能回收。
-
java,c#甚至古董Lisp都是通过可达性分析算法来判断对象是否存活的。
image.png - 引用,java1.2之后,将引用分为强引用,软引用,弱引用,虚引用4种。
- 即使在可达性分析算法中不可达的对象,也不是非死不可的。至少需要两次标记过程。finalize()方法是对象逃脱死亡命运的最后一次机会。
- 回收方法区(HotSpot的永久代)。废弃常量和无用的类。
二、垃圾收集算法
1.标记-清除算法
最基础,后续的算法都是基于这种思路。
不足:(1)效率不高;(2)造成内存碎片;
image.png
2、复制算法
可用内存容量分为大小相同的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另一块上面。
image.png
现代商业虚拟机都采用这种收集算法来回收新生代。
一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor。HotSpot默认的Eden和survivor比例是8:1.
如果另外一块Survivor空间没有足够的空间存放上一次新生代手机下来的存活对象时,这些对象直接通过分配担保机制进入老年代。
3、标记-整理算法
适用于老年代。
让所有存货对象都向一端移动,然后直接清理掉端边界以外的内存。
image.png
4、分代收集算法
就是给内存分成了新生代和老年代,给新生代用的复制算法,给老年代用的标记-清除或者标记-整理算法。