home wiki.fukuchiharuki.me
Menu

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

ヒープとスタック

メモリには

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

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

スタック

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

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

とすると

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

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

ヒープ

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

New領域とOld領域

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

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

Eden領域とSurvivor領域

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

New領域のなかでさらに効率化するための仕組みで、 SurvivorRatioが大きいとOld領域に行きやすくなる。 デフォルト値が8でデフォルトままが推奨のよう。