Oracle JDK 1.8
JDK 1.8 中有 Serial、ParNew、Parallel Scavenge、Serial Old、Parallel 0ld、CMS、G1,默认使用 Parallel Scavenge + Parallel Old。
1、 Serial 系列是单线程垃圾收集器,处理效率很高,适合小内存、客户端场景使用,使用参数-XX:+UseSerialGC 显式启用。
2、 Parallel 系列相当于并发版的 Serial,追求高吞吐量,适用于较大内存并且有多核 CPU 的环境,默认或显式使用参数-XX:+UseParalle1GC 启用。可以使用-XX:MaxGCPauseMillis 参数指定最大垃圾收集暂停毫秒数,收集器会尽量达到目标;使用-XX:GCTimeRatio 指定期望吞吐量大小,默认 99,用户代码运行时间:垃圾收集时间=99:1。
3、CMS,追求垃圾收集暂停时间尽可能短,适用于服务端较大内存且多 CPU 的应用,使用参数-XX:+UseConcMarkSweepGC 显式开启,会同时作用年轻代与老年代,但有浮动垃圾和内存碎片化的问题。
4、G1,主要面向服务端应用的垃圾收集器,适用于具有大内存的多核 CPU 的服务器,追求较小的垃圾收集暂停时间和较高的吞吐量。首创局部内存回收设计思路,采用不同策略实现分代,不再使用固定大小、固定数量的堆内存分代区域划分,而是基于 Region 内存布局,优先回收价收益最大的 Region。使用参数-XX:+UseG1GC开启。
我们生产环境使用了 G1 收集器,相关配置如下
1、-Xmx12g
2、-Xms12g
3、-XX:+UseG1GC
4、-XX:InitiatingHeap0ccupancyPercent=45
5、-XX:MaxGCPauseMillis=200
6、-XX:MetaspaceSize=256m
7、-XX:MaxMetaspaceSize=256m
8、-XX:MaxDirectMemorySize=512m
9、-XX:G1HeapRegionSize 未指定
核心思路:
1、每个内存区域设置上限,避免溢出
2、堆设置为操作系统的 70%左右,超过 8 G,首选 G1
3、根据老年代对象提升速度,调整新生代与老年代之间的内存比例
4、等过 GC 信息,针对项目敏感指标优化,比如访问延迟、吞吐量等
Was this helpful?
0 / 0