SlideShare une entreprise Scribd logo
1  sur  12
Javaのs
Thread dumpの読み方
          船戸 隆
            2010/11/26
アジェンダ


●Thread dumpとは
●Thread dumpを取るとき

●取り方

●読み方

●ケーススタディ
Thread dumpとは


 Java VisualVM では、ローカルアプリケーションの実行中にスレッド
ダンプ (スタックトレース) を取ることができます。スレッドダンプを
取ってもアプリケーションが停止されることはありません。スレッド
ダンプを出力すると、Java スレッドのスレッド状態を含むスレッドス
タックの出力が得られます。
ようするに、Javaの各スレッドのメソッド呼び出しのスタックトレース
とそのスレッドの実行状態を取得することができる。
 各javaVM(Sun、IBM、HP、Apple・・・)などなど実装系はいくつか
あって出力内容は若干違うけれど大体一緒。
Thread dumpを取るとき

●       デッドロック
    ●   どのリソースがロックされているか?
●       メモリーリーク
●       無限ループ
    ●   CPUを使っているLWP(LightWeightProcess)を探す
●       コネクションプール枯渇
●       などなど、よくわからない挙動をしてたらとにかくThread dumping!
取り方
   ●    任意のタイミングでプロセスにSIGQUITのシ
        グナルを送る
        (Unix、Mac)、Ctrl+Break(Windows)
   ●    標準出力か標準エラーに出力される
    ●   通常はTomcatなのでcatalina.outかlocalhost.logに出力される
    ●   具体的にはLinuxでの例

                                                  プロセスIDは
                                                   プロセスIDは
           $ kill -3 <プロセスID>                Psコマンドやjpsコマンドで
                                              Psコマンドやjpsコマンドで
                                                 予め探しておく
                                                  予め探しておく



JDI(Java Debug Interface)
 JDI(Java Debug Interface)
を使っても取れるらしいが
 を使っても取れるらしいが
        詳細求む
         詳細求む
取るときの注意

●Thread dumpは数秒おきに数回とる
● 無限ループの確認


    –   スタック状態が変わっていたらループしてない
         という判断
●   間違えて-9を指定しない
読み方

●   出力されるスレッドはいっぱいある
●   JVM内部で使用されるスレッドも出力
     –   Reference HandlerとかLowMemoryDetectorとか大概無視していい
     –   Tomcatのリクエストを受け付けるスレッドだと

●   注目すべきスレッドの状態は3種類
●   waiting for monitor entry=ロック解放待ち
●   waiting on monitor = スリープ中
●   runnable = 実行中 =

●
スレッドの状態

●    runnable
 ●    通常スレッドが処理を行なっている状態
       –   Javaコードを実行中かネイティブメソッドを実行中
●    以下はソケットのIO待ち


"Thread-0" prio=9 tid=0x1bef58 nid=8 lwp_id=13105 runnable [0x6fc58000..0x6fc58438]
 "Thread-0" prio=9 tid=0x1bef58 nid=8 lwp_id=13105 runnable [0x6fc58000..0x6fc58438]
at java.net.SocketInputStream.socketRead(Native Method)
 at java.net.SocketInputStream.socketRead(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:90)
 at java.net.SocketInputStream.read(SocketInputStream.java:90)
at java.net.SocketInputStream.read(SocketInputStream.java:106)
 at java.net.SocketInputStream.read(SocketInputStream.java:106)
at SocketClose$SocketListener.run(SocketClose.java:18)
 at SocketClose$SocketListener.run(SocketClose.java:18)
at java.lang.Thread.run(Thread.java:479)
 at java.lang.Thread.run(Thread.java:479)
スレッドの状態

●   waiting on monitor
●   スレッドダンプにwaiting on、lockedの出力が含まれる
●   オブジェクトに関するロックを獲得後、一旦ロックを開放
     し通知(notify)を待っている状態
●
スレッドの状態

●   waiting for monitor entry
●    デッドロックしたときにでてることが多い
●    オブジェクトロック待ち状態
      –   syncronizedなメソッドの開放待ち
LWP

●       LightWeightProcess
    ●   ひとつのプロセスの中でさらに複数の処理を並行稼動させ
         るための仕組み
●     Javaのプロセスの内部的なLWPの情報を取得
    ●  それぞれのスレッドがどのように使われてるかがわかる
          –   CPU、メモリなど
●     スレッドのIDと紐付け
    ● 右のコマンドを打つとLWPの一覧がでる
          –   LWPの項目(10進数)を16進数に変換したものが出力
               される。
                              $ ps -L auxw
ケーススタディ

Contenu connexe

Tendances

