首页 > 其他 > 详细

JVM垃圾收集汇总

时间:2020-08-18 22:56:25      阅读:82      评论:0      收藏:0      [点我收藏+]

总结下自己掌握的关于JVM垃圾回收相关的知识点~

1. 什么样的对象为垃圾?

引用计数法

无法解决循环依赖问题

可达性分析法

从一些roots对象出发,沿着roots对象追踪对象上的引用,能追踪到的对象都是存活的对象;没有被roots对象引用的视为垃圾对象。
可以作为GC Roots的对象有:

  • 虚拟机栈中引用的对象
    常见的就是:Object obj = new Object();
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中JNI引用的对象

2. 垃圾收集算法

标记-清除

标记出所有需要回收的对象,标记完成后回收被标记的对象。
有两个缺点:

  1. 会产生内存碎片,内存碎片太多可能会导致无法分配较大的对象(需要连续的内存空间)
  2. 标记和清除效率不高

复制

内存1分为2,每次只使用其中的1半。当其中的一块空间用完了,就将还存活着的对象复制到另外一块内存空间上,然后把已使用的那一块空间一次清理掉
有2个缺点:

  1. 内存空间浪费,因为每次只使用一半
  2. 存活对象较多时,进行较多的对象复制,效率下降

标记-整理

标记过程仍与“标记-清除”算法一样,但是后续不是直接对可回收对象进行清理。而是让存活的对象都向一端移动,最后清楚掉端边界以外的内存。

3. JVM堆的分代

根据相关实验(?....?), 很多对象存活时间都是很短的, 少部分的对象存活时间会稍长一些,根据这些特性吧,JVM将堆化分为新生代老年代
技术分享图片
相关参数配置:

堆的大小: -Xms4G -Xmx4G
新生代和老年代比例:默认1:2,
新生代和survior比例默认: 8:1:1

4. 垃圾回收器的分类

4.1 工作在Young区的垃圾收集器

名称 介绍 采用的算法 STW
Serial 线程收集年轻代 复制算法 STW
ParNew 多线程收集年轻代 复制算法 STW
Parallel Scavenge 吞吐量优先的多线程收集年轻代 复制算法 STW

4.2 工作在Old区的垃圾收集器

名称 介绍 采用的算法 STW
Serial Old 单线程收集Old区 标记-整理 STW
Parallel Old 多线程收集Old区 标记-整理 STW
CMS 并发标记清除收集Old区 复制算法 和用户线程并行

4.3 YoungGC、MajorGC、MixedGC、FullGC

  • YoungGC:发生在年轻代的GC
  • MajorGC:发生在老年代的GC ,只有CMS
  • MixedGC: 发生在年轻代和老年代的GC, 只有G1
  • FullGC指的是:年轻代+老年代+方法区(元空间/永久代) 整个堆上进行垃圾收集
    当Eden区分配满的时候,发现之前younggc的平均晋升对象的大小超过当前Old区的剩余空间时,则不会触发Younggc了而会触发FullGC(除CMS外[只收集old区],其他能收集old区的垃圾收集器都会收集整个堆)。所以不需要额外触发一次YoungGC,如果触发了YoungGC,可以理解为了减轻fullgc的压力吧。

参考这篇文章:Major GC和Full GC的区别是什么?

4.4 G1-垃圾优先收集器

G1收集器不区分新生代和老年代,统一用标记整理算法收集2个分代的垃圾。

JVM垃圾收集汇总

原文:https://www.cnblogs.com/yangweiqiang/p/13525862.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!