古い世代のJVMヒープをダンプするツールはありますか?Javaオブジェクトをダンプする方法は、古い世代のJVMヒープから来ましたか?
つまり、オブジェクトが若い世代か古い世代のものかどうかをどのように判断できますか?
古い世代のJVMヒープをダンプするツールはありますか?Javaオブジェクトをダンプする方法は、古い世代のJVMヒープから来ましたか?
つまり、オブジェクトが若い世代か古い世代のものかどうかをどのように判断できますか?
一般的に言えば、答えはいいえ、ありません。これは、JVMはヒープを別のセクションに編成しますが、古い領域だけを見るダンプメカニズムはないためです。実際には、新しいJVMには、eden、survivor(1と2)、新しく生成された多量のオブジェクトを含む古い世代など、いくつかの異なるタイプの領域があります。
jmap
またはjcmd
を使用してヒープダンプを実行することができます。これらには、ライブオブジェクトまたはすべてを生成するオプションがあります。ヒープ・ダンプを分析し、いつどこから来たのかを判断できる可能性がありますが、一般的に知る必要はありません。 「ライブ」オブジェクトを選択すると、実際にはヒープダンプ上でGCが実行され、ライブと見なされないオブジェクトはすべて削除されます。
より良い質問は、達成しようとしていることを理解し、オブジェクトが昇格される頻度などの回答を表示するツール(さまざまなPrintGC *フラグなど)があるかどうかを判断することです。
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");
}
}
}
ニートツール:)しかし、古いgenとnew genを分離するという考えは、古いGCでは本当に適用可能です。 G1GCはヒープレイアウトを別の方法で管理し、以前と同様に2つの連続したセクションに分割されなくなりました。 – AlBlue