gpt4 book ai didi

java - 如何转储来自 JVM 堆老年代的 Java 对象?

转载 作者:搜寻专家 更新时间:2023-11-01 03:00:19 24 4
gpt4 key购买 nike

是否有任何工具可以转储老一代的 JVM 堆?

换句话说,我如何判断一个对象是来自年轻代还是老年代?

最佳答案

如果您运行 Oracle JDK 或 OpenJDK,您可以使用 HotSpot Serviceability Agent 执行此操作sa-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");
}
}
}

关于java - 如何转储来自 JVM 堆老年代的 Java 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36588354/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com