【问题标题】:Make Java GC logs show MB or GB instead of KB使 Java GC 日志显示 MB 或 GB 而不是 KB
【发布时间】:2016-09-21 03:15:59
【问题描述】:

默认情况下,Java GC 日志 输出以 KB(千字节)显示内存详细信息。我知道这听起来可能很傻,但鉴于我处理的大多数 Jvm 的堆大小接近 20 到 40GB,我发现快速读取 KB 中的数字非常不方便,尤其是在快速扫描 putty 等日志时。

是否可以让 Java 以 MBGB 为单位打印这些数字?

我在 JDK 文档中没有找到任何选项。

如果不可能,是否有关于如何将此功能添加到 GC 日志记录的任何想法? (不是来自外部,而是来自 JVM)

提前感谢您的帮助。

【问题讨论】:

    标签: java logging garbage-collection profiling


    【解决方案1】:

    没有运行时选项可以改变这一点,这取决于特定的垃圾收集器使用什么来打印日志数据。

    在 JDK 8 中使用 G1,它会根据堆大小以适当的单位打印:

    $ java -XX:+UseG1GC -verbose:gc
    [GC pause (Metadata GC Threshold) (young) (initial-mark) 592M->23M(100G), 0.0137879 secs]
    

    升级到 JDK 9,然后统一日志将以适当的单位打印,具体取决于堆大小,用于所有收集器(另外,时间戳也采用适当的单位):

    $ java -XX:+UseParallelGC -Xlog:gc
    [0.766s][info][gc] GC(0) Pause Young (Metadata GC Threshold) 4300M->15M(117760M) 6.765ms
    

    【讨论】:

      【解决方案2】:

      假设您的 GC 日志文件位于:(./my-app-gc.log,)
      然后使用这个在线插件来调用 API:

      curl -X POST --data-binary @./my-app-gc.log http://api.gceasy.io/analyzeGC?apiKey= --header "Content-Type:text"
      

      或者使用第三个软件[PostMan]

      本软件支持:
      ..................................................... ....
      | • - 电脑下载:here |
      | • - 浏览器下载:here |
      ..................................................... ....

      PostMan 插件输出示例:

      {
       {
       "isProblem": true,
       "problem": [
       "122 times threads were stopped for more than 5 seconds"
      ],
      "jvmHeapSize": {
      "youngGen": {
        "allocatedSize": "7.5 gb",
        "peakSize": "6 gb"
      },
      "oldGen": {
        "allocatedSize": "22.5 gb",
        "peakSize": "22.5 gb"
      },
      "metaSpace": {
        "allocatedSize": "1.04 gb",
        "peakSize": "48.52 mb"
      },
      "total": {
        "allocatedSize": "30 gb",
        "peakSize": "28.5 gb"
      }
      },
      "gcStatistics": {
      "totalCreatedBytes": "249.49 gb",
      

      这个输出为你提供了一个有用的 Json 格式的数据,以后可以使用。

      【讨论】:

      • 或者您可以直接使用计算机上的 GCViewer 应用程序,而不是将您的数据提交给第三方服务。
      【解决方案3】:

      也许您可以创建简单的 bash 程序来重新格式化您的日志?

      在我的示例中,我假设您使用的是 linux 并且路径上有 groovy。

      /usr/bin 中创建文件kb2mb,内容如下:

      #!/usr/bin/env groovy
      
      System.in.readLines().each{
        println(it.replaceAll(/\d+K/) {
          (((it[0..-2] as Integer) / 1024) as Double).round(2) + "M"
        })
      }
      

      然后授予程序执行权限:chmod +x /usr/bin/kb2mb

      终于可以这样运行了:

      cat gc.log|kb2mb
      

      示例输出:

      2015-05-26T14:45:37.987-0200: 151.126: [GC(分配失败)151.126: [DefNew: 614.37M->68.25M(614.38M), 0.0584157 秒] 1581.39M-> 12753.41M(197. M), 0.0585007 secs] [Times: user=0.06 sys=0.00, real=0.06 secs]

      您当然可以使用 bash、python 等来代替 groovy。

      【讨论】:

        【解决方案4】:

        我不熟悉这一点,但我知道您可以尝试从您的应用程序中进行 gc 日志记录。阅读 GarbageCollectorMXBeanGarbageCollectionNotificationInfoGcInfohttps://docs.oracle.com/javase/7/docs/jre/api/management/extension/com/sun/management/GcInfo.html

        【讨论】:

          猜你喜欢
          • 2014-08-28
          • 2010-09-28
          • 2012-11-12
          • 1970-01-01
          • 2012-08-02
          • 1970-01-01
          • 2018-10-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多