2012-05-08 4 views
0

を実行していないガベージコレクションは、私に次の情報が表示されます -私は出力をのGarbageCollectorMXBean使用して、ガベージコレクションの詳細を印刷していた場合、コードキャッシュメモリプールの

Name: PS ScavengeCollection 
count: 72 
Collection time: 3041 
Memory Pools: PS Eden Space PS Survivor Space 

Name: PS MarkSweepCollection 
count: 5 
Collection time: 4922 
Memory Pools: PS Eden Space PS Survivor Space PS Old Gen 

今かなり正しくScavengeCollectionとMarkSweepコレクションはの4をカバー

コードキャッシュ(非ヒープメモリ)を除く5の使用可能なメモリプール。

私は、ガベージコレクションは、コードキャッシュメモリプールがCodeCacheManagerメモリプールによって管理

のために走ったことがない理由を知りたいです。

これは、GCがCodeCacheManagerメモリプールからオブジェクトをガベージコレクトしないことを意味しますか?

同じ意味がありますか?

答えて

1

MemoryMXBeanのマニュアルを参照してください。 非ヒープメモリについて具体的に一部:

Java仮想マシンは、ヒープ以外のメモリを管理します(非ヒープメモリとして を呼びます)。 Java仮想マシンには、すべてのスレッド間で が共有されるメソッド領域があります。メソッド領域は非ヒープ メモリに属します。ランタイム定数 プール、フィールドおよびメソッドのデータ、メソッドのコード、および コンストラクタなどのクラスごとの構造を格納します。これは、Java仮想マシンの起動時に作成されます。

メソッド領域は論理的にヒープの一部ですが、Java仮想マシン マシンの実装は、ガベージコレクトまたは をコンパクトにすることを選択できません。ヒープと同様に、メソッド領域は固定サイズの であるか、拡張および縮小することができます。メソッド領域 のメモリは連続している必要はありません。

メソッド領域に加えて、Java仮想マシン実装 は、内部処理または最適化にメモリを必要とする可能性があります。 は非ヒープメモリに属します。たとえば、JITコンパイラでは、Javaの 仮想マシンコードから変換されたネイティブマシンコードを格納するためのメモリが、高性能のためには のメモリを必要とします。

ノンヒープメモリにはどのようなものがありますか?

永続的生成:クラスおよびメソッドオブジェクトなど、仮想マシン自体のすべての反射データを含むプール。クラスデータ共有を使用するJava VMでは、この世代は読み取り専用領域と読み書き領域に分かれています。

コードキャッシュ:HotSpot Java VMには、ネイティブコードのコンパイルと格納に使用されるメモリを含むコードキャッシュが含まれています。

+0

リンクありがとうございましたが、実際にMXBeanを使用する前に、すでにit.Infact経由で行っています。私はNotificationEmitterを理解するために同じリンクを使いました。今あなたのポストは本当に私の質問に答えることはありません。私はなぜGCがコードキャッシュのために走ったのか知りたがっています.JVMに依存するなら、コードキャッシュをGCで利用できる特定のシナリオがあるかもしれません。 GCに適格であるがGCが実行されなかった多くのオブジェクトは潜在的なloopHoleを示していませんか? – AngelsandDemons

+0

これを経験的にテストしたい場合は、JConsoleを実行する必要があります。コードキャッシュを表示し、max(これは難しいでしょう)に記入し、何が起こるかを見てください。コードキャッシュは、JVMによってコンパイルされるメソッドに使用されます。それに対して直接的にプログラムすることはできません。 –

0

コードキャッシュはガベージコレクトされていますが、通常のGCスレッドでは収集されない非ヒープスペースです。代わりに、JITのヘルパースレッドによって収集されるため、他のメモリプールが表示されるのと同じように表示されません。残念ながら、Code Cache MXBeanは通知をサポートしていないため、メモリ使用量を監視する別の方法をポーリングするか、あるいは別の方法を考えなければなりません。

コードキャッシュ内のブロブを移動できないため、コードキャッシュを圧縮できないという意味です。したがって、メモリが大量になる可能性がありますが、断片化している場合でも割り当てエラーが発生する可能性があります。JITスレッドが正しければキャッシュを積極的にクリーニングしてJITをシャットダウンします。 JVMの存続期間中は再起動されません。

関連する問題