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

tro*_*sta 28 java jstack

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

Eri*_*ill 44

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

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

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


Rob*_*ola 7

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

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

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

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

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

  • 解决方案如果它作为本地系统运行:使用登录帐户使用"mstsc/admin"连接(不确定它需要具有的确切权限,我的是管理员组)并使用Sysinternals psexec工具,如下所示:psexec -s"% JAVA_HOME%\ bin\jstack.exe"PID> stack.txt其中PID是进程的进程ID.您可能还必须根据具体环境将实际路径替换为JDK. (17认同)