享学堂-架构师网课笔记-JVM-L4

笔记

GC

为什么要进行垃圾回收,原因很简单,就是当不断的进行新建对象时会占用空间,当空间被用光就会OOM了,像使用C或者C++是自动回收的,而JVM是进行自动垃圾回收的。而上次之所以把JVM划分出两个不同的区域,主要是方便进行垃圾回收,因为两个区的对象存活情况和使用频率不同。所以根据设计了两种垃圾回收算法。
在甲骨文公司对Java的使用情况进行了大量调查发现以下规律:
1,大量对象都是朝生夕死的。
2,越是难回收的对象越难回收。
所以根据JVM的发展垃圾回收器也随着变化

一代目 Serial/Serial Old

在这里插入图片描述

复制算法(copying)

复制算法是针对年轻代的回收算法,因为年轻代的对象被回收的几率比较大,而且量也比较多,所以采用复制回收算法,步骤如下:把内存划分成两块一模一样大小的内存区域,当新建对象时使用其中一小块就占用一格地址,当其中一半被使用完了的时候就会进行垃圾回收,过程就是先进行可达性分析,确定那些对象可以保留,然后把对象移动到另一边,原来的地方进行格式化,然后修改引用指针。
在这里插入图片描述

Appel 式回收

使用上面的算法发现这中复制回收方式有点浪费内存,因为有一般的工作内存实际上是浪费的,所以要进行再次划分,而通过数据研究发现一般来说需要回收和不需要回收的对象一般占比是8:2,所以JVM对内存区域进行了重新的划分:
分为了Eden区和From区和to区,当Eden区被全部沾满时,就会进行垃圾回收,而一般来说对象的新生代需要回收的对象一般是8:2即有大概八成的对象是需要回收的,而不需要回收的对象则被移动到From区和to区。
在这里插入图片描述

标记-清除算法(Mark-Sweep)+标记-整理算法(Mark-Compact)

在老年代中的对象很多都是不需要回收的,所以跟上面的复制算法不同,如果采用复制回收算法则会浪费很多空间去复制,所以直接采用标记回收算法,标记回收算法就是朴素无华的一种算法,直接标记后回收,但是同时会造成大量的内存碎片,所以需要再次标记整理,以便存下更大的内存对象。当整理完毕后结束并调整指针。
而Serial/Serial Old是最原始的垃圾回收器,它是单线程的,最古老的而且是安全的,但是也是最慢的,这种垃圾回收器只合适在几十兆到一百兆之间的垃圾回收,并且延时在100ms左右。
在这里插入图片描述

Parallel Scavenge(ParallerGC)/Parallel Old

ParallerGC 是jdk1.3以后采用的,它的特点是采用多线程的垃圾回收机制关注吞吐量高效的完成垃圾回收认为,这种垃圾回收机制适合后面不需要交互太多的任务。吞吐量就是=运行用户代码时间/(运行用户代码时间+垃圾回收时间),即用户运行时间用了100分钟,其中垃圾回收时间用来1min那么吞吐量就是99%。该垃圾回收器适合回收上百兆~几个G的。
JDK1.8 默认就是以下组合
-XX:+UseParallelGC 新生代使用 Parallel Scavenge,老年代使用 Parallel Old
-XX:MaxGCPauseMillis:控制停顿时间
-XX:GCTimeRatio:控制吞吐量大小
这两个参数是控制回收的时间,但是如果你把希望停顿的时间设置小了,但其实也影响不大,例如它回收的范围会原来回收100m需要用5ms,但是它会把堆空间缩小,就是把它改成70m,从而降低回收的时间,但是它会增加回收的此时,而与此同时它的总吞吐量是不会改变的。
-XX:+UseAdaptiveSizePolicy:自动调节堆大小
-XX:GCTimeRatio: 垃圾回收占总时间的比重

Concurrent Mark Sweep (CMS)

CMS是一款专为低响应的垃圾回收器,主要运行在B/S的服务器上,主要是为了降低延时,尤其是在服务器上。它之所以能进行延时降低,主要是因为它把垃圾回收过程和用户运行并发地进行了,而把STW时间进行标记,从而降低了STW的时间。而它的回收过程如下:
初始标记:短暂暂停GC Root 中找到初始对象,时间短
并发标记:与用户线程同时运行,从GC Root中的初始对象向下寻找关联的对象,这个时间比较长,但是是用户线程和并发标记同时运行
重新标记:修正并发标记的产生对象,进行重新标记(短暂)
并发清除:把之前标记的对象回收,这过程时间较长,但是跟用户线程一起
在这里插入图片描述
这个CMS虽然停顿时间短,但是它存在以下缺点:
CPU敏感:因为它是多线程而且是4线程,对CPU核心要求高,4核以上
浮动垃圾:因为在业务线程的运行过程中,垃圾会产生在标记后,所以有些垃圾回收不及时
会产生空间碎片:因为它的回收没有整理步骤,所以会产生空间不连续,而垃圾整理是需要移动指针,所以要STW,时间会大幅度增长。一般来说这个算法问题比较多,不是默认回收算法。

Garbage First(G1)

G1这种算法把内存分成好几块,其中标记出类型有Eden区和Survivor,old,Humongous。而不是连续的空间所以大空间对象也可以放在一块。
在这里插入图片描述
而G1的运行步骤分为了以下几步
初始标记:初始标记,修改TAMS 指针的值,让下一阶段用户线程并发运行时,能正确的在可用的region中分配对象,这个过程需要停顿。
在这里插入图片描述
序下节课。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值