Tomcatの実装から学ぶクラスローダリーク #渋谷Java
Tomcatの実装から学ぶクラスローダリーク #渋谷JavaTomcatの実装から学ぶクラスローダリーク #渋谷Java
Tomcatの実装から学ぶクラスローダリーク #渋谷JavaNorito Agetsuma
 
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5Takahiro YAMADA
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Etsuji Nakai
 
Java仮想マシンの実装技術
Java仮想マシンの実装技術Java仮想マシンの実装技術
Java仮想マシンの実装技術Kiyokuni Kawachiya
 
Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)Hiraku Toyooka
 
Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造Etsuji Nakai
 
Linux の hugepage の開発動向
Linux の hugepage の開発動向Linux の hugepage の開発動向
Linux の hugepage の開発動向Naoya Horiguchi
 
Java 9で進化する診断ツール
Java 9で進化する診断ツールJava 9で進化する診断ツール
Java 9で進化する診断ツールYasumasa Suenaga
 
Javaトラブルに備えよう #jjug_ccc #ccc_h2
Javaトラブルに備えよう #jjug_ccc #ccc_h2Javaトラブルに備えよう #jjug_ccc #ccc_h2
Javaトラブルに備えよう #jjug_ccc #ccc_h2Norito Agetsuma
 
Introduction to Java 11: Support and JVM Features #jjug
Introduction to Java 11: Support and JVM Features #jjugIntroduction to Java 11: Support and JVM Features #jjug
Introduction to Java 11: Support and JVM Features #jjugYuji Kubota
 
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本Takahiro YAMADA
 
簡単!AWRをEXCELピボットグラフで分析しよう♪
簡単!AWRをEXCELピボットグラフで分析しよう♪簡単!AWRをEXCELピボットグラフで分析しよう♪
簡単!AWRをEXCELピボットグラフで分析しよう♪Yohei Azekatsu
 
jcmd をさわってみよう
jcmd をさわってみようjcmd をさわってみよう
jcmd をさわってみようTsunenaga Hanyuda
 
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)NTT DATA Technology & Innovation
 
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)NTT DATA Technology & Innovation
 
シンプルでシステマチックな Linux 性能分析方法
シンプルでシステマチックな Linux 性能分析方法シンプルでシステマチックな Linux 性能分析方法
シンプルでシステマチックな Linux 性能分析方法Yohei Azekatsu
 
やってはいけない空振りDelete
やってはいけない空振りDeleteやってはいけない空振りDelete
やってはいけない空振りDeleteYu Yamada
 
MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話Yoshinori Matsunobu
 
iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方歩 柴田
 

Tendances (20)

Tomcatの実装から学ぶクラスローダリーク #渋谷Java
Tomcatの実装から学ぶクラスローダリーク #渋谷JavaTomcatの実装から学ぶクラスローダリーク #渋谷Java
Tomcatの実装から学ぶクラスローダリーク #渋谷Java
 
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
 
Java仮想マシンの実装技術
Java仮想マシンの実装技術Java仮想マシンの実装技術
Java仮想マシンの実装技術
 
Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)
 
Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造
 
Linux の hugepage の開発動向
Linux の hugepage の開発動向Linux の hugepage の開発動向
Linux の hugepage の開発動向
 
Java 9で進化する診断ツール
Java 9で進化する診断ツールJava 9で進化する診断ツール
Java 9で進化する診断ツール
 
Javaトラブルに備えよう #jjug_ccc #ccc_h2
Javaトラブルに備えよう #jjug_ccc #ccc_h2Javaトラブルに備えよう #jjug_ccc #ccc_h2
Javaトラブルに備えよう #jjug_ccc #ccc_h2
 
Introduction to Java 11: Support and JVM Features #jjug
Introduction to Java 11: Support and JVM Features #jjugIntroduction to Java 11: Support and JVM Features #jjug
Introduction to Java 11: Support and JVM Features #jjug
 
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
 
簡単!AWRをEXCELピボットグラフで分析しよう♪
簡単!AWRをEXCELピボットグラフで分析しよう♪簡単!AWRをEXCELピボットグラフで分析しよう♪
簡単!AWRをEXCELピボットグラフで分析しよう♪
 
jcmd をさわってみよう
jcmd をさわってみようjcmd をさわってみよう
jcmd をさわってみよう
 
ゼロからはじめるKVM超入門
ゼロからはじめるKVM超入門ゼロからはじめるKVM超入門
ゼロからはじめるKVM超入門
 
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
 
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
 
シンプルでシステマチックな Linux 性能分析方法
シンプルでシステマチックな Linux 性能分析方法シンプルでシステマチックな Linux 性能分析方法
シンプルでシステマチックな Linux 性能分析方法
 
