在生产 Java 服务器中打开 GC 日志记录是常见的做法吗?

2022-09-02 00:31:00

我看到在一些地方[1]人们在生产服务器(关键任务)中启动GC日志记录,例如

java -server -Xms1024m -Xmx1024m -XX:NewSize=256m \
     -XX:MaxNewSize=256m \
     -XX:+UseConcMarkSweepGC \
     -XX:CMSInitiatingOccupancyFraction=70
     -XX:+PrintGCDetails \
     -XX:+PrintGCDateStamps \
     -XX:+PrintTenuringDistribution \
     -Xloggc:logs/gc.log \
     -Djava.awt.headless=true
     -Dcom.sun.management.jmxremote -classpath ...

现在是否推荐生产环境中的做法?

更新:我添加了一个链接[2],来自Oracle也建议在生产服务器上监视GC。

来源:

[1] https://serverfault.com/questions/121490/java-opts-xxprintgcdetails-affect-on-performance

[2] http://docs.oracle.com/cd/E24290_01/coh.371/e22838/deploy_checklist.htm#CHHFADDF


答案 1

是的,这是一种常见的做法。这通常是强烈推荐的,我在下面给出了例子和参考。

为什么 GC 日志记录适用于生产 Java 服务器:

  1. 最小开销 - GC 日志记录对整体系统性能的开销最小

    • 例如,前JVM性能架构师Charlie Hunt和Java Performance一书的合著者就声称了这一点。
    • 运行 Java Enterprise 软件的所有世界纪录 SPEC 基准测试都运行启用了 GC 日志记录的生产服务器。这证实了日志记录的开销较低,并且日志记录路径由发布基准测试结果的性能专家进行了高度调整。
  2. 长期日志记录对于分析应用程序性能绝对至关重要。必须始终启用 GC 日志记录,以便管理员能够观察 GC 行为并相应地调整应用程序。


答案 2

当然不是。

仅当存在无法在 QA 系统上重现的问题时,才会以这种方式加载 prod 服务器。即使这样,也只是在短时间内收集数据,然后返回正常的“精益”模式。