首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JVM在执行jmap时是否停止?

JVM在执行jmap时是否停止?
EN

Stack Overflow用户
提问于 2011-03-13 10:32:14
回答 3查看 15.4K关注 0票数 18

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-13 10:45:04

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

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

但是,如果您要转储一个in大小的堆,则预计暂停时间将以分钟而不是秒为单位。

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

然后就是资源使用问题。

票数 12
EN

Stack Overflow用户

发布于 2016-05-22 22:04:18

我在一台生产机器上尝试这样做时遇到了一个问题,用jmap创建hprof文件花了很长时间,并且很自然地锁定了java webapp很长时间。

我找到了这个页面:

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

它解释了您还可以使用gdb (在linux系统上)转储java进程的核心。

有了这个核心文件,您就可以生成hprof文件,以便在单独的进程中进行分析,从而防止您的java服务器进程被中断这么长时间。如果您使用jmap运行相同的操作,将会发生这种情况。

总结一下:

下载并安装gdb

apt-获取更新

apt-get安装gdb

..。

获取您感兴趣的java进程的java进程id。

jps ...

使用该进程启动gdb会话

gdb pid ...

然后生成核心文件:

gcore /tmp/jvm.core

结束gdb会话

分离退出

然后使用生成的core文件生成hprof文件:

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

然后(G)压缩文件并将其复制到您的机器上以供进一步分析。

票数 14
EN

Stack Overflow用户

发布于 2011-03-13 10:58:26

我想说的是,当内存转储被获取时,您的程序将短暂暂停。内存转储是正在运行的程序的快照,因此在读取内存时,jmap需要短暂地锁定JVM。但是,可以在单独的线程中将转储文件发送回客户端,从而最大限度地减少暂停。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5287010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档