GC在 HotSpot VM 5.0里有四种:

~incremental (sometimes called train) low pause collector~已被废弃,不在介绍

类别 serial collector parallel collector
throughput collector )
concurrent collector
(concurrent low pause collector)
介绍

单线程收集器

使用单线程去完成所有的GC工作,没有线程间的通信,这种方式会相对高效

并行收集器

使用多线程的方式,利用CUP来提高GC的效率,主要以到达一定的吞吐量为目标

并发收集器

使用多线程的方式,利用多CPU来提高GC的效率,并发完成大部分工作,使得GC pause短

试用场景 单处理器机器且没有pause time的要求

适用于科学技术和后台处理有中大规模数据集的应用

且运行在多处理器上,关注吞吐量(throughput)

适合中规模/大规模数据集大小的应用,应用服务器,电信领域。关注response time,而不是throughput
使用 Client模式下默认
可使用
可用-XX:+UseSerialGC强制使用
优点:对server应用没什么优点
缺点:慢,不能充分发挥硬件资源

Server模式下默认

--YGC:PS FGC:Parallel MSC

可用-XX:+UseParallelGC

或-XX:+UseParallelOldGC强制指定

--ParallelGC代表FGC为Parallel MSC

--ParallelOldGC代表FGC为Parallel Compacting

优点:高效

缺点:当heap变大后,造成的暂停时间会变得比较长

可用-XX:+UseConcMarkSweepGC强制指定

优点:
对old进行回收时,对应用造成的暂停时间非常短,适合对延迟要求比较高的应用

缺点:
1.内存碎片和浮动垃圾
2.old去的内存分配效率低
3.回收的整个耗时比较长
4.和应用争抢CPU

内存回收触发

YGC
eden空间不足
FGC
old空间不足
perm空间不足
显示调用System.gc() ,

包括RMI等的定时触发

YGC
eden空间不足
FGC
old空间不足
perm空间不足
显示调用System.gc() ,包括RMI等的定时触发

YGC
eden空间不足
CMS GC
1.old Gen的使用率大的一定的比率 默认为92%
2.配置了CMSClassUnloadingEnabled,且Perm Gen的使用达到一定的比率 默认为92%
3.Hotspot自己根据估计决定是否要触法
4.在配置了ExplictGCInvokesConcurrent的情况下显示

调用了System.gc.
Full GC(Serial MSC)
promotion failed 或 concurrent Mode Failure时;

内存回收触发

时发生了什么

YGC
清空eden+from中所有no ref的对象占用的内存
将eden+from中的所有存活的对象copy到to中
在这个过程中一些对象将晋升到old中:
--to放不下的
--存活次数超过tenuring threshold的
重新计算Tenuring Threshold;
单线程做以上动作
全程暂停应用
FGC
如果配置了CollectGen0First,则先触发YGC
清空heap中no ref的对象,permgen中已经被卸载的classloader

中加载的class的信息
单线程做以上动作
全程暂停应用

YGC
同serial动作基本相同,不同点:
1.多线程处理
2.YGC的最后不仅重新计算Tenuring Threshold,还会重新调整Eden和From的大小
FGC
1.如配置了ScavengeBeforeFullGC(默认),则先触发YGC(??)
2.MSC:清空heap中的no ref对象,permgen中已经被卸载的classloader中加载的

class信息,并进行压缩
3.Compacting:清空heap中部分no ref的对象,permgen中已经被卸载的classloader中加载的

class信息,并进行部分压缩
多线程做以上动作.

YGC
同serial动作基本相同,不同点:
1.多线程处理
CMSGC:
1.old gen到达比率时只清除old gen中no ref的对象所占用的空间
2.perm gen到达比率时只清除已被清除的classloader

加载的class信息
FGC
同serial

细节参数 可用-XX:+UseSerialGC强制使用
-XX:SurvivorRatio=x,控制eden/s0/s1的大小
-XX:MaxTenuringThreshold,用于控制对象在新生代存活的最大次数
-XX:PretenureSizeThreshold=x,控制超过多大的字节的对象就在old分配.
-XX:SurvivorRatio=x,控制eden/s0/s1的大小
-XX:MaxTenuringThreshold,用于控制对象在新生代存活的最大次数

-XX:UseAdaptiveSizePolicy 去掉YGC后动态调整eden from已经tenuringthreshold的动作

-XX:ParallelGCThreads 设置并行的线程数

XX:CMSInitiatingOccupancyFraction 设置old gen使用到达多少比率时触发
-XX:CMSInitiatingPermOccupancyFraction,设置Perm Gen使用到达多少比率时触发
-XX:+UseCMSInitiatingOccupancyOnly禁止hostspot自行触发CMS GC

