JVMからスレッドダンプの取得方法

Liferayサポートは、特定のサードパーティ製品を他の製品よりも推奨することはありません。Liferayは、これらの製品に関するここでの指示または参照について責任を負いません。これらの原則の実装は、サブスクリプションご購入のお客様の責任です。

スレッドダンプは、ある時点でのJVM上アクティビティのスナップショットです。一つのスレッドダンプだけでは有用な情報にはなりません。アプリケーションサーバーの動作が遅い際や応答なしの際に、20〜30秒ごと、5〜10個のスレッドダンプを取得することで、最も有用なダンプを取得出来ます。複数のスレッドダンプの調査によって、どのプロセスの実行に時間が掛かっているのか、実行回数が多すぎるか判断できます。

解決策

手順 1

スレッドダンプを取得するために必要な最初の情報は、JavaプロセスのPIDです。Java JDKには、すべてのアクティブなJavaプロセスIDをリストするjpsコマンドが付属しています。このコマンドは、jps -vのように実行できます。pidとJVM引数がリストされます。これは、Liferayポータルを実行しているアプリケーションサーバーに属するPIDを識別するのに役立ちます。

出力例を次に示します。

7652 Jps -Denv.class.path=. -Dapplication.home=C:\java\jdk1.6.0_18 -Xms8m

2936 -Dexe4j.semaphoreName=c:_program files (x86)_smartsvn 6_bin_smartsvn.exe0 -Dexe4j.moduleName=C:\Program Files (x86)\SmartSVN 6\bin\smartsvn.exe -Dexe4j.tempDir=C:\Users\liferay\AppData\Local\Temp\e4j8FA1.tmp_dir20624 -Dexe4j.unextractedPosition=211749 -Dexe4j.consoleCodepage=cp0 -Dsun.java2d.noddraw=true -Xms24m -Xmx256m

4752 Bootstrap -Dfile.encoding=UTF8 -Djava.net.preferIPv4Stack=true -Dorg.apache.catalina.loader.WebappClassLoader.ENABLE_CLEAR_REFERENCES=false -Duser.timezone=GMT -Xmx1024m -XX:MaxPermSize=256m -Djava.util.logging.config.file=E:\projects\temp\liferay-portal-6.0-ee-sp2\tomcat-6.0.32\conf\logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=E:\projects\temp\liferay-portal-6.0-ee-sp2\tomcat-6.0.32\endorsed -Dcatalina.base=E:\projects\temp\liferay-portal-6.0-ee-sp2\tomcat-6.0.32 -Dcatalina.home=E:\projects\temp\liferay-portal-6.0-ee-sp2\tomcat-6.0.32 -Djava.io.tmpdir=E:\projects\temp\liferay-portal-6.0-ee-sp2\tomcat-6.0.32\temp

4752は、JVM引数に基づいてLiferayポータルを実行しています。

注:Elasticsearch Sidecarは別のJVMで動作しており、独自のPIDが記載されています。'sidecar'への参照の説明を確認して識別してください。

注: LinuxおよびUNIXでは、このコマンドをsudo -u user jps -lとして実行しなければならない場合があります。「user」は、javaプロセスを実行しているユーザーのユーザー名です。

手順1 代替案

  1. Windowsの場合 Ctrl + Shift + Escキーを押してタスクマネージャーを開き、[プロセス]でPIDを見つけます。 コマンドプロンプトから、netstatコマンド (netstat -noa)を実行します。 このコマンドは、アクティブな接続のリストを返します。アプリケーションサーバーが使用しているポートを使用中の接続を探します。

例として、Tomcatは8080、8005、および8009の2つのコネクタポートを使用します。

netstat-noaコマンドを実行後:

127.0.0.1:8005 0.0.0.0:0 LISTENING 4752 

127.0.0.1:8080 127.0.0.1:63796 ESTABLISHED 4752

4752を他の行と比較すると、Tomcatに割り当てられたPIDのように見えます。

  1. UNIX、Linux、およびMac OSXの場合: ps -el | grep java

 

手順2

JVMからスレッドダンプを取得します。スレッドダンプを作成するには、Jstack(JDK 1.5以降のバージョンにパッケージ化されています)を使用します。コマンドプロンプトで次のコマンドを実行します:jstack >> threaddumps.txt

このコマンドは、アプリケーションサーバープロセスのpidを必要とし、スタックトレースをスレッドダンプログファイルに出力します。

トラブルシューティング

WOW64で実行されている32ビットプロセスに接続できませんというエラーメッセージが表示される場合、これはJDK 1.6のjstackツールを使用してJDK 1.5で実行されているプロセスからスレッドダンプを取得しようとしていることが原因です。Liferay + Tomcat / Jbossのバンドルバージョンには、32ビットバージョンのJREがバンドルされています。64ビット環境では、64ビットjstackツールが正常に機能するために、バンドルされているJREを削除し、アプリケーションサーバーがシステムにインストールされた64ビットJREで実行できるようにする必要があります。

エラーメッセージが表示される場合:

unable to open socket file: target process not responding or HotSpot VM not loaded

これは、javaプロセスを実行しているユーザーとしてjstackコマンドを実行する必要があることを示しています。そのためには、このコマンドを次のように実行する必要がある場合があります。

sudo -u <user> jstack <pid> >> threaddumps.log

ここで、<user> は、Javaプロセスを実行しているユーザーです。JVMを実行しているユーザーがrootでない場合、rootとして実行しても機能しません。

追加情報

この記事は役に立ちましたか?
0人中0人がこの記事が役に立ったと言っています