我真的很困惑: 在我的Windows 2008r2中,我有一个Windows服务,实际上它是一个以 SYSTEM 用户身份运行的java进程。现在,我将 Jstack 原始地用于该服务。但它出现了错误:
insufficient memory or insufficient privilege to attach
但是如果我使用Jstack的选项 -F ,它可以很好地工作。我查看了jdk的源代码,它使用了一个 BugSpotAgent 类来完成上面的工作。
我想了解根本原因我不能使用 Jstack ,是 SYSTEM 用户权限问题?我也尝试使用 PsExec.exe (一种工具)来粗略地运行我的 Jstack (这意味着我将使用 SYSTEM 用户来运行< strong> Jstack ),但它仍然无法正常工作。
你能帮助我吗?
谢谢&amp;此致!
答案 0 :(得分:5)
jstack 只能锁定同一会话中相同用户启动的流程。如果未指定会话, psexec 命令将锁定到控制台会话,并在尝试获取线程转储时抛出此错误。
解决方案是为了确保用于 psexec 的用户和会话与用于目标java进程的用户和会话相同。
如果它是由普通用户启动的, 一个。使用相同的用户凭据登录而不使用-s或-h标志 湾找到启动进程的会话ID。 (您可以使用任务管理器找到它并转到选项卡用户)。将此会话ID与标志-i
一起使用 psexec \\server-name -u username -p password -i session-id command
e.g。
psexec \\192.168.1.1 -u john -p pass123 -i 1 jstack.exe 4242
注意:如果SYSTEM用户已经启动了java进程,请使用标志-s