如何识别和监控"阻止世界" Java第三方垃圾收集/内存泄漏" blackbox"宁静的申请

时间:2017-06-04 21:12:30

标签: java rest memory-leaks garbage-collection openjdk

我被赋予了一个有趣的任务,即确定在第三方"黑盒子"中停止世界垃圾收集/内存泄漏。宁静的应用,正在生产中。

应用程序是负载平衡的,最近,应用程序在所有服务器实例上都有一个停止世界的垃圾收集,这导致生产服务中断。

我(我们)无法访问第三方代码。

这是我到目前为止所做的:

  1. 我一直在确保JVM命令行参数是正确的。容器是Jetty,OpenJdk 8,带有CMS垃圾收集器。
  2. 我已经成功使用VisualVM,内存池和Visual GC插件来分析应用程序(启用-verbosegc)。
  3. 我的目的是查看我们在生产中获得的流量(对于每个API端点),并运行浸泡测试。我将增加测试负载,目的是阻止世界GC发生。
  4. 没有特定的内存异常,"只是"一个停止世界,应用程序线程被暂停。 5-10分钟后,应用程序再次开始接受请求(负载均衡器上的502)。
  5. 我已经查看了How to find a Java Memory Leak

    我处于劣势,无法查看源代码。

    有人可以给我任何进一步的提示或策略,了解如何追踪导致世界各地的GC和内存泄漏的原因。

    以下是正在使用的JVM参数:

    java -Dcom.sun.management.jmxremote 
    -Dcom.sun.management.jmxremote.port=9010
    -Dcom.sun.management.jmxremote.local.only=true               
    -Dcom.sun.management.jmxremote.authenticate=false  
    -Dcom.sun.management.jmxremote.ssl=false
    -Xms6g -Xmx6g -XX:MetaspaceSize=2g -XX:MaxMetaspaceSize=2g
    -server -XX:+UseConcMarkSweepGC -XX:+UseParNewGC 
    -Dsun.net.client.defaultConnectTimeout=10000 
    -Dsun.net.client.defaultReadTimeout=30000
    -XX:+DisableExplicitGC -d64 -verbose:gc -Xloggc:/var/log/gc.log 
    -XX:+PrintClassHistogram -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
    -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/heapdump.hprof 
    -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled 
    -XX:+ParallelRefProcEnabled 
    -XX:+UseLargePagesInMetaspace -XX:MaxGCPauseMillis=100
    

    谢谢

    数。

0 个答案:

没有答案