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