JVMメモリモデル学習、記録(オリジナル以外)
出典(引用):http://topic.csdn.net/u/20090602/10/bd9d4ba2-dbeb-49b3-8651-67c5de2b228a.html
図に示すように、JVMは主に2つのサブシステムと2つのコンポーネントを含む.2つのサブシステムはそれぞれClass loaderサブシステムとExecution engine(実行エンジン)サブシステムである.2つのコンポーネントはそれぞれRuntime data area(ランタイムデータ領域)コンポーネントとNative interface(ローカルインタフェース)コンポーネントである.
Class loaderサブシステムの役割:
Java.lang.Objectなどの指定されたフルネームクラス名に基づいて、Runtime data areaのmethod area(メソッド領域)にclassファイルの内容をロードします.Javaプログラマーはextends java.lang.ClassLoaderクラスは自分のClass loaderを書きます.
Execution engineサブシステムの役割:
classesのコマンドを実行します.いかなるJVM specification実装(JDK)の核心もExecution engineであり、SunのJDKやIBMのJDKのような異なるJDKの良し悪しは、主に彼らがそれぞれ実装したExecution engineの良し悪しにかかっている.
Native interfaceコンポーネント:
native librariesとインタラクティブで、他のプログラミング言語とインタラクティブなインタフェースです.nativeメソッドを呼び出すと、新しい仮想マシンに制限されない世界に入るため、JVMでは制御できないnative heap OutOfMemoryも容易に現れます.
Runtime Data Areaコンポーネント:
これが私たちがよく言うJVMのメモリです.主に5つの部分に分けられます.1、Heap(ヒープ):Java仮想インスタンスにはヒープ空間が1つしか存在しません.2、Method Area(メソッド領域):ロードされたclassの情報はMethod areaのメモリに格納されます.仮想マシンがタイプをマウントすると、クラスマウントを使用して対応するclassファイルを位置決めし、このclassファイルの内容を読み込み、仮想マシンに転送します.3、Java Stack(javaのスタック):仮想マシンはJava stackに対して直接2つの操作しか実行しません:フレーム単位のスタックまたはスタック4、Program Counter(プログラムカウンタ):各スレッドには独自のPCレジスタがあり、このスレッドの起動時に作成されます.PCレジスタの内容は、常に次の実行命令に対応する空きアドレスを指し、ここでのアドレスはローカルポインタであってもよいし、方法領域においてその方法開始命令に対応するオフセット量であってもよい.5、Native method stack(ローカルメソッドスタック):nativeメソッドが領域に入るアドレスの上の5つの部分を保存し、HeapとMethod Areaだけがすべてのスレッドの共有で使用される.Java stack,Program counter,Native method stackはスレッドを粒度とし,各スレッドは独自の部分を持っている.
SunのJVM Generational Collectingの原理は,オブジェクトを若い世代(Young),年老いた世代(Tenured),持続的な世代(Perm)に分け,ライフサイクルの異なるオブジェクトに対して異なるアルゴリズムを用いることである.(オブジェクトのライフサイクル分析に基づく)
上図に示すように、Javaスタック内の各世代分布です. 1. ヤング(若い世代)若い世代は3つのゾーンに分かれています.1つのEdenゾーン、2つのSurvivorゾーンです.ほとんどのオブジェクトはEdenゾーンで生成されます.Edenゾーンがいっぱいになると、まだ生きているオブジェクトはSurvivorゾーンにコピーされます(2つのうちの1つ)このSurvivor領域がいっぱいになると、この領域の生存オブジェクトは別のSurvivor領域にコピーされ、このSurvivorが行ってもいっぱいになると、最初のSurvivor領域からコピーされ、このときも生存しているオブジェクトは、古い領域にコピーされます(Tenured.Survivorの2つの領域は対称で前後関係がないので、同じ領域にEdenからコピーされたオブジェクトと、前のSurvivorからコピーされたオブジェクトが同時に存在する可能性がありますが、年老いた領域にコピーされたのは最初のSurvivorからコピーされたオブジェクトだけです.また、Survivor領域には常に空のものがあります.2.Tenured(年老いた世代)年老いた世代が若い世代から生きている対象.一般的に年老いた世代が生きている対象は寿命の長い対象である.3.Perm(永続世代)静的ファイルを格納するために使用されています.Javaクラス、メソッドなどです.永続世代はゴミ回収に大きな影響を与えませんが、Hibernateなどのclassを動的に生成または呼び出すアプリケーションもあります.この場合、これらの実行中に追加されたクラスを格納するために比較的大きな永続世代間を設定する必要があります.永続世代サイズは-XX:MaxPermSize=で設定されます.置く.たとえば、プログラムでオブジェクトを生成すると、通常のオブジェクトは若い世代に空間を割り当てます.あまりにも大きな対象であれば、直接年老いた世代に生成される可能性もあります.(プログラムを実行するたびに10メガの空間用送受信メッセージが生成され、このメモリはそのまま年老いた世代に割り当てられると観測されている).若い世代は空間が割り当てられたときにメモリ回収を開始し、大部分のメモリは回収され、一部の生存したメモリはSurvivorのfrom領域にコピーされ、複数回の回収を経てfrom領域にも割り当てられる完了すると、メモリの回収も発生し、残りのオブジェクトをto領域にコピーします.toゾーンも満杯になると、メモリ回収が再び発生し、生存しているオブジェクトを年老いたゾーンにコピーします.通常、JVMメモリ回収とは常にスタックメモリ回収を指すが、確かにスタック内の内容だけが動的に割り当てられているため、以上の対象の若い世代と年配の世代はJVMのHeap空間を指し、永続世代は前述のMethod Areaであり、Heapに属していない.
個のパラメータの意味:
参照:http://longdick.iteye.com/blog/468368
JVMが起動すると、Heapメモリに固定メモリ領域が保持されています.このメモリは必ずしもJVMによって使用されるわけではありませんが、この保持メモリが他のプロセスによって使用されないことは確認できます.このメモリサイズは
-Xmx 。
です.他の部分にはJVMが存在して起動するとJVMに割り当てられ、JVMの初期Heapメモリとして使用されます.これに影響するパラメータは-Xmsです.-Xmsが指定した値が-Xmxより小さい場合、両者の差はVirtualメモリ値です.プログラムが実行されるにつれて、Eden領域、Tenured領域、Perm領域は、保存されたVirtual空間を徐々に使用します.
具体的な指定がない場合、初期メモリと最大スタックメモリは、マシンのメモリに基づいて計算されます.パラメータ
DefaultInitialRAMFraction
およびDefaultMaxRAMFraction
は、次の表に示すように、最終的な結果に影響します.Formula Default
initial heap size
memory / DefaultInitialRAMFraction
memory /
64
maximum heap size
MIN(memory / DefaultMaxRAMFraction, 1GB)
MIN(memory
/ 4, 1GB)
スタックメモリのデフォルト値は最大1 Gを超えないことがわかります.
JVMは、スタックメモリの使用状況に応じて、実際のスタックメモリのサイズを拡張および縮小するタイミングを自動的に決定します.VMパラメータ
-XX:MinHeapFreeRatio=<minimum>
および-XX:MaxHeapFreeRatio=<maximum> , 32 :
を使用できます.Parameter Default Value
MinHeapFreeRatio
40
MaxHeapFreeRatio
70
-Xms
3670k
-Xmx
64m
空きヒープメモリがヒープメモリに占める割合が40%未満の場合、JVMはヒープメモリ空間を拡張しようとします.空きヒープメモリがヒープメモリに占める割合が70%を超えると、JVMはヒープメモリ領域を圧縮しようとします.
ps:上記のデフォルト値は、64ビットシステムの場合、64ビットシステムの下で大きくなるオブジェクトを収容するために30%拡張する必要があります.
-XX:NewRatio=3
を加えると、young(若い世代)とtenured(生涯世代)の比率が1:3であることを意味し、すなわち、eden領域とsurvivor領域の容量の和は、総スタックメモリの1/4を占める. -XX:SurvivorRatio=6
にeden領域が設定され、そのうちの1つのsurvivor spaceの比率は1:6であり、すなわち、そのうちの1つのsurvivor spaceが若い世代の1/8の容量を占めている(なぜ1/7ではないのか考えられる).他にも
-XX:NewSize
-XX:MaxNewSize 。
32ビットシステムのデフォルト値は次のとおりです.Default Value
Parameter Client JVM Server JVM
NewRatio
8
2
NewSize
2228K
2228K
MaxNewSize
not limited
not limited
SurvivorRatio
32
32