2009-05-25 27 views
27

我想在我的Java应用程序上运行jstack命令。应用程序是相当大的,运行在占用大约4GB内存的jboss AS内部。 OS是Windows Server 2003标准版。每当我收到错误“没有足够的存储可用于处理此命令”。有足够的RAM,16GB和磁盘空间。那么,有什么想法?Jstack和没有足够的存储空间可用来处理此命令

+3

这似乎是一个Windows错误消息。 – 2009-05-25 13:19:57

+0

我把它放在一个需要280 MB的Tomcat上。 – ripper234 2009-10-25 11:50:22

+0

也看了这个问题 - http://stackoverflow.com/questions/222108/getting-the-java-thread-id-and-stack-trace-of-run-away-java-thread 它doesn'由于jconsole没有看到该应用程序,因此不起作用。 – ripper234 2009-10-25 11:52:46

回答

43

我最近就遇到了这个在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。

3

我们必须在Windows机器上运行JStack甚至适度的应用程序(1GB)的问题。我们最终使用Netbeans进行堆栈和堆分析。这似乎应对了转储文件的解析好得多。因人而异。

让Netbeans尝试进行性能分析 - 这非常好。请注意,VisualVM是一款简化的NB分析器,并附带6u7。

7

在过去,当JVM是在Windows 2003上

首先运行作为Windows服务我已经看到了这一点,请检查是否这是一个issue with the TMP directory

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

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

一些其他的替代品可能是设置过程长达进行远程监控和使用jvisualvm(从服务器本身或另一台机器)连接到端口连接了,做一个线程转储。

2

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

相关问题