【问题标题】:VisualVM heap size doesn't follow used sizeVisualVM 堆大小不遵循已用大小
【发布时间】:2015-09-29 03:46:43
【问题描述】:

我正在使用 VisualVM 来分析一个 javafx 8 应用程序,该应用程序执行一些图形并使用比我想要的更多的内存。它似乎没有泄漏,但由于某种原因,我的总堆从未减少,即使我使用的堆在我选择不同的文件来绘制图表时会上下波动。所有的尖峰都是在我绘制一个新文件时,然后在我退出该屏幕时回落,但总堆只是猛增并保持不变。这正常吗?

【问题讨论】:

    标签: java performance memory-management javafx-8 visualvm


    【解决方案1】:

    是的,这很正常。 JVM 会从操作系统分配更多的堆内存并且不会将其归还,但实际使用情况可能会有所不同,即当前未使用的堆内存部分可能会发生变化。

    一个原因是从操作系统分配内存的成本有些高,而且数据实际上可能在写入后就被分割成碎片。垃圾收集可能会释放内存块,因此使用的大小会减少,但仍使用的块可能会分散在整个堆内存中。

    我不确定 JVM 是如何详细处理的(实际上不同的 JVM 可能会以不同的方式处理),但您可能会查找在这种情况下使用的空闲列表、伙伴系统等。

    有人可能会争辩说,JVM 可以在垃圾收集后对内存进行“碎片整理”,然后释放多余的堆内存,但这会对性能造成很大影响,特别是如果必须在 RAM 甚至虚拟/交换内存。与许多计算问题一样,它是空间和 CPU 使用率之间的权衡。

    【讨论】:

    • 所以只要蓝线没有飙升并随着时间的推移稳定下来,我就可以认为这种泄漏是免费的,对吧?我们假设我们有泄漏,因为任务管理器显示使用量一直在上升,但似乎我们错了,堆在稳定之前只需要更多内存。
    • @Mark 基本上是的。它应该稳定的速度或位置取决于您的应用程序,但只要您没有收到 OutOfMemoryError 就应该没问题。请记住,出于性能原因,堆使用量可能会上升到(几乎)最大值(在您的情况下为 1GB),直到垃圾收集开始使用 stop-the-world 收集。
    猜你喜欢
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 2017-02-20
    • 2018-04-14
    • 2010-12-29
    • 2021-08-24
    • 1970-01-01
    • 2021-05-20
    相关资源
    最近更新 更多