JVM メモリアーキテクチャを理解する

Java におけるコードの最適化

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

JVM とは?

  • プラットフォームに依存しない実行環境
  • バイトコード(.class)をマシンコードに変換
  • メモリ管理とガベージコレクション
  • JIT(Just-In-Time)コンパイル
Java におけるコードの最適化

JVM メモリアーキテクチャの概要

JVM メモリアーキテクチャ

Java におけるコードの最適化

スタックメモリ

  • メソッド実行とローカル変数のためのメモリ領域
  • LIFO(後入れ先出し)構造
  • 格納内容:
    • ローカル変数
    • プリミティブ型データ
    • メソッド呼び出し情報
  • サイズを超えると StackOverflowError が発生
Java におけるコードの最適化

ヒープメモリ

  • すべてのオブジェクトと配列を格納
  • new でオブジェクトを生成し、ヒープに割り当て
  • ガベージコレクターが管理
  • 動的なサイズ
  • 世代別に分割
Java におけるコードの最適化

メモリの動作例

public void processData() {
    int count = 0;                  // Stack

String name = "Java"; // Heap
List<String> items = // Reference on Stack new ArrayList<>(); // Object on Heap
items.add(new String("Item")); // Object on Heap }
Java におけるコードの最適化

メモリ効率の良いコーディングパターン

// Inefficient
List<String> list1 = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
    String s = new String("value"); // 1000 objects
    list1.add(s);
}

// Better
List<String> list2 = new ArrayList<>();
String s = "value";  // Single object
for (int i = 0; i < 1000; i++) {
    list2.add(s);
}
Java におけるコードの最適化

まとめ

  • JVM は主にスタックとヒープ領域でメモリを管理
  • スタックメモリ → 高速で、プリミティブ型と参照を格納
  • ヒープメモリ → オブジェクトを格納
Java におけるコードの最適化

練習しましょう!

Java におけるコードの最適化

Preparing Video For Download...