2011-06-09 93 views
0

使用下面的批處理文件時採取在Windows控制檯shell中運行Java服務的核心轉儲我得到這個錯誤:JDK1.6 JMAP.EXE:遠程線程失敗原因不明

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運行,重視過程,容易傾倒的核心。爲什麼從命令行不是這麼簡單?我知道JMap的linux版本有更多的選項和功能。這就是我在這裏遇到的情況:JMap的windows版本無法完成這個簡單的事情嗎?

+0

您的腳本是否與java進程具有相同的憑據? – 2011-06-09 20:14:24

+0

是的,它由同一個用戶運行。這是Windows XP,所以權限在這個意義上並不嚴格。 – djangofan 2011-06-09 20:24:30

回答

0

-XX:OnError處理程序被調用爲致命 jvm錯誤。當發生這種情況時,您可能無法啓動一個新線程來轉儲堆。 (這是JMAP做什麼。)

然而,你也許可以完成你想要的東西通過傳遞
-X:+ HeapDumpOnOutOfMemoryError-XX:HeapDumpPath = 路徑

+0

謝謝,但這並不能回答我爲什麼JMap失敗的問題。此外,該批處理文件旨在能夠關閉控制檯並通過啓動JVM備份來恢復它。所以,如果我有一個致命錯誤,我希望能夠終止進程並重新啓動JVM。 – djangofan 2011-06-10 00:06:49

+0

殺死進程應該仍然有效。 JMap的問題在於它通過向JVM中注入線程並從內部捕獲堆來工作。如果JVM處於內存不足狀態,或者內部邏輯受損,則可能無法啓動新線程。您應該能夠將上述選項與-XX:OnError組合在一起,並讓腳本重新啓動進程。 – 2011-06-10 00:31:17

+0

在這種情況下,我正在對健康的服務器JVM運行我的腳本。所以,從理論上講,JMap.exe應該沒有注入heapdump消息的問題。我現在要專注於Jmap,而不是在VM上使用-XX參數。 (請參閱我原來的問題) – djangofan 2011-06-10 01:05:05