やってはいけない空振りDelete
やってはいけない空振りDeleteやってはいけない空振りDelete
やってはいけない空振りDelete
 
MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話
 
iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方
 

Similaire à スレッドダンプの読み方

Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようAkira Shimosako
 
DTraceによるMySQL解析ことはじめ
DTraceによるMySQL解析ことはじめDTraceによるMySQL解析ことはじめ
DTraceによるMySQL解析ことはじめMikiya Okuno
 
JVMの中身を可視化してみた
JVMの中身を可視化してみたJVMの中身を可視化してみた
JVMの中身を可視化してみたKengo Toda
 
SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireSDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireAkio Katayama
 
Android デバッグ小ネタ
Android デバッグ小ネタAndroid デバッグ小ネタ
Android デバッグ小ネタl_b__
 
Java Concurrency, A(nother) Peek Under the Hood [Java Day Tokyo 2016 3-C]
Java Concurrency, A(nother) Peek Under the Hood [Java Day Tokyo 2016 3-C]Java Concurrency, A(nother) Peek Under the Hood [Java Day Tokyo 2016 3-C]
Java Concurrency, A(nother) Peek Under the Hood [Java Day Tokyo 2016 3-C]David Buck
 
MySQLトラブル解析入門
MySQLトラブル解析入門MySQLトラブル解析入門
MySQLトラブル解析入門Mikiya Okuno
 
Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageKink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageTaku Miyakawa
 
Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド - Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド - Yuichi Sakuraba
 
【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門 【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門 sandai
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, CodereadingHiro Yoshioka
 
HeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LTHeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LTYuji Kubota
 
tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1Ryosuke IWANAGA
 
Java8から17へ
Java8から17へJava8から17へ
Java8から17へonozaty
 
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) 泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) Akihiro Kuwano
 
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)inaz2
 
Webサーバのチューニング
WebサーバのチューニングWebサーバのチューニング
WebサーバのチューニングYu Komiya
 
Nseg20120825
Nseg20120825Nseg20120825
Nseg20120825hiro345
 

Similaire à スレッドダンプの読み方 (20)

Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
 
DTraceによるMySQL解析ことはじめ
DTraceによるMySQL解析ことはじめDTraceによるMySQL解析ことはじめ
DTraceによるMySQL解析ことはじめ
 
JVMの中身を可視化してみた
JVMの中身を可視化してみたJVMの中身を可視化してみた
JVMの中身を可視化してみた
 
SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireSDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 Whire
 
Android デバッグ小ネタ
Android デバッグ小ネタAndroid デバッグ小ネタ
Android デバッグ小ネタ
 
TruffleSqueakの紹介
TruffleSqueakの紹介TruffleSqueakの紹介
TruffleSqueakの紹介
 
Java Concurrency, A(nother) Peek Under the Hood [Java Day Tokyo 2016 3-C]
Java Concurrency, A(nother) Peek Under the Hood [Java Day Tokyo 2016 3-C]Java Concurrency, A(nother) Peek Under the Hood [Java Day Tokyo 2016 3-C]
Java Concurrency, A(nother) Peek Under the Hood [Java Day Tokyo 2016 3-C]
 
MySQLトラブル解析入門
MySQLトラブル解析入門MySQLトラブル解析入門
MySQLトラブル解析入門
 
Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageKink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based language
 
Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド - Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド -
 
【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門 【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, Codereading
 
HeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LTHeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LT
 
tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1
 
Java8から17へ
Java8から17へJava8から17へ
Java8から17へ
 
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) 泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
 
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
 
Webサーバのチューニング
WebサーバのチューニングWebサーバのチューニング
Webサーバのチューニング
 
Nseg20120825
Nseg20120825Nseg20120825
Nseg20120825
 
Heap statsfx analyzer
Heap statsfx analyzerHeap statsfx analyzer
Heap statsfx analyzer
 

Plus de Funato Takashi

プログラムを作って飯を食うということ
プログラムを作って飯を食うということプログラムを作って飯を食うということ
プログラムを作って飯を食うということFunato Takashi
 
Springでdao 20070413
Springでdao 20070413Springでdao 20070413
Springでdao 20070413Funato Takashi
 
Unit testで定時帰宅!
Unit testで定時帰宅!Unit testで定時帰宅!
Unit testで定時帰宅!Funato Takashi
 

Plus de Funato Takashi (7)

プログラムを作って飯を食うということ
プログラムを作って飯を食うということプログラムを作って飯を食うということ
プログラムを作って飯を食うということ
 
Git flow cheatsheet
Git flow cheatsheetGit flow cheatsheet
Git flow cheatsheet
 
Springでdao 20070413
Springでdao 20070413Springでdao 20070413
Springでdao 20070413
 
