28

我正在尝试在我的 java 应用程序上运行 jstack 命令。应用程序比较大,运行在 jboss AS 内,占用大约 4gb 的内存。操作系统为 Windows Server 2003 标准版。每次我得到一个错误“没有足够的存储空间来处理这个命令”。有足够的内存、16gb 和磁盘空间。那么,有什么想法吗?

4

5 回答 5

44

我最近在 Win2008r2 上遇到了这个问题,我想我会分享我的解决方案,因为我花了一段时间才弄清楚。Rob 对 psexec -s 的评论对我来说是这样的。

由于用户上下文,似乎在 Vista 和更高版本的 jstack 上不适用于服务。它与记忆无关。我怀疑这与人们在 2003 年通过远程桌面看到此问题的原因相同,除非您在 mstsc 上使用 /admin 或 /console 开关。在 Vista 中,加强的安全性可能是破坏它的原因。

从 cmd 窗口启动我的应用程序运行良好,但这并不能帮助我调试我们的标准安装。启用 java 调试端口(对于 VisualVM、Eclipse 或大多数 Java 调试器)需要重新启动应用程序,因此如果您尚未启用调试,您可能会丢失您可能试图捕获的状态。在我的用户凭据下启动服务不起作用 - 我对此有点惊讶。但是 psexec -s 从系统上下文中运行 jstack,这就像一个魅力。哦,如果 UAC 处于打开状态,您需要从提升的 cmd 提示符运行 psexec。

于 2010-06-11T21:24:46.200 回答
7

过去,当 JVM 在 Windows 2003 上作为 Windows 服务运行时,我看到过这种情况。

首先,检查这是否是TMP 目录的问题

其次,jstack(或其他实用程序,如 jconsole)不会连接到本地进程,除非它在同一个会话中运行。如果服务以特定用户身份运行,您可以通过登录到同一会话进行连接。如果您使用的是远程桌面,您可以使用“mstsc /admin”(以前是 /console)连接并尝试再次运行 jstack。如果这不能解决问题,请务必检查以确保正确设置 TMP 目录。

如果服务作为 LocalSystem 运行,上述过程可能不会有太大帮助。我不知道是否有办法登录到与 LocalSystem 相同的会话。

其他一些替代方法可能是为远程监控设置进程并使用 jvisualvm(来自服务器本身或另一台机器)通过端口连接并执行线程转储。

于 2009-11-04T22:57:36.710 回答
3

我们在 Windows 机器上运行 JStack 时遇到了问题,即使是一个普通的应用程序 (1GB)。我们最终使用 Netbeans 进行了堆栈和堆分析。这似乎可以更好地处理转储文件的解析。YMMV。

尝试使用 Netbeans 进行分析 - 它非常好。请注意,VisualVM 是一个精简的 NB 分析器,并带有 6u7。

于 2009-05-25T23:01:37.643 回答
2

psexec -s jstack PID >> c:\jstack.log在同一台机器上完美运行。第一次花了一些时间,但我再次使用重定向到文件选项执行,它在几秒钟内完成。

于 2012-08-29T13:29:05.870 回答
0

这是来自底层操作系统的错误消息。除了捕获抛出的异常之外,您在代码中无能为力来处理这个问题。嘘,Windows 是如此有限。

http://technet.microsoft.com/en-us/library/cc978735.aspx

于 2010-03-05T19:01:47.020 回答