2016-04-13 5 views

答えて

0

一般的に言えば、答えはいいえ、ありません。これは、JVMはヒープを別のセクションに編成しますが、古い領域だけを見るダンプメカニズムはないためです。実際には、新しいJVMには、eden、survivor(1と2)、新しく生成された多量のオブジェクトを含む古い世代など、いくつかの異なるタイプの領域があります。

jmapまたはjcmdを使用してヒープダ​​ンプを実行することができます。これらには、ライブオブジェクトまたはすべてを生成するオプションがあります。ヒープ・ダンプを分析し、いつどこから来たのかを判断できる可能性がありますが、一般的に知る必要はありません。 「ライブ」オブジェクトを選択すると、実際にはヒープダンプ上でGCが実行され、ライブと見なされないオブジェクトはすべて削除されます。

より良い質問は、達成しようとしていることを理解し、オブジェクトが昇格される頻度などの回答を表示するツール(さまざまなPrintGC *フラグなど)があるかどうかを判断することです。

3

Oracle JDKまたはOpenJDKを実行する場合は、HotSpot Serviceability Agentsa-jdi.jarでこれを実行できます。それは古い世代の境界を発見することができます。 OldGen境界内のオブジェクト間でヒープヒストグラムを収集する例を次に示します。

古い世代のアドレスをJavaプロセスから見つけることもできます。the related questionを参照してください。

import sun.jvm.hotspot.gc_implementation.parallelScavenge.ParallelScavengeHeap; 
import sun.jvm.hotspot.gc_interface.CollectedHeap; 
import sun.jvm.hotspot.memory.GenCollectedHeap; 
import sun.jvm.hotspot.memory.MemRegion; 
import sun.jvm.hotspot.oops.ObjectHistogram; 
import sun.jvm.hotspot.oops.Oop; 
import sun.jvm.hotspot.runtime.VM; 
import sun.jvm.hotspot.tools.Tool; 

public class OldGen extends Tool { 

    public static void main(String[] args) { 
     new OldGen().execute(args); 
    } 

    @Override 
    public void run() { 
     MemRegion oldRegion = getOldRegion(VM.getVM().getUniverse().heap()); 

     ObjectHistogram histogram = new ObjectHistogram() { 
      @Override 
      public boolean doObj(Oop obj) { 
       return oldRegion.contains(obj.getHandle()) && super.doObj(obj); 
      } 
     }; 

     VM.getVM().getObjectHeap().iterate(histogram); 
     histogram.print(); 
    } 

    private MemRegion getOldRegion(CollectedHeap heap) { 
     if (heap instanceof ParallelScavengeHeap) { 
      return ((ParallelScavengeHeap) heap).oldGen().objectSpace().usedRegion(); 
     } else if (heap instanceof GenCollectedHeap) { 
      return ((GenCollectedHeap) heap).getGen(1).usedRegion(); 
     } else { 
      throw new UnsupportedOperationException(heap.kind() + " is not supported"); 
     } 
    } 
} 
+0

ニートツール:)しかし、古いgenとnew genを分離するという考えは、古いGCでは本当に適用可能です。 G1GCはヒープレイアウトを別の方法で管理し、以前と同様に2つの連続したセクションに分割されなくなりました。 – AlBlue

関連する問題