社内se × プログラマ × ビッグデータ

プログラミングなどITに興味があります。

JVM はどのようにデータを保持しているのか

Runtime Data Area と呼ばれる場所に保持されるようになっている。
そこは保持するデータの種類によって、大きく5つに分類されている。

Runtime Data Area

1. Method Area

全ての class データが保持される。
static 変数もここに保持される。
1 つの JVM に対して、ただ一つの Method Area であり、複数のスレッド間でリソースを共有している。
そのため、スレッドセーフではない。

2. Heap Area

全ての Object が保持される。
インスタンス変数や配列(array) などもここに保持される。
1 つの JVM に対して、ただ一つの Heap Area であり、複数のスレッド間でリソースを共有している。
そのため、スレッドセーフではない。

3. Stack Area

プログラム実行中、各スレッドに対しては runtime stack と呼ばれるものが作られる。
各メソッドが呼ばれると、Stack Frame と呼ばれるメモリ領域内に、その stack が生成される。
全てのローカル変数は、ここに生成される。
この領域は共有されていないため、スレッドセーフである。
この Stack Frame は更に3つに分類することができる。

1. Local Variable Array
メソッドに関連するローカル変数の数と、対応する値がここに格納される。

2. Operand stack
何らかの中間処理が必要なとき、この領域が使われる。

3. Frame data
メソッドに対応するすべてのシンボルがここに格納される。
例えば、例外処理においては、catch ブロックの情報がここに格納される。

4. PC Registers

各スレッドがそれぞれ保持するカウンタのような領域。
現在実行中のアドレスや、次の命令のアドレスを保持する。

5. Native Method stacks

ネイティブメソッドの情報を保持している。
各スレッドそれぞれ別々の領域が生成される。

所感

Heap Area については、有名でパフォーマンス等で意識することはあった。
その他については意識していなかったが、細かなパフォーマンスチューニングにおいて、重要な項目になり得ると感じた。
Java のバージョンに依って、若干の仕様が異なる可能性があるが、それぞれの役割について理解しておきたい。

f:id:blueskyarea:20180605233542p:plain