Javaツール完全ガイド
Javaツール完全ガイド
Section titled “Javaツール完全ガイド”Java開発で使用する主要なツールを、実務で使える実装例とベストプラクティスとともに詳しく解説します。
1. Javaツールとは
Section titled “1. Javaツールとは”JDKに含まれるツール
Section titled “JDKに含まれるツール”JDKツール ├─ jps: 実行中のJavaプロセスの一覧 ├─ jstat: JVM統計情報の表示 ├─ jmap: ヒープダンプの取得 ├─ jstack: スレッドダンプの取得 ├─ jconsole: JVM監視ツール(GUI) ├─ VisualVM: 統合監視ツール(GUI) ├─ jhat: ヒープダンプの分析 └─ javap: クラスファイルの逆アセンブル2. jps(Java Process Status)
Section titled “2. jps(Java Process Status)”基本的な使用
Section titled “基本的な使用”# 実行中のJavaプロセスの一覧を表示jps
# 出力例:# 12345 MyApplication# 12346 AnotherApp
# 詳細情報を表示jps -lvm
# 出力例:# 12345 com.example.MyApplication -Xmx2g -Xms2g実践的な使用例
Section titled “実践的な使用例”# 特定のプロセスを検索jps | grep MyApp
# プロセスIDを取得して他のツールで使用PID=$(jps | grep MyApp | awk '{print $1}')jmap -heap $PID3. jstat(JVM Statistics)
Section titled “3. jstat(JVM Statistics)”GC統計の表示
Section titled “GC統計の表示”# GC統計を1秒ごとに10回表示jstat -gc <pid> 1000 10
# 出力例:# S0 S1 E O M CCS YGC YGCT FGC FGCT GCT# 0.00 50.00 25.00 75.00 80.00 70.00 10 0.100 2 0.200 0.300
# 各列の意味:# S0, S1: Survivor領域の使用率# E: Eden領域の使用率# O: Old Generationの使用率# M: Metaspaceの使用率# YGC: Young GCの回数# YGCT: Young GCの累計時間# FGC: Full GCの回数# FGCT: Full GCの累計時間# GCT: GCの累計時間その他の統計情報
Section titled “その他の統計情報”# クラスローディング統計jstat -class <pid> 1000 10
# コンパイラ統計jstat -compiler <pid> 1000 10
# GC容量統計jstat -gccapacity <pid> 1000 104. jmap(Memory Map)
Section titled “4. jmap(Memory Map)”ヒープダンプの取得
Section titled “ヒープダンプの取得”# ヒープダンプの取得jmap -dump:format=b,file=heap.hprof <pid>
# ライブオブジェクトのみjmap -dump:live,format=b,file=heap.hprof <pid>
# ヒープの使用状況jmap -heap <pid>
# ヒストグラム(クラスごとのインスタンス数とサイズ)jmap -histo <pid>実践的な使用例
Section titled “実践的な使用例”# OOMエラー時の自動ヒープダンプjava -XX:+HeapDumpOnOutOfMemoryError \ -XX:HeapDumpPath=/path/to/dump \ MyApp
# 定期的なヒープダンプwhile true; do jmap -dump:format=b,file=heap_$(date +%Y%m%d_%H%M%S).hprof <pid> sleep 3600 # 1時間ごとdone5. jstack(Thread Dump)
Section titled “5. jstack(Thread Dump)”スレッドダンプの取得
Section titled “スレッドダンプの取得”# スレッドダンプの取得jstack <pid>
# ファイルに出力jstack <pid> > thread_dump.txt
# デッドロックの検出jstack <pid> | grep -A 10 "deadlock"スレッドダンプの分析
Section titled “スレッドダンプの分析”# スレッドの状態を確認jstack <pid> | grep "java.lang.Thread.State"
# 出力例:# "main" #1 prio=5 os_prio=0 tid=0x00007f... nid=0x1234 runnable# "GC task thread#0" #2 prio=5 os_prio=0 tid=0x00007f... nid=0x1235 runnable
# 特定のスレッドのスタックトレースを確認jstack <pid> | grep -A 20 "Thread-1"6. jconsole(Java Monitoring and Management Console)
Section titled “6. jconsole(Java Monitoring and Management Console)”jconsoleの起動
Section titled “jconsoleの起動”# jconsoleの起動jconsole
# 特定のプロセスに接続jconsole <pid>
# リモート接続jconsole hostname:portjconsoleの機能
Section titled “jconsoleの機能”jconsoleの機能 ├─ メモリ監視 ├─ スレッド監視 ├─ クラス監視 ├─ VM情報 └─ MBeanブラウザ実践的な使用例
Section titled “実践的な使用例”# JMX接続を有効にして起動java -Dcom.sun.management.jmxremote \ -Dcom.sun.management.jmxremote.port=9999 \ -Dcom.sun.management.jmxremote.authenticate=false \ -Dcom.sun.management.jmxremote.ssl=false \ MyApp
# jconsoleで接続jconsole localhost:99997. VisualVM
Section titled “7. VisualVM”VisualVMの起動
Section titled “VisualVMの起動”# VisualVMの起動jvisualvm
# またはvisualvmVisualVMの機能
Section titled “VisualVMの機能”VisualVMの機能 ├─ アプリケーション監視 ├─ CPUプロファイリング ├─ メモリプロファイリング ├─ スレッド分析 ├─ ヒープダンプ分析 └─ プラグイン機能実践的な使用例
Section titled “実践的な使用例”// VisualVMでプロファイリングするコードpublic class ProfilingExample { public void processData(List<Data> dataList) { for (Data data : dataList) { processItem(data); // VisualVMでCPU使用率を確認 } }
private void processItem(Data data) { // 処理 }}8. jhat(Java Heap Analysis Tool)
Section titled “8. jhat(Java Heap Analysis Tool)”ヒープダンプの分析
Section titled “ヒープダンプの分析”# ヒープダンプの分析jhat heap.hprof
# ポートを指定jhat -port 7000 heap.hprof
# ブラウザでアクセス# http://localhost:7000jhatの機能
Section titled “jhatの機能”jhatの機能 ├─ クラスごとのインスタンス数 ├─ インスタンスの参照関係 ├─ OQL(Object Query Language) └─ ヒストグラム表示9. javap(Class File Disassembler)
Section titled “9. javap(Class File Disassembler)”クラスファイルの逆アセンブル
Section titled “クラスファイルの逆アセンブル”# クラスファイルの逆アセンブルjavap MyClass
# 詳細情報を表示javap -c MyClass # バイトコードを表示javap -v MyClass # 詳細情報を表示javap -p MyClass # プライベートメンバーも表示実践的な使用例
Section titled “実践的な使用例”# メソッドのシグネチャを確認javap -p MyClass | grep "public void"
# バイトコードを確認javap -c MyClass > MyClass.bytecode10. 実践的なトラブルシューティング
Section titled “10. 実践的なトラブルシューティング”メモリリークの調査
Section titled “メモリリークの調査”# 1. ヒープ使用状況を確認jmap -heap <pid>
# 2. ヒストグラムを確認jmap -histo <pid> | head -20
# 3. ヒープダンプを取得jmap -dump:format=b,file=heap.hprof <pid>
# 4. VisualVMで分析jvisualvm# File -> Load -> heap.hprofデッドロックの調査
Section titled “デッドロックの調査”# 1. スレッドダンプを取得jstack <pid> > thread_dump.txt
# 2. デッドロックを検索grep -A 10 "deadlock" thread_dump.txt
# 3. スレッドの状態を確認grep "java.lang.Thread.State" thread_dump.txtパフォーマンス問題の調査
Section titled “パフォーマンス問題の調査”# 1. GC統計を確認jstat -gc <pid> 1000 10
# 2. CPU使用率が高いスレッドを確認top -H -p <pid>
# 3. スレッドダンプを取得jstack <pid> > thread_dump.txt
# 4. VisualVMでCPUプロファイリングjvisualvmJavaツール完全ガイドのポイント:
- jps: 実行中のJavaプロセスの確認
- jstat: GC統計の監視
- jmap: ヒープダンプの取得
- jstack: スレッドダンプの取得
- jconsole: JVM監視(GUI)
- VisualVM: 統合監視ツール(GUI)
- jhat: ヒープダンプの分析
- javap: クラスファイルの逆アセンブル
適切なツールの使用により、効率的なデバッグとパフォーマンス分析が可能になります。