加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 04:20:40 所属栏目:Java 来源:网络整理
导读:我尝试像这样增加堆内存: -Xmx9g -Xms8g 说实话,只因为我可以. 现在我想知道,为什么JVM不会使用更多,并且不太频繁地安排GC. 系统: JVM:Java HotSpot(TM)64位服务器VM(24.51-b03,混合模式) Java:版本1.7.0_51,供应商Oracle Corporation 编辑: 我想改进我
我尝试像这样增加堆内存:

-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集合中).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读