当前位置: 首页 > 面试题库 >

Java 正在运行的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 可以进行堆转储吗?
  2. 我正在等待20分钟,尚未完成。有什么想法吗?

问题答案:

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

jmap / jstack

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

  1. 连接到Java进程1234之前,请在目标进程的工作目录或处jmap创建一个文件。.attach_pid1234/tmp
  2. 然后jmap发送SIGQUIT到目标进程。当JVM捕获信号并找到时.attach_pid1234,它将启动AttachListener线程。
  3. AttachListener线程创建UNIX域套接字/tmp/.java_pid1234以侦听来自外部工具的命令。
  4. 出于安全原因,当jmap接受(来自)连接时,JVM会验证套接字对等方的凭据euid与egidJVM进程的凭据相同。这就是为什么jmap如果由其他用户(甚至由root用户)运行将无法正常工作的原因。
  5. jmap连接到套接字,并发送dumpheap命令。
  6. 该命令由AttachListenerJVM 的线程读取和执行。所有输出都发送回插座。由于堆转储是由JVM直接在进程内进行的,因此操作速度非常快。但是,JVM只能在安全点执行此操作。如果无法达到安全点(例如,进程挂起,未响应或正在进行长时间的GC),jmap则将超时并失败。

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

优点

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

缺点

  • 该工具应由与目标JVM 相同的用户(euid/ egid)运行。
  • 只能在实时健康的JVM上使用。
  • 如果目标JVM以启动,则将无法使用-XX:+DisableAttachMechanism

jmap -F / jstack -F

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

  1. jmap -FPTRACE_ATTACH在目标JVM上调用。响应SIGSTOP信号无条件地暂停目标进程。
  2. 具使用读取JVM内存PTRACE_PEEKDATAptrace一次只能读取一个单词,因此读取目标进程的大堆需要太多调用。这非常非常慢。
  3. 该工具根据特定JVM版本的知识来重建JVM内部结构。由于不同版本的JVM具有不同的内存布局,因此-F只有jmap在与目标Java进程来自同一JDK的情况下,模式才有效。
  4. 该工具会自己创建堆转储,然后恢复目标进程。

优点

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

缺点

  • 大堆非常慢。
  • 该工具和目标进程应来自相同版本的JDK。
  • 当工具以强制模式连接时,不能保证安全点。尽管jmap尝试处理所有特殊情况,但有时目标JVM可能不会处于一致状态。
    注意

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



 类似资料:
  • 我必须运行以便对我的进程进行堆转储。但是返回: 所以我用了: 使用可以进行堆转储吗

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

  • 我有一个通过IntelliJ的Spring Boot运行配置以及< code>mvn spring-boot:run运行良好的Spring boot应用程序,但是,当我试图通过< code>mvn package打包时,当从< code > Java-jar application . jar 运行时,我得到以下错误 java.io.IOException:无法打开org . spring fra

  • 问题内容: 我想在正在运行的docker容器中执行netstat,以查看打开的TCP套接字及其状态。但是,在我的某些Docker容器上,netstat不可用。是否可以通过某些Docker API在不使用netstat的情况下获取打开的套接字(及其状态以及它们连接到的IP地址,如果有的话)的任何方法?(顺便说一句,我的容器使用docker- proxy-即不直接桥接) 我想我可以直接查看/ proc

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

  • 我转向你,在这件事上我一直把头撞在墙上。 我正在做一个小的socket编程,我可以看到当我把它放出来。println(“…”)while循环之前的代码行(in.readLine())它工作正常,但我需要它位于循环内部。 说清楚一点,我没有看到任何错误。我只是看不到此应用程序的客户端显示文本。它看起来好像在工作,但事实并非如此。此外,我也不控制该应用程序的客户端,它由通过TCP连接到此套接字侦听器应