home wiki.fukuchiharuki.me
Menu

参照:まず、ここが丁寧で分かりやすい。

ヒープとスタック

メモリには

  • ヒープと
  • スタックがあって

ヒープはnew(alloc)して確保するのに使う。スタックは関数呼び出しで確保するのに使う。

スタック

関数を呼び出すと関数ごとにフレームという単位でスタックに領域が確保される。

main() {
  a();
}
a() {
  b();
}

とすると

┌──┐
│main│↓下向きに積まれるとして
├──┤
│a   │
├──┤
│b   │
└──┘

関数ローカルな変数がここで確保される。

ヒープ

動的にメモリをallocするのに確保する領域。クラスをnewしてインスタンス化するものはすべてここ。

┌──────────────┬──────────────┐
│New領域                     │Old領域                     │
│<--- Eden ---><- Survivor ->│                            │
└──────────────┴──────────────┘

New領域とOld領域

ヒープ領域もいろいろありNew領域とOld領域がある。

短命なインスタンスはNew領域で済ませたい、ということがあり頻繁にnewしては破棄するならNew領域が大きいほうがよい、ということになる。が、Old領域が少な過ぎてもフルGCがはたらきやすくなるので宜しくない。

-XX:NewRatio=2

New領域に対するOld領域の割合を指定する。この場合 New領域:Old領域 = 1:2 になる。

Eden領域とSurvivor領域

New領域もいろいろあり(またか)Eden領域とSurvivor領域がある。

New領域のなかでさらに効率化するための仕組み。Survivor領域の割合が小さいとOld領域に行きやすくなる。

-XX:SurvivorRatio=8

Survivor領域のFrom空間とTo空間に対するEden領域の割合を指定する。この場合 Eden領域:Survivor領域 = 8:(1+1) になる。