阅读 227

JVM垃圾回收算法总结(jvm回收机制的三大算法)

一.GC算法

1.对象存活判断算法

引用计数算法和可达性分析算法

2. 判断对象是否存活

①.第一次标记:可达性分析算法中不可达的对象,被标记和筛选,筛选条件是此对象有必要执行finalize()方法,当未重写finalize()或方法已被执行过,则没必要执行

②.第二次标记:如果有必要执行finalize,此对象会被放在F-Queue中,由Finalizer线程执行。GC将在queue中第二次标记只要重新与引用链上的任一对象建立关联即可,例如把自己(this)赋值给某个类变量或者对成员变量,建立起引用即可。

③.需要注意的是,任一对象的finalize()只能被系统调用一次

3.垃圾收集算法

标记清除算法

标记所有需要回收的对象,完成后统一回收。效率低,会产生大量不连续的内存碎片

复制算法

内存一分为二,只用其中一块,此块用完后,将存活对象复制到另一块上,再将此块清理

标记-整理算法

标记后让存活的对象都向一端移动,清除端边界外的部分内存

分代收集算法

划分新生代和老年代。新生代每次都会都大量对象死去,就用复制算法;老年代对象存活率高,没有额外空间作为分配担保,就用标记算法

二.GC类型和参数

GC类型

JVM的gc类型主要有三种,新生代gc、老年代gc,和堆gc。

  1. Minor GC:新生代(Young)GC,无法为一个新的对象分配空间时会触发 ,所以此GC回收速度较快

  2. Major GC:老年代(Old)GC,经常会伴随至少一次的Minor GC,一般会比Minor慢10倍

  3. Full GC:堆空间GC,年老代满时会引发Full GC,Full GC将会同时回收年轻代、年老代永久代满时也会引发Full GC,会导致Class、Method元信息的卸载

Full GC触发条件:当system.gc()被显示调用,或者老年代的堆内存满时、

新生代的GC过程

在程序的运行过程中,Minor GC次数是最多的,通过jstat命令可以查看到。Young GC的过程如下;

  1. 当Eden满的时候第一次Minor GC,存活对象移动到S0,Eden清空

  2. Eden再满,触发GC,Eden和S0中的对象通过复制送入S1,S0和Eden清空

  3. 触发GC时,S1和S0互换角色,一对象被复制16次,将被送入老年代

  4. 两个survivor避免内存的碎片化,减少了老年代的GC、减少触发Full GC

gc启动参数

在启动时,我们需要添加jvm的启动参数,这样才能打印出我们想要看到的gc信息,常用于JVM问题的排查和优化。

  1. -verbose:gc:查看垃圾收集的过程

  2. -verbose:gc  -Xloggc:$CATALINA_HOME/logs/gc.log:指定gc的目录和文件名

  3. -XX:+PrintGCTimeStamps  -XX:+PrintGCDetails:设置GC日志格式

  4. -XX:+PrintCommandLineFlags:查看虚拟机默认参数

新老代比例

通常,新生代、老年代和survivor区域的比例不需要进行设置,使用默认值即可。

默认值如下:

  1. –XX:NewRatio=2:新生代和老年代比例为1 : 2

  2. –XX:SurvivorRatio=8:意味着Eden:s1:s2 = 8:1:1


作者:叫我阿柒啊
链接:https://juejin.cn/post/7031830736500064263


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