当前位置: 首页 > 知识库问答 >
问题:

正在运行jmap无法打开套接字文件

花飞尘
2023-03-14

我必须运行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 ...
  1. 使用-F可以进行堆转储吗

共有3个答案

邵旺
2023-03-14

如果您的应用程序是以system d服务运行的。您应该在/usr/lib/stemd/system/下打开服务文件,并以您的服务名称命名。然后检查Private ateTmp属性是否为真。

如果为true,则应将其更改为false,然后按如下命令刷新服务:systemctl daemon reload systemctl restart[servicename]如果要在重新启动前运行jmap/jcmd,可以使用服务文件中的execStop脚本。只需将命令放入其中并执行systemctl stop[service name]

佘单鹗
2023-03-14

我刚刚发现jmap(在使用jmap生成堆转储时,可能还有jVisual alvm)强制运行jmap的用户必须是运行试图被转储的进程的同一用户。

在我的例子中,我想要一个堆转储的jvm是由linux用户"jboss"运行的。

sudo -u jboss jmap -dump:file.bin <pid>
戴化
2023-03-14

jmapvs.jmap-F,以及jstackvs.jstack-F使用完全不同的机制与目标JVM通信。

在没有-F的情况下运行时,这些工具使用动态连接机制。其工作原理如下。

>

  • 在连接到Java进程1234之前,jmap创建一个文件。将_pid1234附加到目标进程的工作目录或/tmp上。

    然后jmap向目标进程发送SIGQUIT。当JVM捕捉到信号并找到时。attach_pid1234,它启动AttachListener线程。

    AttachListener线程创建UNIX域套接字/tmp/。java_pid1234来监听来自外部工具的命令。

    出于安全原因,当接受连接(来自jmap)时,JVM会验证套接字对等方的凭据是否等于JVM进程的euidegid。这就是为什么jmap如果由不同的用户(甚至是root用户)运行将不起作用。

    jmap连接到套接字,并发送dumpheap命令。

    这个命令由JVM的AttachListener线程读取和执行。所有的输出都被送回插座。由于堆转储是由JVM直接在进程中进行的,因此操作非常快。然而,JVM只能在安全点上这样做。如果无法达到安全点(例如进程挂起、没有响应或长GC正在进行),jmap将超时并失败。

    让我们总结一下动态附加的优点和缺点。

    专业人士。

    • 堆转储和其他操作由JVM以最大速度协同运行
    • 您可以使用任何版本的jmapjstack连接到任何其他版本的JVM

    欺骗。

    • 该工具应该由与目标JVM相同的用户(euid/egid)运行。
    • 只能在正常运行的JVM上使用。
    • 如果目标JVM以-XX: Disableattach机制启动,则无法工作。

    当使用-F运行时,工具会切换到具有HotSpot Servability Agent功能的特殊模式。在这种模式下,目标进程被冻结;这些工具通过操作系统调试工具读取内存,即Linux上的ptrace

    >

  • jmap-F在目标JVM上调用PTRACE_ATTACH,响应SIGSTOP信号,目标进程无条件暂停。

    该工具使用PTRACE_PEEKDATA读取JVM内存ptrace一次只能读取一个字,因此需要太多调用才能读取目标进程的大堆。这是非常非常缓慢的。

    该工具根据特定JVM版本的知识重构JVM内部结构。由于不同版本的JVM具有不同的内存布局,因此只有当jmap来自与目标Java进程相同的JDK时,-F模式才起作用。

    该工具会自行创建堆转储,然后继续目标进程。

    专业人士。

    • 不需要目标JVM的合作。甚至可以在挂起的过程中使用
    • 只要操作系统级别的权限足够,ptrace就可以工作。例如,root可以转储所有其他用户的进程

    欺骗。

    • 对于大堆,速度非常慢

    注意事项

    有一种更快的方法可以在强制模式下进行堆转储。首先,使用gcore创建一个coredump,然后在生成的核心文件上运行jmap。参见相关问题。

  •  类似资料:
    • 问题内容: 我必须运行才能进行进程的堆转储。但返回: 所以我用了: 使用 可以进行堆转储吗? 我正在等待20分钟,尚未完成。有什么想法吗? 问题答案: vs. 以及vs. 使用完全不同的机制与目标JVM通信。 jmap / jstack 在没有这些工具的情况下运行时,请使用动态附加机制。其工作原理如下。 连接到Java进程1234之前,请在目标进程的工作目录或处创建一个文件。 然后发送到目标进程。

    • 问题内容: 我必须运行才能进行进程的堆转储。但返回: 所以我用了: 使用 可以进行堆转储吗? 我正在等待20分钟,尚未完成。有什么想法吗? 问题答案: jmapvs. jmap -F以及jstackvs. jstack -F使用完全不同的机制与目标JVM通信。 jmap / jstack 在没有这些工具的情况下运行时,请使用动态附加机制。其工作原理如下。 连接到进程1234之前,请在目标进程的工作

    • 问题内容: 我正在尝试在Python中建立安全的套接字连接,而使用SSL有点麻烦。我已经找到一些有关如何与SSL建立连接的代码示例,但它们都涉及密钥文件。我尝试连接的服务器不需要接收任何密钥或证书。我的问题是,我该如何实质上包装带有SSL的python套接字连接。我知道我应该使用的密码是,协议是。这就是我一直在尝试的: 运行此代码时,没有任何错误,但响应为空。当尝试在命令行中调试此代码时,通过在终

    • 问题内容: 我们有一个应用的公开测试版,偶尔会导致堆空间溢出。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

    • 我编写了简单的服务器/客户端程序,其中客户端将一些硬编码数据以小块形式发送给服务器程序,服务器程序正在等待数据,以便将其打印到终端。在客户端,我在循环中调用send(),同时有更多的数据要发送,而在服务器上,我使用read()执行同样的操作,即返回的字节数为 如果我在完成发送后专门在客户端的套接字上调用close(),那么这个示例非常有效,但如果我不这样做,服务器将不会实际退出read()循环,直