JVM MEMORY


                         
                       
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
New领域(寿命が短いオブジェクト)=Eden领域(newによって作成されたばかりのオブジェクト) + Survivor领域(1回以上のGCの対象になり,回収されなかったオブジェクト)
Tenured領域(寿命が長いオブジェクト)                  
                         
•CopyGC Eden領域とSurvivor領域を対象にしたGCです                
•FullGC Tenured領域も含む,JavaVM固有領域全体を対象にしたGCです            
                         
                         
                       
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
Survivor領域 =from空間+To空間。From空間とTo空間は,同じメモリサイズです。          
                         
1.Eden領域およびSurvivor領域のFrom空間にあるJavaオブジェクトのうち,使用中のJavaオブジェクトが,Survivor領域のTo空間にコピーされます。使用されていないJavaオブジェクトは破棄されます。
2.Survivor領域のTo空間とFrom空間が入れ替わります。                
                         
この結果,Eden領域とTo空間は空になり,使用中のオブジェクトはFrom空間に存在することになります。        
                         
                         
                       
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
オブジェクトの退避が発生した場合,Tenured領域に本来格納されないはずの寿命の短いオブジェクトが格納されます。    
これが繰り返されると,CopyGCで回収されるはずのオブジェクトがメモリ空間に残っていくため,Javaヒープのメモリ使用量が増加していき,最終的にはFullGCが発生します。
                         
                         
                       
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
           






       
 
   
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  JavaVMメモリ空間のサイズや割合などを指定するJavaVMオプション    
         
  項番 オプション名 オプションの意味 Default
  1 -Xmx Javaヒープの最大サイズを設定します。 java -XX:+PrintFlagsInitial | grep InitialHeapSize -> 0
  2 -Xms Javaヒープの初期サイズを設定します。 java -XX:+PrintFlagsInitial | grep MaxHeapSize -> 130862280
  3 -XX:MaxMetaspaceSize= Metaspace領域の最大サイズを設定します。 java -XX:+PrintFlagsInitial | grep MaxMetaspaceSize -> 18446744073709551615
  4 -XX:MetaspaceSize= Metaspace領域の初期サイズを設定します。 java -XX:+PrintFlagsInitial | grep MetaspaceSize -> 21810376
  5 -Xmn New領域の初期値および最大値を設定します。

 -Xmn1024m 
=-XX:NewSize==-XX:MaxNewSize==1024m

(1.4or lator)

-XX:NewSize
设置年轻代大小(for 1.3/1.4)    
-XX:MaxNewSize 年
轻代最大值(for 1.3/1.4)
http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#gc_pause
 
  6 -XX:[+|-]HitachiAutoExplicitMemory 自動配置機能を使用する場合に,JavaVMを起動したタイミングでExplicitメモリブロックで使用するメモリを確保します。  
  7 -XX:HitachiExplicitHeapMaxSize= Explicitヒープ領域サイズの最大サイズを設定します。  
  8 -Xss 1スタック領域の最大サイズを設定します。  
  9 -XX:ReservedCodeCacheSize= JavaVMが使用する領域のうち,コードキャッシュ領域の最大サイズを設定します。  
  10 -XX:NewRatio= New領域に対するTenured領域の割合を設定します。  
  が2の場合は,New領域とTenured領域の割合が,1:2になります。  
  11 -XX:SurvivorRatio= Survivor領域のFrom空間とTo空間に対するEden領域の割合を設定します。 java -XX:+PrintFlagsInitial | grep SurvivorRatio -> 8
  に8を設定した場合は,Eden領域,From空間,To空間の割合が,8:1:1になります。  
  12 -XX:TargetSurvivorRatio= CopyGC実行後のSurvivor領域内でJavaオブジェクトが占める割合の目標値を設定します。  
  13 -XX:MaxTenuringThreshold= CopyGC実行時に,From空間とTo空間でJavaオブジェクトを入れ替える回数の最大値を設定します。  
  設定した回数を超えて入れ替え対象になったJavaオブジェクトは,Tenured領域に移動されます。  
         
         
         
  Eden領域      
  newによって作成されたJavaオブジェクトが最初に格納される領域です。    
         
  Survivor領域      
  New領域に格納されていたJavaオブジェクトのうち,CopyGC実行時に破棄されなかったJavaオブジェクトが格納される領域です。Survivor領域は,From空間とTo空間で構成されます。From空間とTo空間のサイズは同じです。
         
  Tenured領域      
  長期間必要であると判断されたJavaオブジェクトが格納される領域です。Survivor領域で指定回数を超えてCopyGCの実行対象となり,破棄されなかったJavaオブジェクトが,この領域に移動されます。
         
  Metaspace領域      
  ロードされたclassなどの情報が格納される領域です。    
  ただし,圧縮オブジェクトポインタ機能が有効な場合,Metaspace領域内にCompressed Class Spaceという領域が作成されます。この領域に,Javaヒープ内のオブジェクトから参照されるクラス情報が配置されます。そして,それ以外のメソッド情報などがCompressed Class Space以外のMetaspace領域に配置されます。圧縮オブジェクトポインタ機能については,マニュアル「アプリケーションサーバ 機能解説 保守/移行編」の「9.18 圧縮オブジェクトポインタ機能」を参照してください。
         
         
         
  参考資料 http://itdoc.hitachi.co.jp/manuals/link/cosmi_v0970/03Y0460D/EY040136.HTM  
         
 
         
 
   
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
   
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
           
  本番環境では基本的に従来のMaxPermanentSizeと同様に設定すべきだろう。      
  特に、独自のクラスローダを実装しており、且つこれらのクラスローダにメモリリークの疑いがある場合、パラメータ「-XX:MaxMetaspaceSize」を指定するべきだ。
           
  Metaspaceは魔法の領域ではない。従来発生していたメモリリークが解消される訳ではないのだ。    
  クラスローディングのメモリリークが疑われる環境では、従来のPermanent領域の上限値が、ある種の”ストッパー”の役割を果たしてきた。
  Metaspaceではこのストッパーが存在しないため、無尽蔵にリークされた領域が広がっていく恐れがある。こういった環境では上限値(-XX:MaxMetaspaceSize)を明示的に設定すべきだろう。
           
  とはいうものの、個々の開発環境では、当領域を意識する頻度は下がると思われる。    
  Metaspace内に格納される情報はクラスおよびメソッドのメタ情報であり、結局の所、これらは”アプリケーションを動かすために必須な情報”である。
  上限値を設定したとしても、領域が不足するようであれば、領域を拡張せざるを得ない。Metaspaceは自動的に伸張されるため、個々の開発者の環境では特段注意を払って設定する必要は無いだろう。
           
           
  Permanent領域とMetaspace領域を比較      
           
  比較項目 Permanent領域 Metaspace領域    
  1.領域の取り扱い ヒープの一種 ネイティブメモリ    
  2.デフォルトの最大容量 環境依存だが60〜80MByte程度 無尽蔵    
  3.サイズ調整用Javaパラメータ -XX:PermSize -XX:MetaspaceSize    
  -XX:MaxPermSize -XX:MaxMetaspaceSize    
  4.格納する情報 クラス/メソッド クラス/メソッド    
  static変数    
  定数や文字列のintern表現(〜Java6まで)    
  5.ガーベッジコレクトの有無 有(FullGC対象) 有(FullGC対象)    
           
           
  参考資料 http://equj65.net/tech/java8hotspot/#vmdescript      
           
           
     
           
                         

你可能感兴趣的:(java)