JVMからヒープダンプの取得方法

Liferay Support does not recommend or endorse specific third-party products over others. Liferay is not responsible for any instructions herein or referenced regarding these products. Any implementation of these principles is the responsibility of the subscriber.

 

システムでメモリ不足エラーまたはその他のメモリ関連の問題が発生した場合、ヒープダンプの作成が役に立ちます。

ヒープダンプは、現在JVMにあるすべてのオブジェクトのスナップショットです。Javaヒープは、メモリ内に新しいオブジェクトを作成するために、JVMに割り当てられたスペースです。不正なメモリアクセスを調査する場合、JVMでOutOfMemoryエラーが発生している、または発生しているときにヒープダンプが生成される場合、通常は1つのヒープダンプで十分です。JVMのメモリ使用率がヒープダンプの取得時にOutOfMemoryに近いほど、潜在的なJavaメモリの問題のトラブルシューティングに役立ちます。

注:ヒープダンプには10秒から数分かかります。ヒープダンプはディスクに保存され、JVMの現在のメモリ使用量と同じ物理サイズになります。

解決

自動ヒープダンプ:

次のJVM引数を追加して、メモリ不足例外が発生するたびに、ヒープダンプを自動的に生成します。

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heapdump.hprof

手動方法:

ステップ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ポータルを実行しています。

ステップ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のように見えます。
    2. UNIX、Linux、およびMac OSXの場合は以下のコマンドになります。:
      ps -el | grep java

    ステップ2

    JVMからライブオブジェクトのヒープダンプを要求します。コマンドプロンプトから次を実行します。

jmap -dump:live,format=b,file=heapdump.hprof <pid>

liveオプションを使用しない場合、jmapはデフォルトでJVM内のすべてのメモリのスナップショットを取得します。これは、ヒープサイズによっては数時間かかる場合があります。

または以下のコマンドを実行してください。

jcmd  GC.heap_dump /path/to/destination/file.hprof

トラブルシューティング

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

追加情報

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