Up Top

Memory allocation (& GC 処理) : メモリの確保処理 (GC 処理)


概要(Summary)

メモリの確保処理(オブジェクトの確保処理)は, 以下の4つのバイトコード命令で行われる.

どの場合にも, 解放処理には高速な fast-path と低速な slow-path がある. まず fast-path が試され, それが失敗すると slow-path の処理が行われる.

fast-path でメモリ確保に成功している間は GC は実行されない. fast-path で成功せず, さらに slow-path でも確保に失敗すると, メモリ不足と認識されて GC が実行される.

fast-path 及び slow-path の前半部分は, インタープリタ種別や JIT 種別に応じてコードが異なる. また, slow-path の後半部分は, 使用する GC アルゴリズム毎にコードが異なる. slow-path の中間部分だけは, どのケースでも共通のコードが使用される.

備考(Notes)

なお JNI 等でのメモリ確保処理については別項参照 (See: here for details).

メモリ確保処理の流れ (概要)

基本的にはどの場合も以下のような流れになる. "1." の fast-path が失敗した場合にのみ, "2." 以降の slow-path 処理が行われる.

  1. fast-path (See: here, here, here and here for details, (nonqB5bOSe))

fast-path でのメモリ確保処理が行われる. 行われる処理自体はインタープリタ種別や JIT 種別に応じて異なる. また CPU に応じても異なる.

(<= fast-path が存在しているのは new バイトコードの処理パスのみ? #TODO)

確保に失敗した場合は slow-path 1 にフォールバックする.

  1. slow-path 1 (See: here, here, here and here for details, (no289163ZN))

各種の Runtime クラスから slow-path 用のメモリ確保関数が呼び出される. 使用される Runtime クラスはインタープリタ種別や JIT 種別に応じて異なる.

確保に失敗した場合は slow-path 2 にフォールバックする.

なお Runtime から呼び出される関数は, バイトコード種別毎に異なっており, それぞれ以下の通り.

 * new バイトコード命令:            instanceKlass::allocate_instance()
 * newarray バイトコード命令:       oopFactory::new_typeArray()
 * anewarray バイトコード命令:      oopFactory::new_objArray()
 * multianewarray バイトコード命令: arrayKlass::multi_allocate()
  1. slow-path 2 (See: here for details)

以上の処理で確保に成功しなかった場合, どの処理パスでも最終的に CollectedHeap::common_mem_allocate_init() が呼び出される.

この中で, 以下の slow-path 3 と slow-path 4 がこの順に実行され, 確保が試みられる.

  1. slow-path 3 (See: here, here and here for details)

(この処理は UseTLAB オプションが指定されている場合にのみ実行される)

UseTLAB オプションが指定されている場合, TLAB からの確保が試みられる. なお, TLAB の空き容量が足りなければ, 新しい TLAB を確保する処理も行う.

  1. slow-path 4 (See: here, here and here for details)

以上の処理で確保に成功しなかった場合, どの処理パスでも最終的に CollectedHeap::mem_allocate() が呼び出される.

このメソッドは, 必要があれば Garbage Collection を実行してメモリ確保を行う. なお, このメソッドは各 CollectedHeap のサブクラスでオーバーライドされているため, この処理は GC アルゴリズム種別によって異なる.

Subcategories


This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.