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