Unit testで定時帰宅!
Unit testで定時帰宅!Unit testで定時帰宅!
Unit testで定時帰宅!
 
Maven2 plugin
Maven2 pluginMaven2 plugin
Maven2 plugin
 
問題解決ノ勘所
問題解決ノ勘所問題解決ノ勘所
問題解決ノ勘所
 
Javaでmongo db
Javaでmongo dbJavaでmongo db
Javaでmongo db
 

スレッドダンプの読み方

  • 1. Javaのs Thread dumpの読み方 船戸 隆 2010/11/26
  • 3. Thread dumpとは  Java VisualVM では、ローカルアプリケーションの実行中にスレッド ダンプ (スタックトレース) を取ることができます。スレッドダンプを 取ってもアプリケーションが停止されることはありません。スレッド ダンプを出力すると、Java スレッドのスレッド状態を含むスレッドス タックの出力が得られます。 ようするに、Javaの各スレッドのメソッド呼び出しのスタックトレース とそのスレッドの実行状態を取得することができる。  各javaVM(Sun、IBM、HP、Apple・・・)などなど実装系はいくつか あって出力内容は若干違うけれど大体一緒。
  • 4. Thread dumpを取るとき ● デッドロック ● どのリソースがロックされているか? ● メモリーリーク ● 無限ループ ● CPUを使っているLWP(LightWeightProcess)を探す ● コネクションプール枯渇 ● などなど、よくわからない挙動をしてたらとにかくThread dumping!
  • 5. 取り方 ● 任意のタイミングでプロセスにSIGQUITのシ グナルを送る (Unix、Mac)、Ctrl+Break(Windows) ● 標準出力か標準エラーに出力される ● 通常はTomcatなのでcatalina.outかlocalhost.logに出力される ● 具体的にはLinuxでの例 プロセスIDは プロセスIDは $ kill -3 <プロセスID> Psコマンドやjpsコマンドで Psコマンドやjpsコマンドで 予め探しておく 予め探しておく JDI(Java Debug Interface) JDI(Java Debug Interface) を使っても取れるらしいが を使っても取れるらしいが 詳細求む 詳細求む
  • 6. 取るときの注意 ●Thread dumpは数秒おきに数回とる ● 無限ループの確認 – スタック状態が変わっていたらループしてない という判断 ● 間違えて-9を指定しない
  • 7. 読み方 ● 出力されるスレッドはいっぱいある ● JVM内部で使用されるスレッドも出力 – Reference HandlerとかLowMemoryDetectorとか大概無視していい – Tomcatのリクエストを受け付けるスレッドだと ● 注目すべきスレッドの状態は3種類 ● waiting for monitor entry=ロック解放待ち ● waiting on monitor = スリープ中 ● runnable = 実行中 = ●
  • 8. スレッドの状態 ● runnable ● 通常スレッドが処理を行なっている状態 – Javaコードを実行中かネイティブメソッドを実行中 ● 以下はソケットのIO待ち "Thread-0" prio=9 tid=0x1bef58 nid=8 lwp_id=13105 runnable [0x6fc58000..0x6fc58438] "Thread-0" prio=9 tid=0x1bef58 nid=8 lwp_id=13105 runnable [0x6fc58000..0x6fc58438] at java.net.SocketInputStream.socketRead(Native Method) at java.net.SocketInputStream.socketRead(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:90) at java.net.SocketInputStream.read(SocketInputStream.java:90) at java.net.SocketInputStream.read(SocketInputStream.java:106) at java.net.SocketInputStream.read(SocketInputStream.java:106) at SocketClose$SocketListener.run(SocketClose.java:18) at SocketClose$SocketListener.run(SocketClose.java:18) at java.lang.Thread.run(Thread.java:479) at java.lang.Thread.run(Thread.java:479)
  • 9. スレッドの状態 ● waiting on monitor ● スレッドダンプにwaiting on、lockedの出力が含まれる ● オブジェクトに関するロックを獲得後、一旦ロックを開放 し通知(notify)を待っている状態 ●
  • 10. スレッドの状態 ● waiting for monitor entry ● デッドロックしたときにでてることが多い ● オブジェクトロック待ち状態 – syncronizedなメソッドの開放待ち
  • 11. LWP ● LightWeightProcess ● ひとつのプロセスの中でさらに複数の処理を並行稼動させ るための仕組み ● Javaのプロセスの内部的なLWPの情報を取得 ● それぞれのスレッドがどのように使われてるかがわかる – CPU、メモリなど ● スレッドのIDと紐付け ● 右のコマンドを打つとLWPの一覧がでる – LWPの項目(10進数)を16進数に変換したものが出力 される。 $ ps -L auxw