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

时间:2014-09-30 22:10:50

标签: 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

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

2 个答案:

答案 0 :(得分:3)

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

  • PermGen,现已被Metaspace取代。根据{{​​3}},没有默认限制:

    -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参数控制它

  • 堆外空间(在代码中使用ByteBuffers,或使用第三个pary库,如EHCache,这些库将反过来使用堆外内存)

  • JNI代码

  • GC(垃圾收集器需要自己的内存,它们不再是堆的一部分,根据使用的收集器和应用程序内存的使用情况而有很大差异)

在你的情况下,你看到"几乎翻倍"内存使用,加上从32位移动到64位JVM时可能更放松的Metaspace分配。对于64位JVM,使用-XX:MaxMetaspaceSize=128m可能会将内存使用率降至512MB以下。

答案 1 :(得分:0)

我不知道你的申请,分别是如何实施的。

这种惊人差异的一个可能原因可能是在执行垃圾收集之前可以使用多少内存。可以想象,具有64位字的机器被分配有更多存储器,然后是具有32位字的机器。垃圾收集器的运行频率可能较低,因此仍会分配更多垃圾内存,即使它不是真正必要或有用的。