5

如果我在任何时候使用 -Xms256M 和 -Xmx512M 启动我的 JVM,我是否可以确定专门分配给堆的年轻代和终身代的空间量?

4

2 回答 2

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 工作。

如果您希望以编程方式执行此操作,VisualVMjvisualvm在 JDK 中)允许您监视堆使用情况以及许多其他漂亮的东西。


(来源:java.net

但是请注意,VisualVM 不支持开箱即用地监控特定的内存池。你需要安装jvmstat。然后,您必须从 VisualVM 的插件管理器安装Visual GC插件。

http://puu.sh/YCpX

安装并重启 Visual VM 后,我们可以通过 Visual GC 选项卡更深入地查看堆使用情况。

http://puu.sh/YCqD

于 2012-08-25T07:47:48.770 回答
1

使用JConsole轻松监控堆大小。您可以在内存选项卡中看到不同的生成大小。从图表下拉列表中选择您想要的生成。

于 2012-08-25T07:46:40.277 回答