Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding
在用jstack工具查看jvm線程的運行狀況時出現上述錯誤。就是由於該進程長時間沒有啓停,在/tmp/hsperfdata_'username'/文件夾下的該進程文件被Linux自身的機制(tmp下面不能存放不少文件)刪除,需從新啓停。因此要注意/etc/cron.daily/tmpwatch改文件在生產的狀況。不然出現內存泄漏,或者內存溢出時,很難排查,或者出現系統運行緩慢時,想要觀察系統運行狀況也沒辦法,再或者,想把現場保存至dump文件中,等待大神解決也不能作。
解決辦法:
對線上服務器的java應用dump操做時發現,如下報錯,不能dump。jps也獲取不到java進程的pid。
# jmap -dump:file=/data/dump/jvm_en.hprof 20176
20176: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding
重啓後,jps能夠得到該java進程的pid,jstack也能夠dump線程。
而tomcat:
jdk1.6.24版本下的,jps、jstack都沒法操做
jdk1.6.18版本能夠執行jps、jstack。
2、緣由分析
jvm運行時會生成一個目錄hsperfdata_$USER($USER是啓動java進程的用戶),在linux中默認是/tmp。目錄下會有些pid文件,存放jvm進程信息。
jps、jstack等工具讀取/tmp/hsperfdata_$USER下的pid文件獲取鏈接信息。
2.1jstack報錯緣由
jstack報錯:Unable to open socket file。是由於這個java進程的pid文件刪除了。
爲何會被刪除呢?這是由於linux操做系統爲了防止/tmp目錄文件過多,有個刪除管理機制:tmpwatch。
查看關鍵配置/etc/cron.daily/tmpwatch:
flags=-umc /usr/sbin/tmpwatch "$flags"
-x /tmp/.X11-unix -x /tmp/.XIM-unix \
-x /tmp/.font-unix -x /tmp/.ICE-unix
-x /tmp/.Test-unix 240 /tmp /usr/sbin/tmpwatch "$flags" 720 /var/tmp
for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?};
do if [ -d "$d" ]; then /usr/sbin/tmpwatch "$flags" -f 720 "$d" fi done
系統天天會用tmpwatch命令檢查並刪除 /tmp 下超過240小時未訪問過的文件和目錄。
2.2高版本jps、jstack不能工做緣由
這是一個從Java 6 update 21 引入的bug
sunbug 7009828,在Java 6 update 25修復。具體緣由是:
jdk16_21/24開始,jvm啓動時產生進程號的臨時文件目錄優先使用-Djava.io.tmpdir指定的目錄,沒有指定-Djava.io.tmpdir參數才使用/tmp/hsperfdata_$USER。
正好tomcat指定了-Djava.io.tmpdir=${tomcat_home}/tmp/。而jps、jstack從/tmp/hsperfdata_$USER目錄讀取不到pid信息,因此才報錯。
3、解決辦法
3.1 修改tmpwatch設置
排查對應的/tmp/hsperfdata_*的目錄,讓jvm本身來管理,保證jps,jstat等命令可用。
修改/etc/cron.daily/tmpwatch
/usr/sbin/tmpwatch "$flags" -x /tmp/hsperfdata_* -x /tmp/.X11-unix -x /tmp/.XIM-unix
-x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix 240 /tmp
3.2 修改tomcat配置或者升級jdk
1)修改tomcat的Djava.io.tmpdir參數,統一使用/tmp目錄。
修改catalina.sh添加
CATALINA_TMPDIR=/tmp
重啓tomcat
2)升級jdk到Java 6 update 25.
3.3 其餘java程序重啓
重啓java進程,從新生成pid文件。
參考URl:
一、在JDK 64bit 1.7.0_01版本也出現了這個問題。
二、在CentOS6之後,/etc/cron.daily/tmpwatch有所改變
#! /bin/sh
flags=-umc
/usr/sbin/tmpwatch "$flags" -x /tmp/.X11-unix -x /tmp/.XIM-unix \
-x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix \
-X '/tmp/hsperfdata_*' 10d /tmp
/usr/sbin/tmpwatch "$flags" 30d /var/tmp
for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do
if [ -d "$d" ]; then
/usr/sbin/tmpwatch "$flags" -f 30d "$d"
fi
done
上面紅色字體就是新加入的。
目錄/etc/cron.daily/,這個目錄是天天執行一次計劃任務的目錄,因此說,若是設置了比一天更短的清理時間,它是不起做用的。