生产环境用的什么JDK,如何配置垃圾收集器

参考答案

Oracle JDK 1.8

JDK 1.8 中有 Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1,默认使用 Parallel ScavengeParallel 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—

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