【问题标题】:Is there a way to tell which GC algorithm the JVM is currently using有没有办法判断 JVM 当前使用的是哪种 GC 算法
【发布时间】:2012-02-15 18:22:09
【问题描述】:

我正在使用 Java 5,我们的自定义服务器应用程序需要 GC 调整,因为有时我们会在高峰时段遇到 15-20 秒的暂停。我们在带有 JVM 参数的服务器类机器上运行 Java 5,例如 -server -d64

有没有办法判断 JVM 当前使用的是哪种 GC 算法?

http://docs.oracle.com/javase/1.5.0/docs/guide/vm/gc-ergonomics.html

在运行服务器 VM 的服务器级机器上,垃圾收集器 (GC) 已从以前的串行收集器 (-XX:+UseSerialGC) 更改为并行收集器 (-XX:+UseParallelGC)。您可以使用 java 命令的-XX:+UseSerialGC 命令行选项覆盖此默认值。

1) 我想知道这真的发生了吗?

我的下一个问题是 我在命令行参数中添加了以下内容

-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -Xloggc:logs/gc.log

2) 除了记录 GC 日志之外,它们是否会对正在运行的 JVM 产生任何性能或行为影响?

【问题讨论】:

    标签: java garbage-collection jvm-arguments


    【解决方案1】:

    您可以使用 -XX:+PrintFlagsFinal 打印出 JVM 参数及其设置。

    java -XX:+PrintFlagsFinal -server -version

    【讨论】:

      【解决方案2】:

      您可以使用jmap -heap <jvm_pid> 打印Java 堆摘要。例如,如果我运行jmap -heap 2592,Intellij 的堆摘要如下所示:

      正在附加到进程 ID 2592,请稍候...
      已附加调试器 成功。
      检测到服务器编译器。
      JVM 版本是 25.101-b13

      在新一代中使用并行线程。
      使用线程局部 对象分配。
      并发 Mark-Sweep GC
      截断...

      您可以从输出中发现,以 2592 进程 ID 运行的 JVM 实例正在使用 CMS GC 算法。

      此外,如果算法是由那些-XX:+Use*GC 标志确定的,您可以使用jcmd <pid> VM.flags 找到它。例如:

      $ jcmd 2715 VM.flags 
      2715:
      -XX:CICompilerCount=4 -XX:InitialHeapSize=268435456
      -XX:MaxHeapSize=734003200 -XX:MaxNewSize=244318208 
      -XX:MinHeapDeltaBytes=524288 -XX:NewSize=89128960 -XX:OldSize=179306496 
      -XX:+UseCompressedClassPointers -XX:+UseCompressedOops 
      -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC 
      

      如您所见,VM 正在使用 Parallel GC

      【讨论】:

        【解决方案3】:

        您可以使用GarbageCollectorMXBeans 获取当前正在使用的 gc。

        几乎所有日志记录都会影响性能。

        【讨论】:

          【解决方案4】:

          将 Visual VM 附加到您的进程并检查 mbean。如果您以前从未使用过它(它是 Oracle JDK 下载的一部分),您可能需要安装 MBean 插件(这很简单)

          http://docs.oracle.com/javase/6/docs/technotes/guides/visualvm/

          http://visualvm.java.net/mbeans_tab.html

          【讨论】:

            【解决方案5】:

            如果 GC 成为问题,我建议您查看 Java RTS (real-time system)

            Java RTS 允许您精确控制 GC 的工作时间。这意味着您可以完全控制最坏的情况,因此可以模拟您的系统在可能的压力条件下的表现。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-05-30
              • 2017-09-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-08-08
              相关资源
              最近更新 更多