Jstack和没有足够的存储空间可用于处理此命令

时间:2009-05-25 12:52:22

标签: java jstack

我正在尝试在我的java应用程序上运行jstack命令。应用程序相当大,在jboss AS中运行占用大约4GB的内存。操作系统是Windows Server 2003标准版。每次我收到错误“没有足够的存储空间来处理此命令”。有足够的RAM,16GB和磁盘空间。那么,有什么想法吗?

5 个答案:

答案 0 :(得分:44)

我最近在Win2008r2上碰到了这个问题,并且认为我会分享我的解决方案,因为它需要一段时间来弄明白。 Rob's comment about psexec -s是为我做的。

似乎在Vista和后来的jstack因用户上下文而无法对服务起作用。它与记忆无关。我怀疑这是人们在2003年通过远程桌面看到这个问题的原因,除非你在mstsc上使用/ admin或/ console开关。从Vista开始,收紧的安全性可能就是破坏它的原因。

从cmd窗口启动我的应用程序运行正常,但这无助于我调试我们的标准安装。启用java调试端口(对于VisualVM,Eclipse或大多数Java调试器)需要重新启动应用程序,因此如果您尚未启用调试,则会丢失您可能尝试捕获的状态。在我的用户凭据下启动服务不起作用 - 我对此感到有些惊讶。但是psexec -s从系统上下文运行jstack,它就像一个魅力。哦,如果启用了UAC,你需要从高架cmd提示符运行psexec。

答案 1 :(得分:7)

过去,当JVM在Windows 2003上作为Windows服务运行时,我已经看到了这一点。

首先,检查这是否是issue with the TMP directory

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

如果服务作为LocalSystem运行,则上述过程可能无济于事。我不知道是否有办法登录与LocalSystem相同的会话。

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

答案 2 :(得分:3)

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

让Netbeans尝试分析 - 非常好。请注意,VisualVM是一个缩减NB分析器,随附6u7。

答案 3 :(得分:2)

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

答案 4 :(得分:0)

这是来自底层操作系统的错误消息。除了捕获抛出的异常之外,你的代码中除了捕获异常之外,你可以做很多事情来处理这个问题。 Boo对Windows如此有限。

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