说书人- 2023-06-08 17:02 采纳率: 66.7%
浏览 21
已结题

只有jre能dumpheap 吗

docker 的基础镜像一般都是追求越小越好,我们用的是是ibmjava,只有jre,没有jdk,但是这带来一些问题,
出现heap out of memory时,或者nonheap 暴增时,没有jdk就无从下手了,什么都看不了。
基础镜像不能改,测试环境无法重现问题,这就很尴尬。

我的目的是,能dump heap,可是实在找不到只用jre就能dump的方法。

-XX:+HeapDumpOnOutOfMemoryError 只能oom时导出,我想的是随时导出

求解

  • 写回答

1条回答 默认 最新

  • 凉亭下 2023-06-08 18:52
    关注

    在只部署JRE的情况下,确实无法直接使用jmap工具对JVM进行堆转储。但是,您可以使用Java Management Extensions(JMX)来远程调用Java Application的管理接口进行堆转储。

    具体步骤如下:

    1. 在Java应用程序中添加以下参数开启JMX:

      -Dcom.sun.management.jmxremote.port={JMX连接服务端口号} 
      -Dcom.sun.management.jmxremote.authenticate=false 
      -Dcom.sun.management.jmxremote.ssl=false
      
    2. 使用JConsole、JVisualVM等JMX客户端连接并打开应用程序的JMX管理界面。

    3. 在JMX管理界面中,可以找到"HotSpotDiagnostic" MBean,该MBean提供了名为dumpHeap的操作,可以将当前的堆转储到指定的文件中。调用该操作需要指定堆转储文件的路径作为参数。

      例如,使用JMX客户端连接应用程序并打开JMX管理界面,可以找到"HotSpotDiagnostic" MBean,然后执行以下操作:

      • 点击HotSpotDiagnostic MBean。
      • 选择dumpHeap操作。
      • 输入堆转储文件的路径,例如/tmp/heapdump.hprof
      • 单击执行按钮。
    4. 执行完dumpHeap操作后,可以在指定的堆转储文件中查看堆的详细信息,包括对象的数量、类型、大小等。

    请注意,在生产环境中执行堆转储可能会影响应用程序的性能。因此,建议在非生产环境下进行测试和调试。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 6月17日
  • 已采纳回答 6月9日
  • 修改了问题 6月8日
  • 创建了问题 6月8日

悬赏问题

  • ¥15 mmocr的训练错误,结果全为0
  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