【发布时间】:2015-06-02 15:13:48
【问题描述】:
最近我能够使用 sun.misc.Unsafe 类获取对象的地址。
现在我正试图以编程方式找到我的对象所在的实际代。为此,我想知道每一代的起点和终点。 如果 Java (Oracle JVM) 提供任何工具来解决这个问题?我不相信,因为即使是不同的 GC 也需要不同的内存结构(例如 G1),这使得任务更加有趣:)
这里我想知道的只是代表记忆中世代边界的几个数字,像这样:
young gen: start point - 8501702198
end point - 9601256348
很想听听你关于黑魔法的最疯狂的想法,它可以确定不同世代区域在内存中的位置。
【问题讨论】:
-
即使您能够获得该信息,它在您获得它的那一刻也将是陈旧的,因为 GC 可以在此期间运行并移动生成边界(G1 重新指定区域,其他 GC 可以移动年轻/旧边界)。同样,由于对象被移动,您所做的任何指针运算都会过时。
-
我建议你看看github.com/serkan-ozal/jillegal 这可能是使用 unsafe 挖掘 JVM 内部的最佳库。您可以获取对象存活下来的 GC 计数,而不是查看地址。这可能会告诉你它在哪个地区。
标签: java jvm jmx java-memory-model