【问题标题】:Very Large Heap Size, But Small Used Memory非常大的堆大小,但使用的内存很小
【发布时间】:2012-09-21 13:36:50
【问题描述】:

我在我的应用程序中看到非常大的堆大小,但使用的内存非常小:

堆大小:10 GB+, 已用内存:500 MB

这是怎么解释的?为什么堆大小没有减少。

我的java内存参数如下:

-Xms8448m -Xmx12544m -XX:PermSize=192m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=60

请指教,为什么会出现这种奇怪的行为。我可以在图中看到已用内存被垃圾收集,但是堆内存有什么问题????

【问题讨论】:

    标签: java memory garbage-collection heap-memory


    【解决方案1】:

    参数中的初始堆大小

    -Xms8448m
    

    超过 8GB。另外,

    -Xmx12544m
    

    允许 JVM 让它增长到超过 12GB,如果内存可用并且它认为这是最好的堆大小,它可能会这样做并且永远不会释放它。规范中根本没有说 JVM 应该尽量保持堆大小较小。

    【讨论】:

    • 是的,没错,我明白.. 但是为什么堆大小几乎是 12 GB?我不知道为什么。事实上,现在堆大小等于最大堆大小。
    • @Jasper:它是 java,它正在成长,因为它可以。如果您希望它使用更少的堆空间,请减小它的最大堆大小以及它的初始堆大小。
    【解决方案2】:

    HotSpot JVM 中的堆大小永远不会下降。尽管一些 GC 算法可以将内存还给操作系统。但是在以后的情况下,JConsole 不会显示内存减少(在 JConsole 中,您会看到为堆保留的地址空间范围),您应该使用 OS 进程内存监控来查看 JVM 实际释放内存。

    可以将未使用的内存返还给操作系统的算法是

    • 串行收集器 (-XX:+UseSerialGC)
    • G1 (-XX:+UseG1GC)

    【讨论】:

      【解决方案3】:

      您使用-Xms8448m 将初始堆大小指定为~8.5GB。 java 的一些实现不支持实际缩小堆(通常是由于系统限制)。减小该值以获得更小的初始堆。

      【讨论】:

        【解决方案4】:

        删除上面的 -Xms8448m 。它指定初始堆大小。如果您删除它,它应该会按预期工作。

        【讨论】:

          【解决方案5】:

          JVM 将启动时的最大堆大小保留为虚拟内存。这块内存中有多少是主内存取决于使用了多少。

          当您设置最小内存时,它并不能保证它会被使用,但它只会尽可能少地尝试限制内存使用量。

          但为什么堆大小接近 12 GB?

          这是你设置的。

          【讨论】:

            猜你喜欢
            • 2013-01-16
            • 2010-09-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-01-20
            相关资源
            最近更新 更多