注:

  • throughput collector与concurrent low pause collector的区别是throughput collector只在young area使用使用多线程,而concurrent low pause collector则在tenured generation也使用多线程。

  • 根据官方文档,他们俩个需要在多CPU的情况下,才能发挥作用。在一个CPU的情况下,会不如默认的serial collector,因为线程管理需要耗费CPU资源。而在两个CPU的情况下,也提高不大。只是在更多CPU的情况下,才会有所提高。当然 concurrent low pause collector有一种模式可以在CPU较少的机器上,提供尽可能少的停顿的模式,见CMS GC Incremental mode

  • 当要使用throughput collector时,在java opt里加上-XX:+UseParallelGC,启动throughput collector收集。也可加上-XX:ParallelGCThreads=来改变线程数。还有两个参数 -XX:MaxGCPauseMillis=和 -XX:GCTimeRatio=,MaxGCPauseMillis=用来控制最大暂停时间,而-XX: GCTimeRatio可以提高GC说占CPU的比,以最大话的减小heap。

二、CMS GC Incremental mode

=============================

当要使用 concurrent low pause collector时,在java的opt里加上 -XX:+UseConcMarkSweepGC。concurrent low pause collector还有一种为CPU少的机器准备的模式,叫Incremental mode。这种模式使用一个CPU来在程序运行的过程中GC,只用很少的时间暂停程序,检查对象存活。

在Incremental mode里,每个收集过程中,会暂停两次,第二次略长。第一次用来,简单从root查询存活对象。第二次用来,详细检查存活对象。整个过程如下:


* stop all application threads; do the initial mark; resume all application threads(第一次暂停,初始话标记)* do the concurrent mark (uses one procesor for the concurrent work)(运行是标记)* do the concurrent pre-clean (uses one processor for the concurrent work)(准备清理)* stop all application threads; do the remark; resume all application threads(第二次暂停,标记,检查)* do the concurrent sweep (uses one processor for the concurrent work)(运行过程中清理)* do the concurrent reset (uses one processor for the concurrent work)(复原)

当要使用Incremental mode时,需要使用以下几个变量:


-XX:+CMSIncrementalMode default: disabled 启动i-CMS模式(must with -XX:+UseConcMarkSweepGC)-XX:+CMSIncrementalPacing default: disabled 提供自动校正功能-XX:CMSIncrementalDutyCycle=<N> default: 50 启动CMS的上线-XX:CMSIncrementalDutyCycleMin=<N> default: 10 启动CMS的下线-XX:CMSIncrementalSafetyFactor=<N> default: 10 用来计算循环次数-XX:CMSIncrementalOffset=<N> default: 0 最小循环次数(This is the percentage (0-100) by which the incremental mode duty cycle is shifted to the right within the period between minor collections.)-XX:CMSExpAvgFactor=<N> default: 25 提供一个指导收集数

SUN推荐的使用参数是:


-XX:+UseConcMarkSweepGC \-XX:+CMSIncrementalMode \-XX:+CMSIncrementalPacing \-XX:CMSIncrementalDutyCycleMin=0 \-XX:CMSIncrementalDutyCycle=10 \-XX:+PrintGC Details \-XX:+PrintGCTimeStamps \-XX:-TraceClassUnloading# 本次面试答案,以及收集到的大厂必问面试题分享:![字节跳动超高难度三面java程序员面经,大厂的面试都这么变态吗?](https://img-blog.csdnimg.cn/img_convert/8c936ac58ee51e214c00ca47a126b0a3.png)s \-XX:-TraceClassUnloading# 本次面试答案,以及收集到的大厂必问面试题分享:[外链图片转存中...(img-q0O7tWiC-1628507627209)]**[资料领取方式:戳这里即可免费下载](https://gitee.com/vip204888/java-p7)**

