http://visualvm.java.net/ja/intro.html
いろいろ下にかいてありますが、
jvisualvm.exe
が便利です。
http://www.atmarkit.co.jp/fjava/column/andoh/andoh43.html
http://visualvm.java.net/ja/gettingstarted.html
http://d.hatena.ne.jp/tanamon/20091016/1255674058
リモートアプリケーションからデータを取得するには、リモートの JVM で jstatd ユーティリティーが実行されている必要がありますリモートホストで実行中のアプリケーションはプロファイルできません。
※ただし、デフォルトのポートは1099を使っており、セキュリティ的にポートが閉じられていると思います。
なので、jvisualvmをリモートで接続できない場合があると思います。
でもjvisualvmはヒープしたダンプファイルを読み込むことができ、かつ比較する機能を持っています。
sshで入れるならば、sshでリモートサーバに接続して、すでにプロセスが動いているとおもうので、
ps aux
でプロセスをしらべて、比較的負荷の少ない時間帯にjmapを行います。
自分だと
ps aux | grep tomcat | awk '{print $2 " " $1}' | grep tomcat | awk '{print $1}'
こんな感じで、出てきたプロセスIDをxargsの-Iオプションで、パラメータとしてつかうとかしています。
それはさておき、
しばらくして、メモリリークが起きてそうなころあいを見計らって、もう一度jmapを行い、ダンプを2回とります。それは、差分をとるためです。
scpコマンドでファイルをローカルにダウンロードしてきます。
あとは、jvisualvmを使ってヒープを比較するのです。
http://docs.oracle.com/javase/6/docs/technotes/tools/share/jstatd.html
Unable to open socket file: target process not responding or
HotSpot VM not loaded
そんなときは-Fオプションを使えばいいよ。
http://www.acroquest.co.jp/webworkshop/JTSMM/backnumber.cgi?id=123545895410751
すでにまとめられているページがあるので、とりあえずそちらをご覧ください。 このページはそれらのページのつまみ食いという感じです。
http://d.hatena.ne.jp/learn/20090218/p1
http://www.syboos.jp/java/doc/how-to-do-when-OutOfMemoryError.html
たとえばポート8082で動かしてみたいとする
-Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=8082
たとえばポート8082で動いているとする
jconsole localhost:8082
JVMTI を利用したプロファイラエージェントで、ヒープや実行時間のプロファイリングなど基本的な機能が提供されている。
これでも利用できますが、よりビジュアルに結果を見るために、eclipseでMemory Analayzer のプラグインが提供されています。
下記のコマンドでヘルプを見ることができる
java -agentlib:hprof=help
HPROF: Heap and CPU Profiling Agent (JVMTI Demonstration Code)
hprof usage: java -agentlib:hprof=[help]|[<option>=<value>, ...]
Option Name and Value Description Default --------------------- ----------- ------- heap=dump|sites|all heap profiling all cpu=samples|times|old CPU usage off monitor=y|n monitor contention n format=a|b text(txt) or binary output a file=<file> write data to file java.hprof[{.txt}] net=<host>:<port> send data over a socket off depth=<size> stack trace depth 4 interval=<ms> sample interval in ms 10 cutoff=<value> output cutoff point 0.0001 lineno=y|n line number in traces? y thread=y|n thread in traces? n doe=y|n dump on exit? y msa=y|n Solaris micro state accounting n force=y|n force output to <file> y verbose=y|n print messages about dumps y
gc_okay=y|n
- Get sample cpu information every 20 millisec, with a stack depth of 3: java -agentlib:hprof=cpu=samples,interval=20,depth=3 classname - Get heap usage information based on the allocation sites: java -agentlib:hprof=heap=sites classname
java -Xrunhprof:[help]|[<option>=<value>, ...] will behave exactly the same as: java -agentlib:hprof=[help]|[<option>=<value>, ...]
it is not an official product or formal part of the JDK.
in a future release.
デフォルトではプロファイル結果はjava.hprof.txtというファイルに出力されます
http://apis.jpn.ph/fswiki/wiki.cgi?page=Java%2Fhprof%28jvmpi%29
http://lenemarix2.blog28.fc2.com/blog-entry-16.html
jps -l
jstack PID
jstat -gc 5756 250 10
プロセス番号を調べてからつかいます。
自分はcygwinとかいれているので、
tasklist | nkf | grep java
とかで調べています。
バイナリファイルで結果を出力する例
jmap -dump:format=b,file=出力ファイルパス プロセス番号
出てきたファイルを見るには
jhat -J-Xmx700m jmapでの出力ファイルパス
以下紹介サイトより抜粋
詳しくは下記の紹介サイトをごらんください。
http://eclipse.org/mat/downloads.php
http://xiangcai.at.webry.info/201009/article_7.html
※現時点では、MATの更新サイトのアドレスがバージョンアップで変更になっていました。 http://download.eclipse.org/mat/1.2/update-site/
http://tlync.hateblo.jp/entry/20111220/1324372308
1.Eclipseのプラグインなので適当にインストール。
2.Eclipseの実行の構成を開いて、引数タブのVM引数に以下のどちらかを設定する。
hprofファイルだけを出力します。
-Xrunhprof:heap=dump,format=b,file=./${project_name}.hprof
hprofファイルも出力されるけど関係ないファイルが全部出力される。
-agentlib:hprof=heap=dump,format=b
3.普通に実行
4.hprofファイルが出力されるので開くと、メモリの使用状態が表示される。
http://wiki.eclipse.org/index.php/MemoryAnalyzer#Getting_a_Heap_Dump http://tomcat.10.x6.nabble.com/How-to-generate-heap-dump-in-Tomcat-5-5-Windows-td4643861.html
http://odasusu.hatenablog.com/entry/20080730/1217419266
そのプロセスに対して一定間隔ごとにSIGQUITシグナルを送信する。
Java起動時に以下のオプションを追加する
java -verbose:gc -XX:+PrintClassHistogram TestMain
crontabで実行するコマンド
kill -3 <java pid>
http://www.atmarkit.co.jp/fjava/rensai4/troublehacks08/troublehacks08_2.html