読者です 読者をやめる 読者になる 読者になる

JVMのメモリ領域

仕事でJVM関連のトラブルがあった為、調査メモ

用語

Java Virtual Machine(Java仮想マシン環境)

  • ヒープ

OSやアプリケーションソフトが使用するメモリ領域の一種。用途に関係なく自由に確保することができる。

JVMのメモリ領域

JVMには以下の3つの領域が存在する。

  • Permanent領域(非ヒープ領域)
  • New領域(ヒープ領域)
  • Old領域(ヒープ領域)

それ以外の領域(OS領域としているところ)

  • Cヒープ領域
  • スタック領域


それぞれ以下の情報が格納される。

  • Permanent領域・・・JVMにロードされたクラスやメソッドの情報
  • New領域・・・インスタンス化されたオブジェクトの情報(内訳としてEden,From,To領域がある)
  • Old領域・・・寿命の長いオブジェクトの(Tenured領域)

New領域内はさらに3分割される

  • Eden領域 ・・・ オブジェクトがインスタンス化された際に、はじめに配置される領域
  • From領域 ・・・ Scavenge GC時のオブジェクト退避領域(Survivor領域)
  • To領域 ・・・ Scavenge GC時のオブジェクト退避領域(Survivor領域)

Permanent領域は非ヒープ領域
New領域とOld領域はヒープ領域

GC

  • Scavenge GC ・・・ New領域のみを対象としたGCで、比較的短時間で処理が終了。
  • Full GC ・・・ 主にOld領域とPermanent領域を対象としたGCで、処理に時間がかかる。

メモリ構成図

Java メモリ全体構成図


JVMオプションの見方

オプション 内容
-Xms Javaヒープ初期サイズ。一般的に、-Xmxと同値にする
-Xmx Javaヒープ最大サイズ
-Xmn(-XX:NewSize) New領域初期サイズ。一般的に、-XX:MaxNewSizeと同値にする
-XX:MaxNewSize New領域最大サイズ
-XX:PermSize Permanent領域初期サイズ。一般的に、-XX:MaxPermSizeと同値にする
-XX:MaxPermSize Permanent領域最大サイズ
-XX:NewRatio New領域とOld領域の比率
-XX:SurvivorRatio Eden領域のサイズをS0またはS1領域のサイズで割った値(S0とS1領域は同じサイズ)
-XX:MaxTenuringThreshold New領域において、オブジェクトがマイナーGCを何回超えて生き残ると、Old領域に移動するかのしきい値の最大値(実際のしきい値は、1からMaxTenuringThresholdの範囲で動的に決定される)
-XX:TargetSurvivorRatio Survivor領域がいっぱいと判断される使用率

広告を非表示にする