Contents
1. バイトコード可視化とは何か
1-1. 基本概念
Java ソースはコンパイルされて バイトコード (class ファイル) に変換され、JVM が実行時に解釈します。
ソースだけでは把握しづらい以下の情報がバイトコードから得られます。
| 項目 | バイトコードで見えること |
|---|---|
| クラスローディング順序 | ClassLoader.defineClass が呼び出されたタイミング |
| インライン化・最適化 | JIT によるメソッド展開やループアンローリングの痕跡 |
| 匿名クラス・ラムダ式の生成位置 | $1, $2 などの内部クラス名 |
| フィールド/メソッドへの実際のアクセス権限 | ACC_PUBLIC, ACC_PRIVATE 等のフラグ |
これらを 図式化(クラス図、呼び出しチェーン、依存関係グラフ)することで、以下のような業務上の課題が解決します。
| 課題 | 可視化による効果 |
|---|---|
| 設計意図の把握 | 大規模プロジェクトで新規メンバーが依存関係を瞬時に理解できる |
| デバッグ支援 | 実行中に期待したメソッドが呼ばれない原因を呼び出しチェーンで特定 |
| セキュリティ診断 | 難読化・暗号化されたコードでも実際のコールフローを追跡可能 |
ポイント:可視化は「設計 → 実装 → 運用」の全フェーズで価値を提供し、開発効率と品質向上に直結します。
1-2. 可視化手法の種類
| 手法 | 主な特徴 | 利用シーン |
|---|---|---|
| 静的解析 (ビルド時) | ソースや class ファイルを解析し、UML/PlantUML/DOT を生成。CI に組み込みやすい。 | 設計レビュー、依存関係可視化 |
| 動的解析 (ランタイム) | 実行中の JVM にフックしてメソッド呼び出しやフィールドアクセスを取得。リアルタイムで変化を追える。 | パフォーマンスチューニング、脆弱性検知 |
| ハイブリッド (ビルド + ランタイム) | 静的に生成したモデルにランタイムデータを重ね合わせる。 | 長期的なシステムドキュメント作成 |
本稿では、JDBG(動的解析) と JIG(静的解析) の2ツールに焦点を当て、実務での選定・活用方法をご紹介します。
2. JDBG ― ランタイム向けバイトコード可視化ツール
2-1. 製品概要と公式情報
| 項目 | 内容 |
|---|---|
| リリース時期 | 2025 年 2 月に公式ブログで発表(※[1]) |
| 提供形態 | ネイティブ DLL/SO と CLI ツールの組み合わせ。30 日間の機能制限なしトライアル版を公開中(※[2])。 |
| 対象 OS | Windows、macOS、Linux の主要ディストリビューション(x86_64) |
注記:CPU 使用率は公式ベンチマークで 3 % 未満 と報告されていますが、実環境での数値は対象アプリケーションやハードウェア構成に依存します(※[3])。
2-2. 主な機能
| 機能 | 説明 |
|---|---|
| ランタイム注入 | 対象プロセスに DLL/so をロードし、ClassFileTransformer と同等のフックを実装。 |
| リアルタイム可視化 | --watch オプションでメソッド呼び出しやフィールドアクセスをテキストツリーまたは Graphviz DOT 形式に即時出力。 |
| トレースフィルタ | パッケージ名・クラス名で絞り込み可能。--include / --exclude オプションを提供。 |
| スクリプト連携 | 出力結果を Python、Bash、PowerShell からパイプラインで受け取り、独自レポート作成が容易。 |
2-3. インストール手順(Windows/macOS/Linux 共通)
|
1 2 3 4 5 6 7 8 |
# 1. ダウンロード (公式サイトのダウンロードページ) curl -L -o jdbg.zip https://download.example.com/jdbg/latest/jdbg-linux-x64.zip # 2. 解凍 & パス設定 unzip jdbg.zip -d $HOME/jdbg export JDBG_HOME=$HOME/jdbg export PATH=$PATH:$JDBG_HOME/bin # .bashrc / .zshrc に追記推奨 |
動作確認
|
1 2 3 |
$ jdbg --version jdbg version 1.4.0 (2025‑02‑15) |
2-4. 基本使用例
2-4-1. プロセスにアタッチして全クラスロードを DOT 出力
|
1 2 3 4 |
# PID が 12345 の Java アプリに接続し、クラスロード情報を取得 jdbg attach --pid 12345 --watch > load_graph.dot dot -Tpng load_graph.dot -o load_graph.png # Graphviz による画像変換例 |
2-4-2. 特定メソッドの呼び出しチェーンをテキストで取得
|
1 2 3 4 |
jdbg attach --pid 12345 \ --trace com.example.service.PaymentService.processPayment \ > payment_trace.log |
payment_trace.log には以下のような情報が逐次記録されます(抜粋)。
|
1 2 3 4 5 6 |
[TRACE] PaymentService.processPayment() entered -> OrderRepository.findById() -> FraudCheck.validate() -> NotificationSender.sendSuccess() [TRACE] PaymentService.processPayment() exited (duration: 12ms) |
2-5. 実務での活用ポイント
| シーン | 推奨設定・留意点 |
|---|---|
| CI パイプライン | setup-java 後に短時間だけアタッチし、生成した DOT をアーティファクトとして保存。CPU オーバーヘッドは 2 % 前後と報告されているため、ジョブ全体のタイムアウトには影響しにくい(※[3])。 |
| 脆弱性診断 | --include javax.crypto.* 等で暗号関連クラスのみフィルタリングし、キー処理がどこから呼び出されているかを即座に把握。 |
| 本番環境モニタリング(限定的) | アタッチ権限とセキュリティポリシーの合意が必要。トレース対象は一時的に絞り込み、ログローテーションでディスク使用量を管理すること。 |
3. JIG ― ビルドツール連携型可視化プラットフォーム
3-1. 製品概要と最新リリース情報
| 項目 | 内容 |
|---|---|
| プロジェクト URL | https://github.com/dddjava/jig(※[4]) |
| 最新版 | v2.3.1 (2026‑04‑12 リリース、Java 17 以上をフルサポート) |
| スター数 / フォーク数 | 約 5,200 ★ / 850 🍴(2026‑04‑20 時点、GitHub API による取得) |
| ライセンス | Apache License 2.0(商用利用可) |
注記:上記数字は執筆時点の情報であり、時間経過に伴い変動します。最新状況は GitHub のリポジトリページをご確認ください。
3-2. コア機能
| 機能 | 説明 |
|---|---|
| Maven / Gradle プラグイン | ビルドフェーズに自動的にクラス図・依存関係図を生成。jig:generate で実行可能。 |
| マルチフォーマット出力 | PlantUML、Graphviz DOT、JSON、HTML レポートをサポートし、CI に容易に組み込める。 |
| DDD 向けタグ付与 | @Entity, @ValueObject 等のアノテーションや命名規則から自動でレイヤー別図表を作成。 |
| 拡張 API | カスタム出力フォーマットやフィルタリングロジックをプラグインとして追加可能(Java Service Loader に準拠)。 |
3-3. インストール例
3-3-1. Maven 設定
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<plugin> <groupId>org.dddjava</groupId> <artifactId>jig-maven-plugin</artifactId> <version>2.3.1</version> <executions> <execution> <goals> <goal>generate</goal> </goals> <phase>verify</phase> </execution> </executions> <configuration> <!-- 出力先ディレクトリ --> <outputDir>${project.build.directory}/jig-report</outputDir> <!-- 生成形式 --> <diagramFormat>plantuml,dot</diagramFormat> </configuration> </plugin> |
mvn clean verify を実行すると、target/jig-report に PlantUML と DOT のファイルが作成されます。
3-3-2. Gradle Kotlin DSL 設定
|
1 2 3 4 5 6 7 8 9 10 |
plugins { java id("org.dddjava.jig") version "2.3.1" } jig { outputDir.set(layout.buildDirectory.dir("jig-report")) diagramFormat.set(listOf("plantuml", "dot")) } |
./gradlew build だけで同様にレポートが生成されます。
3-4. 実務活用のベストプラクティス
| 活用シーン | 設定例・ポイント |
|---|---|
| CI/CD に組み込む | verify フェーズで自動生成し、GitHub Actions のアーティファクトとして保存。プルリクエストのコメントに PlantUML PNG を添付するとレビューが可視化されやすい。 |
| 設計ドキュメントの自動更新 | jig-report ディレクトリを Git にコミットし、README から画像リンクで常に最新図面を参照可能。 |
| DDD プロジェクトの層分離確認 | --ddd オプション(※[5])でエンティティ・アグリゲート単位の依存関係図を生成し、循環参照がないか自動チェック。 |
4. ツール比較表 ― JDBG vs. JIG
| 項目 | JDBG (ランタイム) | JIG (ビルド時) |
|---|---|---|
| 提供形態 | ネイティブ DLL/SO + CLI (有償エンタープライズプランあり) |
完全オープンソース(Apache‑2.0) |
| 対応 Java バージョン | 8 以上(バイナリレベルでフック) | 11 推奨、17・20 でも動作(v2.3.1) |
| 可視化形式 | テキストツリー、Graphviz DOT → PNG/SVG カスタムスクリプト対応 |
PlantUML, Graphviz DOT, JSON, HTML レポート |
| 主な利用シーン | 実行時のメソッドチェーン追跡、脆弱性診断、パフォーマンスモニタリング | 設計レビュー、依存関係把握、CI への自動組み込み |
| 導入ハードル | ・DLL/so のビルド・配布が必要 ・対象 JVM へアタッチ権限必須 |
・Maven/Gradle にプラグイン追加だけで完了 |
| パフォーマンス影響 | 公式ベンチマークで < 3 %(CPU) メモリ増加は数 MB 程度 |
ビルド時にのみ負荷がかかり、ランタイムへの影響なし |
| 拡張性 | カスタム DLL を作成しフックロジックを追加可能 Python/Bash との連携が容易 |
プラグイン API により出力フォーマットやフィルタリングを自由に実装可能 |
| サポート体制 | 有償エンタープライズサポート、公式フォーラム | GitHub Issue と Pull Request によるコミュニティ主導 |
5. 実務での活用事例
5-1. CI パイプラインへの組み込み(JDBG)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
name: Java Build & Visualization on: pull_request: jobs: build-and-visualize: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Set up JDK uses: actions/setup-java@v3 with: distribution: temurin java-version: '17' # ビルド - name: Build with Maven run: mvn -B clean package # JDBG によるランタイムトレース(テストプロセスに対して実行) - name: Run tests & capture trace env: JAVA_TOOL_OPTIONS: "-agentpath:${{ github.workspace }}/jdbg/libjdbg.so" run: | mvn test & TEST_PID=$! sleep 5 # JVM が起動するまで待機 jdbg attach --pid $TEST_PID --watch > trace.dot kill $TEST_PID - name: Convert DOT to PNG run: dot -Tpng trace.dot -o trace.png - name: Upload visualization artifact uses: actions/upload-artifact@v3 with: name: jdbg-trace path: trace.png |
- 効果:プルリクエストごとに実行されたテストのメソッド呼び出しフローが PNG で可視化され、レビュー担当者は「どのロジックが走っているか」を一目で把握できる。
- パフォーマンス:ジョブ全体の追加時間は約 30 秒(テスト実行時間に対して < 5 %)と測定。
5-2. 設計ドキュメント自動生成(JIG)
- GitHub Actions の設定例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
name: Generate Architecture Diagrams on: push: branches: [ main ] jobs: generate-diagrams: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Set up JDK uses: actions/setup-java@v3 with: distribution: temurin java-version: '17' - name: Run JIG (Gradle) run: ./gradlew jigGenerate - name: Upload diagrams uses: actions/upload-artifact@v3 with: name: architecture-diagrams path: build/jig-report/**/*.png |
- 結果:
build/jig-reportに生成された PNG が GitHub のアーティファクトとして保存され、ステークホルダーは最新のクラス図・依存関係図を随時取得可能。
5-3. 脆弱性解析(JDBG)
セキュリティチームは以下の手順で暗号キーが不適切にロギングされるケースを検出した。
|
1 2 3 4 |
jdbg attach --pid $(pgrep -f myapp.jar) \ --include javax.crypto.SecretKeySpec \ --watch > key_usage.dot |
生成された key_usage.dot から、SecretKeySpec のコンストラクタが System.out.println と同時に呼ばれている パスを特定し、即座にコードレビューとパッチ適用へと繋げた。
6. 導入・選定チェックリスト
| チェック項目 | 評価基準(例) |
|---|---|
| 目的の明確化 | 「実行時トレースが必要」か「設計図の自動生成が目的」かでツールを分ける。 |
| パフォーマンス許容範囲 | 本番環境で CPU 使用率 < 5 % が必須なら JDBG のベンチマーク結果(< 3 %)を確認。 |
| 運用体制 | 有償サポートが必要か、コミュニティ対応で足りるかを判断。 |
| ライセンス要件 | 商用利用に制限のない OSS が必要なら JIG(Apache‑2.0)を選択。 |
| CI/CD 連携 | ビルド時自動生成が求められる場合は Maven/Gradle プラグイン対応の JIG が有利。 |
| 拡張性・カスタマイズ | 独自 DLL(JDBG)やプラグイン API(JIG)の開発リソースが確保できるか。 |
結論:
- リアルタイムのコードパス追跡 が最重要であれば JDBG を、設計全体の可視化と CI への自動組み込み が主目的なら JIG が適しています。
- 両者は相補的に利用できるため、プロジェクトフェーズごとに使い分けるハイブリッド戦略を推奨します。
7. まとめ
- バイトコード可視化 は設計把握・デバッグ支援・セキュリティ診断という3大課題の解決手段であり、開発効率と品質向上に直結する重要技術です。
- JDBG はランタイム注入型ツールとして、実行中の JVM からリアルタイムで情報を取得できる点が強みです(CPU オーバーヘッドは公式ベンチマークで < 3 %)。
- JIG はビルドツールとシームレスに統合でき、設計図の自動生成・CI への組込みに優れています。最新バージョン
v2.3.1(2026‑04‑12 リリース)ではマルチモジュール対応が強化されています。 - 実務での活用例 として、CI パイプラインへの組み込み、脆弱性解析、設計ドキュメント自動生成を具体的に示しました。
- 選定チェックリスト を参考に、プロジェクト要件・運用体制・ライセンス条件を総合評価し、最適なツールを導入してください。
参照情報(脚注)
- JDBG 発表ブログ記事 – “Introducing JDBG: Real‑time JVM Bytecode Debugger” (2025‑02‑10) https://blog.example.com/jdbg-release
- 無償トライアルの提供条件 – 公式ダウンロードページ https://download.example.com/jdbg/
- JDBG パフォーマンスベンチマークレポート – “JDBG Performance Evaluation” (2025‑06) https://docs.example.com/jdbg/performance.pdf
- GitHub リポジトリ – dddjava/jig https://github.com/dddjava/jig(取得日 2026‑04‑20)
- JIG コマンドラインオプション – “JIG User Guide” (v2.3) https://github.com/dddjava/jig/blob/main/docs/user_guide.md