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

2024-10-09 09:10:00
admin
原创
80
摘要:问题描述:我必须运行jmap才能对我的进程进行堆转储。但jvm返回:Unable to open socket file: target process not responding or HotSpot VM not loaded The -F option can be used when the tar...

问题描述:

我必须运行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 分钟,但还没完成。知道为什么吗?


解决方案 1:

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 会验证套接字对等方的凭据是否等于JVM 进程的凭据。这就是为什么euid如果由不同的用户(即使是 root)运行,它将不起作用的原因。egid`jmap`

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

  6. 此命令由 JVM 的线程读取和执行AttachListener。所有输出都发送回套接字。由于堆转储是由 JVM 直接在进程内进行的,因此操作非常快。但是,JVM 只能在安全点执行此操作。如果无法达到安全点(例如进程挂起、无响应或正在进行长时间的 GC),jmap将超时并失败。

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

优点。

  • 堆转储和其他操作由JVM以最大速度协同运行。

  • 您可以使用任何版本jmapjstack连接到任何其他版本的 JVM。

缺点。

  • 该工具应由与目标 JVM 相同的用户 ( euid/ )运行。egid

  • 仅可在活动且健康的 JVM 上使用。

  • 如果目标 JVM 是用 启动的,那么将不起作用-XX:+DisableAttachMechanism


jmap -F / jstack -F

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

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

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

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

  4. 该工具会自行创建堆转储,然后恢复目标进程。

优点。

  • 无需目标 JVM 的配合。即使在挂起的进程中也可以使用。

  • ptrace只要操作系统级权限足够,就可以工作。例如,root可以转储所有其他用户的进程。

缺点。

  • 对于大堆来说非常慢。

  • 该工具和目标进程应该来自同一版本的JDK。

  • 当工具以强制模式连接时,安全点无法得到保证。尽管jmap尝试处理所有特殊情况,但有时仍可能发生目标 JVM 状态不一致的情况。

笔记

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

解决方案 2:

我刚刚发现 jmap(以及在使用它来生成堆转储时的 jvisualvm)强制要求运行 jmap 的用户必须与运行试图转储的进程的用户是同一用户。

在我的例子中,我想要获取堆转储的 jvm 由 linux 用户“jboss”运行。因此,sudo jmap -dump:file.bin <pid>报告“无法打开套接字:”的位置,我能够使用以下方法获取我的堆转储:

sudo -u jboss jmap -dump:file.bin <pid>

解决方案 3:

如果您的应用程序作为 systemd 服务运行,则应打开 下的/usr/lib/systemd/system/并以您的服务名称命名的服务文件。然后检查privateTmp属性是否为真。

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

解决方案 4:

就像ben_wing所说,你可以运行:

sudo -u jboss-as jmap -dump:file.bin <pid>

(在我的情况下用户是jboss-as,但您的用户可能是jboss或其他。)

但这还不够,因为它要求我输入密码[sudo] password for ec2-user:),尽管我可以sudo使用其他命令运行而无需提示我输入密码。

我在这里找到了解决方案,我只需要先添加另一个sudo

sudo sudo -u jboss-as jmap -dump:file.bin <pid>

它也与其他命令(如jcmdjinfo)一起工作。

解决方案 5:

通常用-F 来解决。

正如消息中所述:

The -F option can be used when the target process is not responding

我遇到了完整的 GC 导致无法执行命令的情况。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用