Jstack 和没有足够的存储空间可用于处理此命令
我正在尝试在我的java应用程序上运行jstack命令。应用程序相当大,在jboss AS中运行,占用大约4gb的内存。操作系统是Windows Server 2003 Standard Edition。每次我收到错误“没有足够的存储空间可用于处理此命令”。有足够的 RAM、16gb 和磁盘空间。那么,有什么想法吗?
我正在尝试在我的java应用程序上运行jstack命令。应用程序相当大,在jboss AS中运行,占用大约4gb的内存。操作系统是Windows Server 2003 Standard Edition。每次我收到错误“没有足够的存储空间可用于处理此命令”。有足够的 RAM、16gb 和磁盘空间。那么,有什么想法吗?
我最近在Win2008r2上遇到了这个问题,并认为我会分享我的解决方案,因为它花了一段时间才弄清楚。Rob对psexec -s的评论是为我所做的。
似乎在Vista和后来的jstack上,由于用户上下文的原因,它不适用于服务。它与记忆无关。我怀疑这与人们在2003年通过远程桌面看到此问题的原因相同,除非您在mstsc上使用/admin或/console开关。从Vista开始,加强的安全性可能是破坏它的原因。
从cmd窗口启动我的应用程序工作正常,但这并不能帮助我调试我们的标准安装。启用 Java 调试端口(对于 VisualVM、Eclipse 或大多数任何 Java 调试器)需要重新启动应用,因此,如果尚未启用调试,则会丢失可能尝试捕获的状态。在我的用户凭据下启动服务不起作用 - 我对此感到有点惊讶。但是 psexec -s 从系统上下文运行 jstack,这就像一个魅力。哦,如果 UAC 处于打开状态,则需要从升高的 cmd 提示符运行 psexec。
过去,当JVM在Windows 2003上作为Windows服务运行时,我就看到了这一点。
首先,检查这是否是 TMP 目录的问题。
其次,jstack(或其他实用程序,如jconsole)不会连接到本地进程,除非它在同一会话中运行。如果服务以特定用户身份运行,则可以通过登录到同一会话进行连接。如果您使用的是远程桌面,则可以使用“mstsc /admin”(以前是/console)进行连接,然后尝试再次运行jstack。如果这不能解决问题,请务必检查以确保TMP目录设置正确。
如果服务以 LocalSystem 身份运行,则上述过程可能没有多大帮助。我不知道是否有办法登录到与LocalSystem相同的会话。
其他一些替代方法是将进程设置为远程监视,并使用jvisualvm(从服务器本身或其他计算机)通过端口进行连接并执行线程转储。