Java - x32 和 x64 之间的奇数内存消耗

标签 java memory-leaks javafx

我一直在分析我的应用程序的 x64 版本,因为内存使用率高得离谱,所有这些似乎都来自 JavaFX MediaPlayer,我正确地释放了监听器和事件处理程序。

这是一个鲜明的对比。

开始时的 x32 版本

enter image description here

现在开始时是 x64 版本

enter image description here

x32 版本保持在 256mb 以下,而 x64 将超过演出;这是两人都在播放他们的播放列表的时候。

所有的代码都是一样的。

JDK: jdk1.8.0_20

JRE: jre1.8.0_20

两者的 VM 参数

-XX:MinHeapFreeRatio=40 -XX:MaxHeapFreeRatio=70 -Xms3670k -Xmx256m -Dsun.java2d.noddraw=true -XX:+UseParallelGC

同样的问题发生在另一个 x64 Java 应用程序上

enter image description here

这是一个错误还是我忽略了什么?

最佳答案

您看到的是运行您的进程的整个 JVM 的内存使用情况。 -Xmx256m 设置仅限制可供应用程序分配的最大堆空间(JVM 会强制执行)。在堆空间之外,JVM 可以将额外的内存用于许多其他目的(我相信我会遗漏下面列表中的一些):

  • PermGen,现在已被 Metaspace 取代。根据documentation ,对此没有默认限制:

    -XX:MaxMetaspaceSize=size
    Sets the maximum amount of native memory that can be allocated for class metadata. By default, the size is not limited. The amount of metadata for an application depends on the application itself, other running applications, and the amount of memory available on the system.
    
  • 堆栈空间(使用的内存 =(线程数)* 堆栈大小。您可以使用 -Xss 参数控制它

  • 堆外空间(在您的代码中使用 ByteBuffer,或者使用第三方库,例如 EHCache,后者又会使用堆外内存)

  • JNI代码

  • GC(垃圾收集器需要自己的内存,这又不是堆的一部分,并且可能因所使用的收集器和应用程序内存使用情况而有很大差异)

在您的情况下,当您从 32 位 JVM 迁移到 64 位 JVM 时,您会看到内存使用“几乎翻了一番”,而且元空间分配可能更加宽松。使用 -XX:MaxMetaspaceSize=128m 可能会将 64 位 JVM 的内存使用量降低到 512MB 以下。

关于Java - x32 和 x64 之间的奇数内存消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26130982/

相关文章:

java - hibernate/ Spring : Not-null property references a null or transient value

c++ - std::exit 会泄漏内存吗?

event-handling - 如何在 JavaFX 中移动 VBox 中的项目(通过拖动更改顺序)?

java - Richfaces扩展数据表

java - Java list 中的换行符

java - 在 Excel 中生成报告

java - 如何使用泄漏金丝雀

java - Process.exec() 中的 JVM 内存泄漏

java - 将 swingNode 添加到 javaFx

java - 为什么向 BorderPane 添加另一个元素会弄乱我的格式?