簡體   English   中英

jstack:目標進程沒有響應

[英]jstack: Target process not responding

我正在運行 Ubuntu 服務器版本,我想對 Tomcat 進行線程轉儲。

所以,我首先試圖找出tomcat使用的PID:

$ jps -l
5809 sun.tools.jps.Jps

但它不在那里?

因此,我改用top並找出了 PID 5730。

然后我調用 jstack 來獲取線程轉儲:

$ sudo jstack -l 5730
5730: 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 中的描述導出 CATALINA_TMPDIR, 並且 Jstat 停止升級到 JDK6u23,但這並沒有改變任何東西:

$ export CATALINA_TMPDIR=/tmp
$ sudo /etc/init.d/tomcat6 restart
 * Stopping Tomcat servlet engine tomcat6
   ...done.
 * Starting Tomcat servlet engine tomcat6
   ...done.
$ sudo jstack -l 5934 // new PID after restart
5934: 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

更新:

我也試過sudo -u tomcat6 jstack -l -F 5730 > threaddumpexceptions2.txt但它只在控制台上給了我大量的異常。

我通過做兩件事讓它工作:

  1. 更改調用: sudo -u tomcat6 jstack -J-d64 -m pid
  2. 用 Sun 的原始 sun-6-jdk 和 sun-6-jre 包替換了 OpenJDK

第 1 部分說明:我切換到 64 位模式,使用sudo並以 Tomcat 用戶身份運行命令。

注意:第 2 部分可能不是必需的。 對於某些用戶來說,似乎第 1 部分就足夠了。 事實上,嘗試先添加sudo命令。 它可能已經成功了。

我認為您需要以運行 Tomcat 進程的同一用戶身份運行 jstack。 還要注意 jps 只返回當前用戶的進程。 您可以通過使用 sudo 或以 Tomcat 進程用戶身份運行 jps 來獲取 Tomcat 進程的 pid。

此錯誤報告也可能有用:https ://bugs.launchpad.net/ubuntu/+source/sun-java6/+bug/597098

@Valmar,我在這里找到了相同的主題帖子。 無法獲得線程轉儲? 任何想法為什么我的應用程序阻止?

似乎解決方法是sudo -u tomcat6 kill -3 <pid>

嘗試切換到進程用戶,然后使用 jstack:

sudo -u {process user} jstack > dump

這也對我有用:

須藤 -u tomcat6 kill -3 pid

看起來什么也沒發生,但是當您查看日志時,堆棧就在那里。 如果您不期望它們,它們看起來像是例外。

我發現使用諸如 'ps -eo pid,user,command | 之類的東西很有用。 grep java' 查找正在使用的實際 java 命令,然后使用該目錄查找匹配的 jstack 等。

# ps -eo user,command | grep '[j]ava' | cut -d' ' -f1
someuser /usr/lib/jvm/java/bin/java

# /usr/lib/jvm/java/bin/java -version
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)

所以它是 64 位的,以“someuser”身份運行。 su 到該用戶並從同一目錄運行 run jstack 等。 (即。/usr/lib/jvm/java/bin/jstack

當您在具有各種不同 Java 安裝/實現的服務器上時很有用。

我遇到了同樣的問題,但以下解決方案都不適合我:

jstack <pid>
jstack -J-d64 -m <pid>
sudo -u <user> jstack ...

我終於將 JDK 從jdk1.6.0_24升級到jdk1.7.0_67並且一切正常。

對於遇到此問題的 Tomcat 用戶,請檢查您的 catalina.out 日志文件。

我遇到了同樣的問題“22693:無法打開套接字文件:目標進程沒有響應或HotSpot VM未加載”。 我放棄了,並試圖找到有關鎖定之前發生的事情的任何信息,但隨后日志文件中出現了 jstack 輸出。

對於那些在被問到這個問題六年后找到這個答案並且他們在CentOS 7 上的人,請注意 SELinux 將阻止 jmap 寫入堆轉儲,因為開箱即用,除非目錄具有tomcat_tmp_t類型,否則它將拒絕寫入套接字。

就我而言,我將堆轉儲寫在/usr/share/tomcat/.jmap下。 該目錄歸我的運行時用戶所有。

因此要允許 jmap 寫入此目錄:

semanage fcontext -a -t tomcat_tmp_t "/usr/share/tomcat/.jmap(/.*)?"
restorecon /usr/share/tomcat -vR

這允許我們以我們的 tomcat 用戶身份運行:

jmap -dump:format=b,file=/usr/share/tomcat/.jmap/tomcat-`date +%s`.bin <pid>

我的問題是,我通過終端運行了這個過程。 然后為了測試它的 jstack,我通過ctrl+z暫停了這個過程。 進程無法響應。 為了解決這個問題,我通過fg恢復了進程,並通過另一個終端檢查了它的 jstack。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM