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

2024-10-09 09:10:00
admin
原创
238
摘要:问题描述:我必须运行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 导致无法执行命令的情况。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用