我必须运行jmap
才能进行进程的堆转储。但jvm
返回:
Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding
所以我用了-F
:
./jmap -F -dump:format=b,file=heap.bin 10330
Attaching to process ID 10331, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.51-b03
Dumping heap to heap.bin ...
-F
可以进行堆转储吗?jmap
vs. jmap -F
以及jstack
vs. jstack -F
使用完全不同的机制与目标JVM通信。
在没有-F
这些工具的情况下运行时,请使用动态附加机制。其工作原理如下。
连接到Java进程1234之前,请在目标进程的工作目录或处jmap
创建一个文件。.attach_pid1234``/tmp
然后jmap
发送SIGQUIT
到目标进程。当JVM捕获信号并找到时.attach_pid1234
,它将启动AttachListener
线程。
AttachListener
线程创建UNIX域html" target="_blank">套接字/tmp/.java_pid1234
以侦听来自外部工具的命令。
出于安全原因,当jmap
接受(来自)连接时,JVM会验证套接字对等方的凭据euid
与egid
JVM进程的凭据相同。这就是为什么jmap
如果由其他用户(甚至由root用户)运行将无法正常工作的原因。
jmap
连接到套接字,并发送dumpheap
命令。
该命令由AttachListener
JVM 的线程读取和执行。所有输出都发送回插座。由于堆转储是由JVM直接在进程内进行的,因此操作速度非常快。但是,JVM只能在安全点执行此操作。如果无法达到安全点(例如,进程挂起,未响应或正在进行长时间的GC),jmap
将超时并失败。
让我们总结一下动态附加的优点和缺点。
优点
jmap
或jstack
连接到任何其他版本的JVM。缺点
euid
/ egid
)运行。-XX:+DisableAttachMechanism
。使用-F
工具运行时,切换到具有HotSpot Serviceability
Agent的
特殊模式。在这种模式下,目标进程被冻结;这些工具通过操作系统调试工具(即ptrace
在Linux上)读取其内存。
jmap -F``PTRACE_ATTACH
在目标JVM上调用。响应SIGSTOP
信号无条件地暂停目标进程。
该工具使用读取JVM内存PTRACE_PEEKDATA
。ptrace
一次只能读取一个单词,因此读取目标进程的大堆需要太多调用。这非常非常慢。
该工具基于特定JVM版本的知识来重建JVM内部结构。由于不同版本的JVM具有不同的内存布局,因此-F
只有jmap
在与目标Java进程来自同一JDK的情况下,模式才有效。
该工具会自己创建堆转储,然后恢复目标进程。
优点
ptrace
只要操作系统级别的权限足够,就可以使用。例如,root
可以转储所有其他用户的进程。缺点
jmap
尝试处理所有特殊情况,但有时目标JVM可能不会处于一致状态。注意
有一种更快的方法可以在强制模式下进行堆转储。首先,使用创建一个核心转储gcore
,然后jmap
在生成的核心文件上运行。
我必须运行以便对我的进程进行堆转储。但是返回: 所以我用了: 使用可以进行堆转储吗
问题内容: 我必须运行才能进行进程的堆转储。但返回: 所以我用了: 使用 可以进行堆转储吗? 我正在等待20分钟,尚未完成。有什么想法吗? 问题答案: jmapvs. jmap -F以及jstackvs. jstack -F使用完全不同的机制与目标JVM通信。 jmap / jstack 在没有这些工具的情况下运行时,请使用动态附加机制。其工作原理如下。 连接到进程1234之前,请在目标进程的工作
问题内容: 我们有一个应用的公开测试版,偶尔会导致堆空间溢出。JVM通过休假来做出反应。 为了分析这一点,我想在内存出现故障的时候查看一下。Java不想让我这样做。该进程仍在内存中,但似乎未被视为Java进程。 有问题的服务器是Debian Lenny服务器Java 6u14 问题答案: 解决方案非常简单。我以root用户身份运行jmap,但必须以启动jvm的用户身份运行它。我现在要羞愧地隐藏我的
我有一个通过IntelliJ的Spring Boot运行配置以及< code>mvn spring-boot:run运行良好的Spring boot应用程序,但是,当我试图通过< code>mvn package打包时,当从< code > Java-jar application . jar 运行时,我得到以下错误 java.io.IOException:无法打开org . spring fra
我不熟悉symfony2,也不了解symbog。在第三章中,在尝试使用数据装置时,我尝试了以下命令: 但我得到了一个错误: 所以我在谷歌上搜索了一下,试了一下 但仍然得到同样的错误。因此,请指导如何使用wamp在symfony2中安装新的扩展或捆绑包,如数据装置。
问题内容: 我是网络编程的新手。我有兴趣通过Java服务器和C客户端之间的套接字建立网络连接并保持连接无限打开的可能吗?我想保持连接打开状态以在客户端之间交换XML数据。 问题答案: 从理论上讲,可以无限期地打开服务器套接字;但是,使用客户端套接字是不可能的。主要原因是因为客户端套接字取决于处理数据的服务器端套接字,并且服务器套接字可能会关闭连接。 尽管可以无限期地保持连接打开,但实际情况通常会确