Garbage collectors
目前的垃圾回收期比较常用的组合有下面两个:
- parallel scavenge+ parallel old
- parNew + CMS
目前 1.8默认使用的是第一个
如果老是频繁GC 的话可以考虑 换一个垃圾回收期
最常用的组合就是这些了:
- Serial + Serial Old
- ParNew + CMS
- Parallel Scavenge + Parallel Old
一些极少用的组合:
- Parallel Scavenge + Serial old
- CMS+ Serial old
cms 有一个巨大的缺陷: Concurrent mark sweep
会导致老年代的碎片化,
带压缩动作的算法,称为MSC,标记-清理-压缩,采用单线程,而如果内存过大的话,单线程去清理老年代 会非常耗费时间,整理碎片会stop-the-world.
举一些 晚上维护服务器的例子
分代算法逐步发展为不分代算法, 处理能力不断提升
Serial 算法 几十兆
Parallel 算法 几个 G
CMS 几十个G
G1 上百个 G
ZGC - Shenandoah - 4T
CMS 是 1.4版本后期引入的,是里程碑式的 GC, 它可以进行并发回收,但是问题比较多
。CMS并非没有暂停,而是用两次短暂停来替代串行标记整理算法的长暂停。目标是尽量减少应用的暂停时间。
G1 是 garbage first 的简称(优先清理垃圾最多的)
他将 堆内存分为多个 region(区域) ,垃圾多的区域优先清理
,这样就不会再分代了(使用G1就没有分代算法了)
在jdk11中,G1已经取代了CMS,是默认的垃圾收集器
G1是一款分带、增量、并行、大部分时候并发、STW并且标记整理的收集器,在每一个STW停顿的时候,它都会监控停顿时间的目标。跟其他的收集器类似,G1把堆分成逻辑上的young区和old区。内存回收主要集中在young区,在这个区域的内存回收也是非常高效的,偶尔也会发生在old区。
总结:
G1: 逻辑分代,物理部分代
ZGC: 逻辑和物理不分代
Epsilon : 调试, 确认不用 GC参与就能刚完活
下面总结一些调优的关键词:
- 吞吐量: 用户代码时间/(用户代码执行时间+垃圾回收时间)
- 响应时间: stop the world越短,响应时间越好
- oom out of memory
- 内存泄漏
- 内存溢出(内存泄漏积累,导致oom)
Hotspot 参数分类;
- 标准: -开头, 是所有 HotSpot 都支持
- 非标准 -x开头, 特定的 HotSpot 支持特定的命令
- 不稳定 -xx开头,下一个版本可能取消
调优必用参数
图形界面一般用到什么地方?测试,压测观察
线上系统,内存特大,jmap 执行期间会对进程产生很大的影响,甚至卡顿,电商系统不适合
1.设定参数 HeapDump,OOM的时候自动产生堆转存储文件;
2. 使用 mat/jhat/visualvm 进行 dump 文件分析
最好不要用 jmap,线上服务器会 stop the world造成服务器卡顿
下面是一些思考题目:
大厂真题:2019年遇到的关于JMGc的问题
1.CMS和G1的异同-百度
2.G1什么时候引发FGC-百度
3.说一个最熟悉的垃圾回收算法-百度
4.吞吐量优先和响应时间优先的回收器有哪些-百度
5.怎么判断内存泄漏-顺丰
6.讲一下CMs的流程-顺丰
7.为什么压缩指针超过32G失效-京东
8.什么是内存泄漏?GC调优有经验吗?一般出现GC问题你怎么解决?-淘宝
9. Threadlocal有没有内存泄漏问题-阿里蘑菇街
10.G1两个 Region不是连续的,而且之间还有可达的引用, 我现在要回收一个,另一个怎么处理?-阿里
11.讲一下M堆内存管理(对象分配过程)-阿里 12听说过CMS的并发预处理和并发可中断预处理吗-阿里 13到底多大的对象会被直接扔到老年代-阿里 14用一句话说明你的MM水平很牛