Java教程

JVM垃圾回收算法的理解

本文主要是介绍JVM垃圾回收算法的理解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

GC判断死亡对象的算法:

  1. ​引用计数法
  2. 可达性分析算法

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

  1. 新产生的对象优先分配在Eden区,当Eden区满了放不下了,其中存活的对象会被复制到from区。
  2. 之后对象继续被分配在Eden里,当Eden再次满了,这时就会把Eden区和from区存活下来的对象复制到to区里。(如果to区也放不下,则存活下来的对象全部进入老年代。)之后回收掉Eden和from区的所有内存。
  3. 向上面这样对象会被复制很多次,默认复制了15此,就会进入老年代。当老年代满了或者存放不下即将要进入老年代存活对象的时候,就会发生一次Full G。
这篇关于JVM垃圾回收算法的理解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!