7

我真的很困惑:在我的 windows 2008r2 中,我有一个 windows 服务,实际上它是以SYSTEM用户身份运行的 java 进程。现在,我直接使用Jstack来提供服务。但它发生错误:

 insufficient memory or insufficient privilege to attach

但是如果我使用 Jstack 的选项-F,它可以正常工作。我查看了jdk的源码,上面使用了一个BugSpotAgent类来完成。

我想知道我不能原始使用Jstack的根本原因,是SYSTEM用户权限问题吗?我也尝试使用PsExec.exe(一个工具)来运行我的Jstack原始(这意味着我将使用SYSTEM用户来运行Jstack),但它仍然无法工作。

你能帮助我吗?

感谢和问候!

4

1 回答 1

5

jstack只能锁定同一用户同一会话中启动的进程。如果未指定会话,psexec命令会锁定到控制台会话并在尝试获取线程转储时抛出此错误。

解决方案是确保使用psexec的用户和会话与用于目标 java 进程的用户和会话相同。

如果它是由普通用户启动的,a。在没有 -s 或 -h 标志的情况下使用相同的用户凭据登录 b。查找启动进程的会话 ID。(您可以使用任务管理器并转到选项卡用户找到它)。将此会话 ID 与标志 -i 一起使用

psexec \\server-name -u username -p password -i session-id command

例如

psexec \\192.168.1.1 -u john -p pass123 -i 1 jstack.exe 4242

注意:如果 java 进程已由 SYSTEM 用户启动,请使用标志 -s

于 2014-07-16T15:57:17.233 回答