【JVM 2,最经典的HashMap图文详解相关推荐

  1. 最经典的HashMap图文详解,干货满满!

    前言 我们说 Kafka 是一个消息队列,其实更加确切的说:是 Broker 这个核心部件.为何这么说?你会发现我们可以通过控制台. Java 代码. C++ 代码.甚至是 Socket 向 Brok ...

  2. 大牛深入讲解!最经典的HashMap图文详解

    栈和队列部分(10) 设计一个有getMin功能的栈(士★☆☆☆) 由两个栈组成的队列(尉★★☆☆) 如何仅用递归函数和栈操作逆序一个栈(尉★★☆☆) 猫狗队列(士★☆☆☆) 用一个栈实现另一个栈的排 ...

  3. 如何将3dmax软件的界面设置成经典模式?-图文详解

    据3dmax软件的版本不同界面也会有所改变,很多朋友还是习惯于经典模式.那你知道如何将3dmax软件的界面设置成经典模式吗?本文小编将和大家分享将3dmax软件的界面设置成经典模式的方法与步骤,感兴趣 ...

  4. 面渣逆袭:Redis连环五十二问,图文详解,这下面试稳了

    大家好,我是老三,面渣逆袭系列继续,这节我们来搞定Redis--不会有人假期玩去了吧?不会吧? 基础 1.说说什么是Redis? Redis是一种基于键值对(key-value)的NoSQL数据库. ...

  5. 一文带你轻松搞懂事务隔离级别(图文详解)

    本文由 SnailClimb 和读者 BugSpeak 共同完成. 事务隔离级别(图文详解) 什么是事务? 事务是逻辑上的一组操作,要么都执行,要么都不执行. 事务最经典也经常被拿出来说例子就是转账了 ...

  6. qt on android qml,Qt on Android: Qt Quick 之 Hello World 图文详解

    在上一篇文章,<Qt on Android:QML 语言基础>中,我们介绍了 QML 语言的语法,在最后我们遗留了一些问题没有展开,这篇呢,我们就正式开始撰写 Qt Quick 程序,而那 ...

  7. Cocos2d-x win7 + vs2010 配置图文详解(亲测)

    Cocos2d-x win7 + vs2010 配置图文详解(亲测) 下载最新版的cocos2d-x.打开浏览器,输入cocos2d-x.org,然后选择Download,本教程写作时最新版本为coc ...

  8. java 一个大事务下的新增、修改、查询_一文带你轻松搞懂事务隔离级别(图文详解)...

    点击上方"linkoffer", 选择关注公众号高薪职位第一时间送达 本文由 SnailClimb 和读者 BugSpeak 共同完成. 事务隔离级别(图文详解) 什么是事务? 事 ...

  9. JDK安装和环境变量配置(Win10图文详解)

    JDK的安装和环境变量配置(Win10,图文详解) 操作系统 JDK的安装 JDK下载 系统环境变量配置 验证JDK和环境变量配置 Eclipse安装 Java小白入门项目代码参考 结语 操作系统 W ...

最新文章

  1. ViT作者、谷歌大脑研究员翟晓华:大规模视觉表征学习
  2. Linux统计文件行数
  3. 计算机网络:单播,多播
  4. jax-ws cxf_走向REST:将Tomcat嵌入Spring和JAX-RS(Apache CXF)
  5. php 设置统一处理错误,统一的PHP错误处理理论
  6. ajax实现上传文件
  7. 关于怎么获取jsp的web站点的目录问题
  8. 《高频交易》读书笔记
  9. 太赞了,Intellij IDEA竟然把Java8的数据流问题这么完美的解决掉了!
  10. mfc响应鼠标前进后退按键_诚意升级,商务大鼠再临:雷柏MT750S多模无线激光鼠标评测...
  11. 减小app大小的方法——iOS开发用ImageOptim压缩png图片
  12. 带Fn的键盘linux能用吗,实用技巧:如何更有效率的使用Linux键盘
  13. 每周论文精读04——A Survey on 3D Hand Pose Estimation: Cameras, Methods, and Datasets
  14. VueX 以及axios
  15. HTML元素 span,div,p,h,a盒子模型中padding属性的演示和理解
  16. 一文解密 Netflix 的快速事件通知系统是如何工作的
  17. 粒子寻优算法PSO学习笔记
  18. 苹果电脑系统还原出现服务器,苹果电脑恢复出厂设置【解答方法】
  19. 易协软件:workflow与BPM区别
  20. 一堂如何提高代码质量的培训课

热门文章

  1. Flutter实战一Flutter聊天应用(十一)
  2. Dart入门—库、泛型与异常
  3. c语言 strupr,C语言 strupr()用法及代码示例
  4. java语言程序设计基础篇课后答案_《Java语言程序设计:基础篇》课后复习题答案-第十五章.pdf...
  5. android弹窗不能手动关闭_Android弹窗的实现及相关bug
  6. OpenAI 发布模型实现自动定理证明,妈妈再也不用担心我的数学?
  7. 一个月面试近 20 家,拿下阿里 Offer!
  8. 稳站大屏 AIoT 时代之巅,创维 Swaiot 生态品牌实现全面布局!
  9. 简直不要太硬了!一文带你彻底理解文件系统 | 原力计划
  10. 华为百度美团驰援抗击疫情;自由软件基金会建议开源 Windows 7;印度超越美国成第二大智能手机市场 | 极客头条...