JVM垃圾回收原理理解分享(二)

一、JVM内存模型

在上一章JVM难点学习与理解分享(一)中运行时数据区不同。

个人理解: 运行时数据区是大范围的,运行时的状态,是逻辑层面的,仅仅是规范。 JVM内存模型:运行时数据区逻辑视图的物理落地。
对应关系如下:
在这里插入图片描述

JVM内存模型,又细分为如下图片
该图片通过官方工具截图。想了解的朋友可以在cmd输入jvisualvm
在下载一个 com-sun-tools-visualvm-modules-visualgc.nbm插件并安装。
在这里插入图片描述
所谓的Metaspace即是元空间。 堆区包括了两大块,一个是Old区,一个是Young区
Young区分为两大块,一个是Survivor区(S0+S1),
一块是Eden区 S0和S1一样大,也可以叫FromTo

问题一、Minor/Major/Full GC是什么

Minor GC:新生代 Major GC:老年代 Full GC:新生代+老年代

问题二、为什么需要Survivor区?为什么需要两个Survivor区?

1、减少被送到老年代的对象,因为老年代会触发Full
GC非常消耗内存。经历16次GC还存活的对象,才会进入老年代,所以需要Survivor区。
2、如果没有两个Survivor区,每次GC,都会产生空间碎片,两个Survivor区恰好利用了永远有一个Survivor是空的,另一个非空的Survivor无碎片,利用一块空间换去无空间碎片,很值。

二、垃圾回收

1、如何确定一个对象是垃圾?

1引用计数法:

对于某个对象而言,只要应用程序中持有该对象的引用,就说明该对象不是垃圾,如果一个对象没有任 何指针对其引用,它就是垃圾。 弊端
:如果AB相互持有引用,导致永远不能被回收。

2可达性分析

通过GC Root的对象,开始向下寻找,看某个对象是否可达 可作为GC Root的对象:类加载器、Thread、虚拟机栈的本地变量表等
在这里插入图片描述

2、什么时候会垃圾回收

GC是由JVM自动完成的,根据JVM系统环境而定,所以时机是不确定的。
我们可以手动进行垃圾回收,比如调用System.gc()方法通知JVM进行一次垃圾回收,但是System.gc()只是通知要回收,什么时候回收由JVM决定。但是不建议手动调用该方法,因为GC消耗的资源比较大。
(1)当Eden区、S区不够用了 Minor GC
(2)老年代空间不够用了Major GC
(3)方法区空间不够用了
(4)System.gc()

3、垃圾回收算法(怎么样回收)

1.标记-清除

缺点:将内存划分为两块相等的区域,每次只使用其中一块,适用老年代。如下图所示:

标记:
在这里插入图片描述
清除:
在这里插入图片描述
2.标记-复制

缺点: 空间利用率降低,新生代的两个survior区就是利用这个算法。适用yong gc。

标记
在这里插入图片描述
复制
在这里插入图片描述

3.标记整理

标记过程仍然与"标记-清除"算法一样,但是后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。实现难度极大,效率变低。

标记
在这里插入图片描述
整理
在这里插入图片描述

4.垃圾收集器(上述算法落地)

在这里插入图片描述


1.Serial(串行)


一种单线程收集器,只会使用一个CPU或者一条收集线程去完成垃圾收集工作,在进行垃圾收集的时候需要暂停其他线程。
优点:简单高效,拥有很高的单线程收集效率
缺点:收集过程需要暂停所有线程
算法:复制算法
例图:
在这里插入图片描述


2.Serial Old(串行)


Serial Old收集器是Serial收集器的老年代版本,一个单线程收集器。
采用"标记-整理算法",运行过程和Serial收集器一样。
在这里插入图片描述


3.ParNew(并行)


个人理解:Serial收集器的多线程版本。
优点:在多CPU时,比Serial效率高。
缺点:收集过程暂停所有应用程序线程,单CPU时比Serial效率差。
算法:复制算法
例图
在这里插入图片描述


4.Parallel Scavenge(并行)


Parallel
Scavenge收集器是一个新生代收集器,它也是使用复制算法的收集器,又是并行的多线程收集器,看上去和ParNew一样,但是Parallel
Scanvenge更关注系统的吞吐量。 吞吐量=运行用户代码的时间/(运行用户代码的时间+垃圾收集时间)
-XX:MaxGCPauseMillis控制最大的垃圾收集停顿时间 -XX:GCRatio直接设置吞吐量的大小。
在这里插入图片描述


5.Parallel Old(并行)


Parallel Old收集器是Parallel Scavenge收集器的老年代版本,使用多线程和标记-整理算法进行垃圾回收,也是更加关注系统的吞吐量。


6.CMS(并发)


CMS(Concurrent Mark Sweep)收集器是一种以获取 最短回收停顿时间 为目标的收集器。
采用的是"标记-清除算法",整个过程分为4步 优点:并发收集、低停顿 缺点:产生大量空间碎片、并发阶段会降低吞吐量
在这里插入图片描述


7.G1(Garbage-First)(并发)


特點: 筛选回收(Live Data Counting and Evacuation) 对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间制定回收计划
设置Region大小:-XX:G1HeapRegionSize=M
在这里插入图片描述
注意:调优时关注 吞吐量和停顿时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值