如何转储Java对象来自JVM堆旧代?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何转储Java对象来自JVM堆旧代?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1466字,纯文字阅读大概需要3分钟。
内容图文
![如何转储Java对象来自JVM堆旧代?](/upload/InfoBanner/zyjiaocheng/788/c9abe86817bc4555aa1deafece90c494.jpg)
是否有任何工具可以转储旧一代的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对象来自JVM堆旧代?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。