如何确定JVM中每个堆代的大小?

Par*_*rag 4 java heap jvm

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

old*_*inb 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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这应该可以使用HotSpot JVM.

如果您不想以编程方式执行此操作,VisualVM(jvisualvm在JDK中)允许您监视堆使用以及许多其他漂亮的东西.

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

http://puu.sh/YCpX

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

http://puu.sh/YCqD