当jmap获取其内存转储时,我的java应用程序是否继续运行?
发布于 2011-03-13 10:45:04
您的应用程序已停止。获得准确堆转储的唯一实用方法是在创建转储时停止所有应用程序活动。
这是“短暂”暂停还是“长时间”暂停取决于转储的量。如果您使用"-dump“,那么您将转储整个堆,包括无法访问的对象。如果你使用"-dump:live“,你只会转储可达的对象...但这也需要(至少)标记堆,以确定哪些对象是可访问的。
但是,如果您要转储一个in大小的堆,则预计暂停时间将以分钟而不是秒为单位。
Re建议您可以通过使用fork来避免停止JVM,事实证明,派生多线程进程可能会出现问题:
然后就是资源使用问题。
发布于 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)压缩文件并将其复制到您的机器上以供进一步分析。
发布于 2011-03-13 10:58:26
我想说的是,当内存转储被获取时,您的程序将短暂暂停。内存转储是正在运行的程序的快照,因此在读取内存时,jmap需要短暂地锁定JVM。但是,可以在单独的线程中将转储文件发送回客户端,从而最大限度地减少暂停。
https://stackoverflow.com/questions/5287010
复制相似问题