微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 为什么JVM不使用更多堆内存

我尝试像这样增加堆内存:

-Xmx9g -xms8g

说实话,只因为我可以.

现在我想知道,为什么JVM不会使用更多,并且不太频繁地安排GC.

系统:
JVM:Java HotSpot(TM)64位服务器VM(24.51-b03,混合模式)
Java:版本1.7.0_51,供应商Oracle Corporation

编辑:
我想改进我的建模过程配置(吞吐量击败响应).

解决方法

Java 1.7 separates the heap into a few spaces中的HotSpot JVM以及此讨论的相关内容如下:

>伊甸园,新物体的去处
>幸存者,如果在伊甸园之后他们需要物品,那么物体就会消失

分配新对象时,它只是附加到Eden空间中.一旦伊甸园已满,它就会被称为“次要收藏品”. Eden中仍然可以访问的对象被复制到Survivor,然后擦除Eden(因此收集任何未复制的对象).

你想要的是填满伊甸园,而不是整个堆.

例如,拿这个简单的应用程序:

public class Heaps {
  public static void main(String[] args) {
    Object probe = new Object();
    for (;;) {
      Object o = new Object();
      if (o.hashCode() == probe.hashCode()) {
        System.out.print(".");
      }
    }
  }
}

探测器就是为了确保JVM无法优化循环;重复的新Object()就是我们所追求的.如果使用认的JVM选项运行它,您将得到一个类似于您所看到的图形.对象分配在Eden上,这只是整个堆的一小部分.一旦Eden已满,它就会触发一个次要集合,它会清除所有这些新对象并将堆使用率降低到接近0的“基线”.

那么,你如何填满整个堆?设置伊甸园非常大! Oracle发布了其heap tuning parameters,这里相关的两个是-XX:NewSize和-XX:MaxNewSize.当我使用-xms9g -XX运行上述程序时:NewSize = 8g -XX:MaxNewSize = 8g,我得到的东西更接近你的预期.

在一次运行中,这几乎耗尽了所有堆,以及我指定的所有Eden空间;后续的运行只占我指定的Eden的一小部分,正如你在这里看到的那样.我不太清楚为什么会这样.

VisualVM有一个名为Visual GC的插件,可以让您查看有关堆的更多详细信息.这是我的一个屏幕截图,在恰当的时刻拍摄,显示Eden几乎已满,而旧空间几乎是空的(因为循环中没有任何新的Object()存在于Eden集合中).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