JVM-深入3

JDK8默认par收集器
垃圾收集器:
1.serial:单线程的收集器(复制算法)
在这里插入图片描述

2.serial Old:serial老年代版本(标记整理算法)
在这里插入图片描述

为什么会是单线程?
Java刚开始的时候是用于嵌入式设备编写,如单片机,且CPU当时也只有单核,没有考虑到多线程的情况。

3.parNew:serial多线程版本,还是会STW,有停顿时间 此收集器关注:停顿时间
在这里插入图片描述

停顿时间吞吐量 = 业务代码的时间/(业务代码的时间+垃圾收集的时间) = 99%
4.Parallel Scavenge:复制算法 并行 此收集器关注:吞吐量
5. Parallel Old:多线程+标记整理算法 Parallel Scavenge的老年代版本
6. 并发类的收集器CMS 标记清除 缺点:产生空间碎片 优点:并发
在这里插入图片描述
什么是并发?什么是并行?
并发:单位时间内,能承受多少用户,能完成多少业务。关注最终执行状态。
并行:如上图,多个垃圾收集器并行执行。关注执行过程。

如上图,
初始标记,找Gcroot,依赖产生变化后,
重新标记实际为增量标记,标记出并发标记后产生的垃圾对象,最好再去清理,用时较短。

CMS回收过程什么时候cpu停顿?
在初始标记和重新标记时进行STW

CMS缺点详解:
1.CMS回收器采用的基础算法是Mark-Sweep。所有CMS不会整理、压缩堆空间。这样就会有一个问题:经过CMS收集的堆会产生空间碎片。 CMS不对堆空间整理压缩节约了垃圾回收的停顿时间,但也带来的堆空间的浪费。为了解决堆空间浪费问题,CMS回收器不再采用简单的指针指向一块可用堆空 间来为下次对象分配使用。而是把一些未分配的空间汇总成一个列表,当JVM分配对象空间的时候,会搜索这个列表找到足够大的空间来hold住这个对象。
2.需要更多的CPU资源。从上面的图可以看到,为了让应用程序不停顿,CMS线程和应用程序线程并发执行,这样就需要有更多的CPU,单纯靠线程切 换是不靠谱的。并且,重新标记阶段,为空保证STW快速完成,也要用到更多的甚至所有的CPU资源。当然,多核多CPU也是未来的趋势!
3.CMS的另一个缺点是它需要更大的堆空间。因为CMS标记阶段应用程序的线程还是在执行的,那么就会有堆空间继续分配的情况,为了保证在CMS回 收完堆之前还有空间分配给正在运行的应用程序,必须预留一部分空间。也就是说,CMS不会在老年代满的时候才开始收集。相反,它会尝试更早的开始收集,已 避免上面提到的情况:在回收完成之前,堆没有足够空间分配!默认当老年代使用68%的时候,CMS就开始行动了。 – XX:CMSInitiatingOccupancyFraction =n 来设置这个阀值。

总得来说,CMS回收器减少了回收的停顿时间,但是降低了堆空间的利用率。

什么时候使用CMS?
如果你的应用程序对停顿比较敏感,并且在应用程序运行的时候可以提供更大的内存和更多的CPU(也就是硬件牛逼),那么使用CMS来收集会给你带来好处。还有,如果在JVM中,有相对较多存活时间较长的对象(老年代比较大)会更适合使用CMS。

面试细节:为什么初始标记为单线程? 重新标记为多线程?
初始标记很快,没有必要额外开线程去进行标记,有可能开线程的开销比标记的开销更大。
并发标记,要缩短停顿时间
重新标记,因为并发标记时已经创建了线程,直接用就行,开销小
7. G1(Garbage-First)增量回收算法 :CMS停顿时间变得更短 短到开发者可以自己定义 解决我们空间碎片的问题
JDK1.8推荐使用 JDK1.9默认使用
官方文档https://docs.oracle.com/javase/8/docs/technotes/guides/vm/G1.html#use_cases
例:如回收一次垃圾200s,用户设置150s,那将如何实现?
标记垃圾优先级,按垃圾优先级进行GC(偷工减料)
在这里插入图片描述

G1何时使用(6GB内存)?
1.超过 50% 的 Java 堆占用了实时数据。
2.对象分配率或提升率差异很大。
3.不需要长时间的垃圾回收或压实暂停(超过 0.5 到 1 秒)

将 G1 与 CMS 进行比较:
存在使 G1 成为更好解决方案的差异。一个区别是G1是一个压实收集器。G1 的压缩足以完全避免使用细粒度的免费列表进行分配,而是依赖于区域。这大大简化了收集器的部分,并主要消除了潜在的碎片问题。此外,G1 提供比 CMS 收集器更可预测的垃圾回收暂停,并允许用户指定所需的暂停目标。

CMS主要集中在老年代的回收,而G1集中在分代回收,包括了年轻代的YoungGC以及老年代的MixGC;
G1使用了Region方式对堆内存进行了划分,且基于标记整理算法实现,整体减少了垃圾碎片的产生;
在初始化标记阶段,搜索可达对象使用到的Card Table,其实现方式不一样。

8.Region 逻辑上存在Eden和Old 可以相互转换
9.zgc JDK11 z->zero 且必须在liunx64位下使用 停顿时间控制在10ms以内
在这里插入图片描述

垃圾收集器分类,见图

JVM参数
标准参数:不会随着我们JDK的版本变化而变化

非标准参数:随着我们的JDK的版本变化而变化

-X
-XX
Boolean
XX[+/-] + value -XX+UseG1GC
name -value -XX:initiaHeapSize -100M -XX:MaxHeapSize=100M

设置参数的场景

  1. 开发工具里面
  2. 运行Java类里
  3. 中间件 配置文件
  4. 实时去改 jinfo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值