执行jmap时JVM是否停止了?

Ste*_*noS 12 java memory memory-leaks jmap

当jmap进行内存转储时,我的java应用程序是否继续运行?

Sim*_*n B 11

我有一个问题,试图在生产机器上创建hprof文件与jmap花了很长时间,并自然锁定java webapp多年.

我找到了这个页面:

http://blogs.atlassian.com/2013/03/so-you-want-your-jvms-heap/

其中解释说你也可以使用gdb(在linux系统上)来转储java进程的核心.

使用此核心文件,您可以在单独的进程中生成用于分析的hprof文件,以防止您的Java服务器进程中断这么长时间.如果您使用jmap运行相同的操作,会发生什么.

总结一下:

下载并安装gdb

apt-get update

apt-get install gdb

...

获取您感兴趣的java进程的java进程ID

jps ......

使用该进程启动gdb会话

gdb [pid] ...

然后生成核心文件:

gcore /tmp/jvm.core

结束gdb会话

分离退出

然后使用生成的核心文件来制作一个hprof文件:

sudo jmap -dump:format = b,file = jvm.hprof/usr/bin/java /tmp/jvm.core

然后(g)将文件压缩并复制到您的机器上进行进一步分析.

  • 原始文章的 WayBackMachine 快照 https://web.archive.org/web/20200810143815/https://www.atlassian.com/blog/archives/so-you-want-your-jvms-heap (2认同)

Ste*_*n C 10

您的申请已停止.获得准确堆转储的唯一实用方法是在创建转储时停止所有应用程序活动.

这是"短暂"暂停还是"长时间"暂停取决于倾倒量.如果使用"-dump",则将转储整个堆,包括无法访问的对象.如果使用"-dump:live",则只会转储可到达的对象......但这也需要(至少)标记堆以确定哪些对象可以访问.

但是如果要转储一个千兆字节大小的堆,则期望以分钟而不是秒来测量暂停时间.


建议您可以通过使用fork来避免停止JVM,但事实证明,分叉多线程进程可能会出现问题:

然后是资源使用问题.