JDK 1.8ゴミ回収

4277 ワード

あなたは気づきましたか?JDK 8の早期アクセス可能バージョンはすでにダウンロードされています。java開発者は、java 8が提供する新しい言語と実行特性を利用して、いくつかの実験を行うことができます。その中の一つの特性は完全に永久代を除去することです。これはJDK 7からOracleが動作し始めました。例えば、ローカライズされたStringはJDK 7から永久代を除去されました。JDK 8は最終的に引退させました。
本稿では今まで私が収集してきたパーペチュアル(Permanent Generation)の代替者である元空間(Metaspace)に関する情報を共有します。JAVAプログラムを実行する時にHotSpot 1.7とHotSpot 1.8(b 75)の動作を比較します。
メタスペースの最後の仕様、調整パラメータ、ドキュメントはJava 8の正式発表後に公開されます。
 
メタスペース:新しいメモリ空間の誕生 Oracle JRockitやIBM JVMと同様に、JDK 8.HotSpot JVMはローカライズされたメモリ格納類のメタデータを使い始めました。この空間はメタスペースといいます。
良いメッセージは、java.lang.OutOfMemoryErrer:PermGenの空間的な問題が再び存在しなくなり、このメモリ空間を調整し、監視する必要がなくなります。この変更がデフォルトで実行されると、心配されている種類のメタデータのメモリ占有率の問題が発見されますので、この新しい特性は奇跡的にキャンセルされません。クラスやキャリアのメモリ漏れはありません。これらの問題を追跡するためにいくつかの異なる方法と新しい名詞を使用する必要があります。
永久帯除去のまとめとJonのこの問題に対する意見を読むことをお勧めします。
 まとめ:
永久区の場合:
  • このメモリ空間は完全に除去されました。 
  • JVMパラメータPermSizeとMaxPermSizeは無視されます。現在起動時に警告メッセージがあります。 
  • メタスペースメモリ割り当てモデル
  • 現在、ほとんどのクラスのメタデータがローカライズメモリに割り当てられている。
  • 私たちはクラスのメタデータを記述するためのklassesを除去しました。 
  • メタスペースの容量
  • デフォルトでは、クラスのメタデータは、利用可能な自マシンのメモリ容量に制限されている(容量は依然として、32ビットのJVMを使用するか、64ビットのオペレーティングシステムの仮想メモリの利用可能性に依存している)。 
  • の新しいパラメータが使用できます。クラスメタデータのローカルメモリを制限します。特に指定されていない場合、メタスペースはアプリケーションの実行時のニーズに応じて動的にサイズを設定します。 
  • 元スペースのゴミ回収
  • クラスのメタデータの空間占有率がパラメータ「MaxMetaspaceSize」に設定された値に達した場合、死亡対象と種類加算器のゴミ回収がトリガされます。 
  • ゴミの回収頻度と遅延を制限するためには、適切な監視と調整が必要です。元のスペースが多すぎるごみの収集はクラスを表すかもしれません。種類のキャリアのメモリが漏れたり、あなたのアプリケーションにとって空間が小さすぎます。
  • javaスタック空間の影響 
  • いくつかの様々なデータがJavaスタック空間に転送されました。これは将来のJDK 8のアップグレードを意味します。Javaスタックの空間がどんどん増えていることが分かります。
  • 元空間モニタ
  • 元の空間の使用はHotSpot 1.8から詳細なGCログ出力があります。 
  • 私達はB 75に基づいてテストする時JstatとJVisual VMはまだ進級していません。今も古い永久空間に引用しています。今は十分な理論があります。私たちはJavaプログラムのリーク行為によって、この新しいメモリ空間を観察できます。
  •  永久代と元の空間運行時の対比
    新しいメタ空間の実行時の挙動の特徴をよりよく理解するために、私達は一つのメタデータ流出のjavaプログラムを作成します。ここでソースコードをダウンロードできます。
    私たちは次のシーンをテストします。
     
  • は、JDK 1.7を使用してjavaプログラムを実行し、監視と消耗のために、128 MB
  • に設定される。
  • JDK 1.8(B 75)を使ってjavaプログラムを実行し、新しい元空間メモリの冬成長とゴミ回収を監視します。 
  • JDK 1.8(B 75)を使ってjavaプログラムを実行します。MaxMetaspaceSizeを128 MBに設定することによって、同様に元の空間を使い果たします。
  • JDK 1.7@64-bit–PermGen depletion
  • javaプログラムは50 k回の反復を設定します。 
  • javaのヒープ空間は1024 MB
  • である。
  • javaの永久空間は128 MBである。 (-XX:MaxPermSize=128 m)
  • JVisual VMのレポートをご覧のように、30 K+のクラスをロードすると、永久代が消耗されます。プログラムとGCの出力ファイルから消耗を見つけられます。クラスのメタデータ漏えいシミュレータの作者
    Pierre-Hugues Charbonneaはブログで:
      http://javaeesupportpatterns.blogspot.comにはエラーが記述されています。
     ERROR:java.lang.OutOfMemoryErr:PermGen space
     。
    今はHotSpot JDK 1.8 JREを使ってプログラムを実行しています。
     
    JDK 1.8@64-bit–Metaspace dynamic re-size
  • Javaプログラムは50 kの反復を設定します。 
  • Javaスタック空間は1024 MBである。 
  • Java元空間は無限(標準値)です。 
  •  ご覧のように、GC出力の詳細については、Javaプログラムが増加しているクラスのメタデータのメモリ占有を満たすために、JVM元空間を拡大して20 MBから動的に本マシンのメモリを占有して328 MBに達します。ごみ収集も観察できます。JVMはあらゆる種類や種類のキャリアオブジェクトを破壊しようとしています。私達のJavaプログラムが漏れてから、JVMは元の空間のメモリ空間を拡張しなければなりません。
    このスキームは50 K回反復でき、OOMイベントと50 K+クラスのローディングがない。
    次は最後のテストシーンを見に来ます。
    JDK 1.8@64-bit–Metaspace depletion
  • Java プログラム設定50 k回の反復
  • Java ヒープ空間は1024 MBです 
  • Java元空間は128 MB(-XX:MaxMetaspaceSize=128 m)です。
  • JVisual VMのレポートをご覧のように、30 K+のクラスをロードすると、元の空間が消耗され、JDK 1.7での表現と非常に近いです。プログラムとGCの出力ログからも見つけられます。もう一つの面白い現象は、本機のメモリ保持の占有空間は指定された最大サイズの2倍の大きさです。できれば、本機のメモリの無駄を避けるために。これは,メタ空間拡張サイズを最適化するための戦略が必要であることを示している。
     javaプログラムの出力ログから以下の異常を見つけることができます。
       view source print1.Class metadata leak simulator2.Author: Pierre-Hugues Charbonneau3.「http://javaeesupportpatterns.blogspot.com">>http://javaeesupportpatterns.blogspot.com4.ERROR: java.lang.OutOfMemoryError:Metadata space 5 Done! り、 の サズは128 MBで、JDK 1.7のよに、50 K り しの を させます。JVMが しいOOMエラーを げる。 のOOMイベンは、JVMによって から つのメモリア が した に げ す。  ヽoo。ツ。ツツ。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 この しいJava 8 の と を しています。 の では、 たちの のテストシーで するよような な GCとOOMの から れるまでの には、 な と が です。 の では、この しい に する な を するために、 がうまくいきます。すみません、 か を してください。 :https://search.oracle.com/search/search?start=1&search_ メ-ルンoperator=all&q=dolphin