程序员社区

(JVM面试题)生产环境用的什么JDK?如何配置的垃圾收集器?

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 信息,针对项目敏感指标优化,比如访问延迟、吞吐量等

Java面试题

赞(0) 打赏
未经允许不得转载:IDEA激活码 » (JVM面试题)生产环境用的什么JDK?如何配置的垃圾收集器?

一个分享Java & Python知识的社区