GC要关注的事情
where/which
When
How
垃圾回收器组合
垃圾回收器组合- 新生代的垃圾回收器几乎都是复制法,90%对象朝生夕死(minor gc)Eden区
-
Serial
新生代,复制算法,单线程,简单高效,适合内存不大的情况 -
ParNew
新生代,并行多线程,Serial
的多线程版本,搭配CMS
的首选 -
Parallel Scavenge
新生代,吞吐优先,类似ParNew
,Server
级别多核机器默认方式,适用后台运算不需要太多交换的任务
吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)
垃圾收集时间=垃圾回收频率*单词回收时间
- 老年代
-
Serial Old
标记整理,单线程,Client
模式默认 -
Parallel Old
标记整理,并行,配合Parallel Scavenge
面向吞吐量的组合,使用吞吐量注重和cpu资源敏感场合 -
CMS
老年代,标记清除,并行和并发。尽可能缩短垃圾收集器时间占用,但是占用更多cpu以及内存碎片,浮动垃圾问题,注重服务器相应的场合,互联网后端主流 -
G1
新生代+老年代,并行并发,1.7
后引入,采用分区回收,基本不牺牲吞吐量的前提下完成低停顿回收,可预测停顿。目标是取代CMS(采用分块,总体是标记整理,分区间是复制)
java -XX: +PrintCommandLineFlage -version
查看jdk默认信息
指定垃圾回收器
-XX:+UseSerialGC
新生代和老年代都是穿行收集器
-XX:+UseParNewGC
新生代ParNew
老年代Serial Old
(关注停顿时间,适合用户交互)
-XX:+UseParallelGC
新生代ParallerGC
老年代Serial Old
(吞吐量,关注用户代码执行的总比例)
-XX:UseConcMarkSweepGC
新生代ParNew
老年代CMS
-XX:+UseG1GC
使用G1
其他
UseParallelGC
的参数
-XX:MaxGCPauseMills
最大停顿时间
-XX:GCTimeRatio
吞吐量的倒数,即GC占用时间占用总时间的比例
ZGC
jdk11提供,的可拓展低延迟收集器
- TB级别的堆
- GC时间不超过10ms
- 和G1相比,吞吐量降低不超过
15%
- 有色指针和内存屏障
G1
- 垃圾优先,优先清理垃圾多的区域
- 并行并发,分代收集。空间整合,整体是标记-整理,区域间是复制算法。没有空间碎片,可预测的停顿。
- 初始标记,短暂停顿,仅仅标记一些GC Roots能直达的对象,速度很快
- 根区域扫描,从新生代可以直接到达的老年代区域
--XX:MaxGCPauseMillis
指定目标最大停顿时间,G1尝试调整新生代和老年代比例,堆大小,晋升年龄
--XX:ParallerGCThreads
GC工作线程数量
内存回收和分配策略
- 对象优先进Eden区,Eden内存不足发生Minor GC
- 大对象直接进老年代,大字符串和大的数组
-
-XX:PretenureSizeThreshreshold
指定大于这个值直接进入老年代(默认0,即大对象不直接进入老年代) - 存活对象默认15岁进入老年代
--XX:MaxTenuringThreshold
指定进入老年代的年龄 - 空间分配担保,
survivor
空间不够,只要老年代连续空间大于新生代对象的总大小或历次晋升平均大小,进行Minor GC否则Full GC
新生代配置
- 新生代分为
Eden
区(80%)和survivor
区(20%分为s1s2) - 新对象存放在
Eden
,上次存活的放在s1或s2中,gc时向s1或s2中转移
--XX:NewSize/MaxSize
高优先级
--Xmn
(NewSize=MaxNewSize
)中
--XX:NewRatio
比例,低
jdk工具
-
jps
列出当前电脑运行的进程id-q
只要id-m
传入main的参数-l
列出临时文件-v
列出虚拟机启动的显示参数 -
jstat
虚拟机统计信息监控-gc id time i
每time毫秒打印一次gc信息,共i次 -
jinfo
java配置信息工具 -
jmap
内存映射 -
jstack
堆栈跟踪 -
jConsole
监控管理 -
VisualVM
多合一故障处理
网友评论