java - VisualVM 堆大小不遵循已用大小

标签 java performance memory-management javafx-8 visualvm

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

enter image description here

最佳答案

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

一个原因是从操作系统分配内存的成本较高,而且数据一旦写入实际上可能会碎片化。垃圾收集可能会释放内存块,因此已使用的大小会减少,但仍然使用的 block 可能会分布在整个堆内存中。

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

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

关于java - VisualVM 堆大小不遵循已用大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31339999/

相关文章:

java - Java 中的高效 strtod?

c - C 中的动态内存分配 : Problems in Realloc

performance - 如何使用大小为数百 MB 的虚拟数据用 redis-cli 填充 redis?

java - 无法运行 mvn --version

JAVA时序冒泡排序和快速排序算法

java - jackson :拆分一个 json 并填充已知和未知的属性

mysql - BIG 查询 VS 本地查询和搜索 VS 对数据库的多个查询

objective-c - 我的应用程序可以使用多少内存?或者什么是通常的?

performance - data.frame 方法的最有效列表?

java - Spring Boot - 如何配置多个登录页面?