0Pricing
Java Academy · レッスン

JVM ヒープ領域とオブジェクトのライフサイクル

Young Generation(Eden、Survivor)、Old Generation、Metaspace と、オブジェクトが領域間を移動する仕組みを学びます。

「JVM ヒープ領域とオブジェクトのライフサイクル」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。

JVMメモリモデル

JVMはメモリを複数の領域に分けます。ヒープにはすべてのクラスインスタンスと配列が格納されます。ヒープ外の領域には、Metaspace(クラスメタデータ)、スタックフレーム、ネイティブメモリなどがあります。

Young Generation:Eden領域

新しく割り当てられたオブジェクトはEdenに配置されます。EdenがいっぱいになるとMinor GCが実行されます。生き残ったオブジェクトはSurvivor領域にコピーされます。

// Object allocation starts in Eden:
String s = new String("hello");  // allocated in Eden
List<Integer> list = new ArrayList<>();  // also Eden

Survivor領域:S0とS1

2つのSurvivor領域(S0とS1)には、少なくとも1回のGCを生き残ったオブジェクトが保持されます。オブジェクトはMinor GCのたびにS0とS1の間を交互に移動します。その年齢カウンターが増加します。

Tenuringしきい値

オブジェクトの年齢がTenuringしきい値(デフォルトは15)を超えると、Old Generationに昇格します。大きなオブジェクトはYoung Genを飛ばして、直接Old Genに移される場合があります。

// JVM flags:
// -XX:MaxTenuringThreshold=15  (default)
// -XX:PretenureSizeThreshold=1m  (objects > 1MB go directly to Old Gen)

Old Generation(Tenured領域)

長寿命のオブジェクトはOld Genに配置されます。Major(Full)GCはOld Genを回収するため、よりコストがかかります。長寿命オブジェクトの数を減らすと、Full GCの頻度を下げられます。

Metaspace(Java 8以降)

MetaspaceはJava 8でPermGenに置き換わりました。クラスメタデータ、メソッドのバイトコード、internされた文字列を保持します。ネイティブメモリを使用し、動的に拡張されます(-XX:MaxMetaspaceSizeで上限を設定できます)。

// Flag examples:
// -XX:MetaspaceSize=64m        (initial Metaspace size)
// -XX:MaxMetaspaceSize=256m   (cap to avoid native OOM)

オブジェクト割り当ての高速パス

JVMは、スレッドローカル割り当てバッファー(TLAB)を使用して、同期なしでEdenからメモリを割り当てます。各スレッドはEden内に専用の小さな領域を持ちます。

オブジェクトのライフサイクル:到達可能性

オブジェクトは、GCルート(スタック変数、staticフィールド、JNI参照)から到達可能であれば生存しています。到達できないオブジェクトは、回収の候補になります。

Object a = new Object(); // reachable via local variable
a = null;                 // now unreachable — eligible for GC

Soft、Weak、Phantom参照

SoftReferenceはOOMの前にクリアされます(キャッシュに使用します)。WeakReferenceは次回のGCでクリアされます。PhantomReferenceは、オブジェクト回収後の後処理に使用します。

Cache<String, Image> cache = new LinkedHashMap<>();
// Use SoftReference to let GC reclaim cache under memory pressure:
SoftReference<Image> ref = new SoftReference<>(loadHeavyImage());
Image img = ref.get(); // null if GC collected it

オブジェクトのファイナライズ(避けるべきもの)

finalize()は非推奨で予測できません。GCが回収前に呼び出しますが、呼び出されるタイミングは保証されません。代わりにCleaner(Java 9以降)またはtry-with-resourcesを使用します。

ヒープサイズ設定フラグ

-Xms(初期値)と-Xmx(最大値)でヒープを制御します。本番環境では、ヒープのリサイズによる一時停止を避けるため、両方を同じ値に設定します。

// Recommended production flags:
// -Xms512m -Xmx512m   (fix heap to 512 MB)
// -XX:NewRatio=2       (Old:Young = 2:1)

確認問題

新しく割り当てられたオブジェクトは、JVMヒープ内の最初にどこに配置されますか。

まとめ

JVMヒープにはYoung Gen(EdenとSurvivor)とOld Genがあります。オブジェクトはMinor GCを経るたびに年齢を重ね、昇格します。Metaspaceにはクラスメタデータが保持されます。-Xms/-Xmxとチューニングフラグで制御します。

よくある質問

「JVM ヒープ領域とオブジェクトのライフサイクル」レッスンは無料ですか?

はい。「JVM ヒープ領域とオブジェクトのライフサイクル」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。

「JVM ヒープ領域とオブジェクトのライフサイクル」で何を学びますか?

Young Generation(Eden、Survivor)、Old Generation、Metaspace と、オブジェクトが領域間を移動する仕組みを学びます。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Java Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「JVM ヒープ領域とオブジェクトのライフサイクル」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJava Academyレッスンでコードを書いて実行できますか?

はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. JVM ヒープ領域とオブジェクトのライフサイクル
  2. GC アルゴリズム:Serial、G1、ZGC、Shenandoah
  3. メモリーリークの検出と修正
  4. GC チューニングフラグと JVisualVM によるプロファイリング
← Java Academyに戻る