文章字数:1046,阅读全文大约需要4分钟
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
多合一故障处理