如果我使用-Xms256M和-Xmx512M启动我的JVM,在任何时候,我可以确定专门分配给堆的年轻和终身代的空间量吗?
答案 0 :(得分:8)
我认为你的意思是以编程方式确定 。你应该看看java.lang.management
。特别是ManagementFactory.getMemoryPoolMXBeans
在这里应该是有用的。
final List<MemoryPoolMXBeans> pools = ManagementFactory.getMemoryPoolMXBeans();
for (final MemoryPoolMXBean pool : pools) {
if (pool.getType() == MemoryType.HEAP) {
final String name = pool.getName();
final MemoryUsage usage = pool.getUsage();
if (name.startsWith("Eden")) {
System.out.println("found eden: " + usage);
} else if (name.startsWith("Tenured")) {
System.out.println("found tenured: " + usage);
}
}
}
这应该可以使用HotSpot JVM。
如果您 想要以编程方式执行此操作,VisualVM(JDK中的jvisualvm
)允许您在许多其他漂亮的东西中监视堆使用情况。
但请注意,VisualVM缺乏对开箱即用的特定内存池的监控支持;您需要安装jvmstat。然后,您必须从VisualVM的插件管理器安装 Visual GC 插件。
安装并重新启动Visual VM后,我们可以通过Visual GC选项卡查看更深入的堆使用情况。
答案 1 :(得分:1)
使用JConsole轻松监控堆大小。您可以在内存选项卡中看到不同的gen大小。从图表下拉列表中选择所需的gen。