GC判断死亡对象的算法:
JVM常用的垃圾回收算法有以下几种:
1. 标记清除算法(年老代) 2. 标记复制算法(年轻代) 3. 标记整理算法(年老代) 4. 分代收集算法
在对象中添加一个引用计数器,每当一个地方引用它的时候计数器加1;引用失效的时候计数器减1。当计数器为0时候就被回收。但是存在循环引用问题,如果一个对象对另外一个对象有依赖,造成多个对象循环依赖,依赖成环,那么如果要回收A对象,就必须得释放其他引用。然而其他引用是依赖于A的,所以最后谁也无法释放。
通过GC Roots的对象作为起始点,从这些节点遍历所有引用链,如果某个对象没有GC Roots直接或间接连接,这个对象就可以被回收。
分为标记和清除两个阶段:标记出所有死亡的对象,然后把所有死亡的对象进行清除操作。
缺点是造成内存碎片,后来的大对象无法存储。造成内存使用率降低。
分为标记复制两个阶段。首先标记存活对象,完成后算法把存活对象都复制到一块新的内存空间里去,然后把原来的内存空间情况。
缺点是这个算法需要很大的内存空间,因为要整体复制。
分为标记-整理-清除阶段。首先标记存活的对象,将其整理到一边,最后把存活边界外的内存空间都清除一遍。
好处是不会产生内存碎片,但是由于整理阶段移动对象,所以需要更新对象的引用。
分代收集算法将不同内存区域划分,然后对不同性质的内存区域采取不同的以上的GC算法,使优点变大,缺点削弱。
一般情况下将堆区划分为老年代(Tenured Generation)和新生代(Young Generation),在堆区之外还有一个代就是永久代(Permanet Generation)。
在不同年代使用不同的算法,从而使用最合适的算法。
年轻代分为Eden和survivor区(from和to两块),且Eden : from : to==8:1:1