代码之家  ›  专栏  ›  技术社区  ›  chillitom Cee McSharpface

Java堆不断缩小!堆大小图中发生了什么?

  •  4
  • chillitom Cee McSharpface  · 技术社区  · 14 年前

    这是一个运行ActiveMQ的JVM(win64,6u17)的屏幕截图,每次垃圾收集后堆的大小都在减小。随着堆大小的减小,垃圾收集变得更加频繁,堆的减少也更快。最终虚拟机锁定,因为它在GC中花费了所有的时间。

    -Xms公司 -Xmx公司

    发生什么事了!!?我怎样才能避免这种情况?

    http://imagebin.org/92614

    Shrinking heap http://imagebin.org/index.php?mode=image&id=92614

    n、 b最初发布于服务器故障.com,已移至stackoverflow.com网站按要求

    3 回复  |  直到 14 年前
        1
  •  8
  •   jstricker    11 年前

    谷歌给我找到了以下来自 IBM JVM FAQ (NLA的情况如何):

    Java堆何时收缩?

    当GC确定有大量可用堆存储时,就会出现堆收缩,释放一些堆内存有利于系统性能。堆收缩发生在GC之后,但当所有线程仍然挂起时。

    Ergonomics in the 5.0 Java Virtual Machine .

    堆将增长或收缩到支持所选吞吐量目标的大小。在初始化期间以及在应用程序的行为发生变化期间,堆的大小可能会发生一些波动。

    ...

    当垃圾回收器试图满足竞争目标时,堆的大小通常会振荡。即使应用程序已达到稳定状态,也是如此。实现吞吐量目标(可能需要更大的堆)的压力与最大暂停时间和最小占用空间(两者都可能需要较小的堆)的目标竞争。

        2
  •  6
  •   mR_fr0g    13 年前

    有一个JVM参数控制堆的大小。

    -二十: 最大自由度

    默认值为70。空闲比率是堆上未分配的空间占堆总大小的比例。如果可用空间的百分比超过默认值70%,jvm将减少堆的大小以允许操作系统使用内存。

    如果堆收缩得太频繁,可以增加-XX:MaxHeapFreeRatio的值。如果设置为100,它可能永远不会滑冰。

        3
  •  0
  •   Jens Schauder    14 年前

    至于如何避免。你为什么要避免呢?看起来你的CPU负载是零。所以你可以让gc做任何它想做的事情