docker 的基础镜像一般都是追求越小越好,我们用的是是ibmjava,只有jre,没有jdk,但是这带来一些问题,
出现heap out of memory时,或者nonheap 暴增时,没有jdk就无从下手了,什么都看不了。
基础镜像不能改,测试环境无法重现问题,这就很尴尬。
我的目的是,能dump heap,可是实在找不到只用jre就能dump的方法。
-XX:+HeapDumpOnOutOfMemoryError 只能oom时导出,我想的是随时导出
求解
docker 的基础镜像一般都是追求越小越好,我们用的是是ibmjava,只有jre,没有jdk,但是这带来一些问题,
出现heap out of memory时,或者nonheap 暴增时,没有jdk就无从下手了,什么都看不了。
基础镜像不能改,测试环境无法重现问题,这就很尴尬。
我的目的是,能dump heap,可是实在找不到只用jre就能dump的方法。
-XX:+HeapDumpOnOutOfMemoryError 只能oom时导出,我想的是随时导出
求解
在只部署JRE的情况下,确实无法直接使用jmap工具对JVM进行堆转储。但是,您可以使用Java Management Extensions(JMX)来远程调用Java Application的管理接口进行堆转储。
具体步骤如下:
在Java应用程序中添加以下参数开启JMX:
-Dcom.sun.management.jmxremote.port={JMX连接服务端口号}
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
使用JConsole、JVisualVM等JMX客户端连接并打开应用程序的JMX管理界面。
在JMX管理界面中,可以找到"HotSpotDiagnostic" MBean,该MBean提供了名为dumpHeap的操作,可以将当前的堆转储到指定的文件中。调用该操作需要指定堆转储文件的路径作为参数。
例如,使用JMX客户端连接应用程序并打开JMX管理界面,可以找到"HotSpotDiagnostic" MBean,然后执行以下操作:
/tmp/heapdump.hprof
。执行完dumpHeap操作后,可以在指定的堆转储文件中查看堆的详细信息,包括对象的数量、类型、大小等。
请注意,在生产环境中执行堆转储可能会影响应用程序的性能。因此,建议在非生产环境下进行测试和调试。