Java jdk1.6 JMAP.EXE:远程线程因未知原因失败

Java jdk1.6 JMAP.EXE:远程线程因未知原因失败,java,jvm-crash,jmap,Java,Jvm Crash,Jmap,当使用以下批处理文件获取Windows控制台外壳中运行的Java服务的核心转储时,我遇到此错误: The parent directory name of this script is: MyDIR Install dir is: C::\InstallDIR The process id of window called MyDIR is 520 Taking core dump... please wait... C::\InstallDIR\Javasoft\bin\jmap.ex

当使用以下批处理文件获取Windows控制台外壳中运行的Java服务的核心转储时,我遇到此错误:

The parent directory name of this script is: MyDIR
Install dir is: C::\InstallDIR    
The process id of window called MyDIR is 520
Taking core dump... please wait...
C::\InstallDIR\Javasoft\bin\jmap.exe -dump:file=heap.bin 520
Dumping heap to C:\InstallDIR\MyDIR\heap.bin ...
Exception in thread "main" java.lang.InternalError: Remote thread failed for 
  unknown reason
        at sun.tools.attach.WindowsVirtualMachine.enqueue(Native Method)
        at sun.tools.attach.WindowsVirtualMachine.execute(WindowsVirtualMachine.java:78)
        at sun.tools.attach.HotSpotVirtualMachine.executeCommand(HotSpotVirtualMachine.java:195)
        at sun.tools.attach.HotSpotVirtualMachine.dumpHeap(HotSpotVirtualMachine.java:162)
        at sun.tools.jmap.JMap.dump(JMap.java:224)
        at sun.tools.jmap.JMap.main(JMap.java:122)
Press any key to continue . . .
下面是脚本-XX:OnError=script.bat:

@echo off
setlocal
set PATH=%PATH%;C:\InstallDIR\Javasoft\jre\bin\server
for /F "tokens=2,3,4,5,6,7 delims=\" %%i in ('cd') do (
  set i=%%i
  set j=%%j
  set k=%%k
  set l=%%l
  set m=%%m
  set n=%%n
)
set HOME=%i%
if not "%i%" == "" (set SITE=%i%
) else (goto end:)
if not "%j%" == "" (set SITE=%j%
) else (goto end:)
if not "%k%" == "" (set SITE=%k%
) else (goto end:)
if not "%l%" == "" (set SITE=%l%
) else (goto end:)
if not "%m%" == "" (set SITE=%m%
) else (goto end:)
if not "%n%" == "" (set SITE=%n%
) else (goto end:)
:end
echo The parent directory name of this script is: %SITE%
echo Install dir is: %HOMEDRIVE%:\%HOME%
echo.

:: kill process using window TITLE to find PID
FOR /F "tokens=2" %%I in ('TASKLIST /NH /FI "WINDOWTITLE eq %SITE%"' ) DO SET PID=%%I
ECHO The process id of window called %SITE% is %PID%
ECHO Taking core dump... please wait...
%HOMEDRIVE%\%HOME%\Javasoft\bin\jmap.exe -dump:format=b,file=heap.bin %PID%
ECHO Killing JVM %PID%...
TASKKILL /PID %PID%
:: then , restart server
.\startServer.bat    
ping -n 12 127.0.0.1>nul
if ERRORLEVEL == 0 (
  exit
) else (
  pause
)

我可以运行jconsole.exe,连接到进程并轻松转储内核。为什么从命令行执行此操作不那么容易?我知道linux版本的JMap有更多的选项和功能。这就是我在这里遇到的情况吗:windows版本的JMap无法完成这一简单的任务?

调用-XX:OnError处理程序来处理致命的jvm错误。当这种情况发生时,您可能无法启动新线程来转储堆。这就是jmap所做的

然而,你可以通过传球来完成你想要的 -X:+HEAPDUMPONAUTOFMEMORYERROR和
-XX:HeapDumpPath=path。

您的脚本是否具有与java进程相同的凭据?是的,它由相同的用户运行。这是windows xp,所以权限没有那么严格。谢谢,但这并没有回答我关于JMap失败原因的问题。此外,批处理文件意味着能够关闭控制台,并通过启动JVM备份来恢复控制台。因此,如果我有一个致命错误,我希望能够终止进程并重新启动JVM。终止进程应该仍然有效。JMap的问题是,它通过将线程注入JVM并从内部捕获堆来工作。如果JVM处于内存不足状态,或者内部逻辑受到破坏,则可能无法启动新线程。您应该能够将上述选项与-XX:OnError组合,并让脚本重新启动进程。因此,理论上,JMap.exe在注入heapdump消息时不应该出现问题。我现在想关注Jmap,而不是VM的-XX参数。查看我的原始问题,我尝试了使用和不使用调试标志。理论上,JMap.exe需要的只是进程ID,对吗?它既没有与RMI连接,也没有与JMX连接,对吗?我跟踪jmap,直到调用windows CreateRemoteThread,它在调用时要求windows运行时在目标JVM中创建一个新线程。我猜这就是它失败的地方。CreateRemoteThread上的页面可能提供以下内容: