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

Java-x32和x64之间的奇数内存消耗,java,memory-leaks,javafx,Java,Memory Leaks,Javafx,我一直在分析应用程序的x64版本,因为内存使用率高得离谱,所有这些似乎都来自JavaFXMediaPlayer,我正确地发布了侦听器和事件处理程序 这是一个鲜明的对比 x32版本开始时 现在是x64版本的开始 x32版本保持在256mb以下,而x64将通过gig进行拍摄;此时,两人都可以通过播放列表进行播放 所有代码都是一样的 JDK:jdk1.8.0_20 JRE:jre1.8.020 两个参数上的VM参数 -XX:MinHeapFreeRatio=40 -XX:MaxHeapFreeRa

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

这是一个鲜明的对比

x32版本开始时

现在是x64版本的开始

x32版本保持在256mb以下,而x64将通过gig进行拍摄;此时,两人都可以通过播放列表进行播放

所有代码都是一样的

JDK:jdk1.8.0_20

JRE:jre1.8.020

两个参数上的VM参数

-XX:MinHeapFreeRatio=40 -XX:MaxHeapFreeRatio=70 -Xms3670k -Xmx256m -Dsun.java2d.noddraw=true -XX:+UseParallelGC
另一个x64 Java应用程序上也出现相同的问题


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

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

  • PermGen,现在已被元空间取代。根据,此项没有默认限制:

    -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,或者使用第三方库,如EHCache,这将反过来使用堆外内存)

  • JNI代码

  • GC(垃圾收集器需要自己的内存,而内存又不是堆的一部分,根据使用的收集器和应用程序内存使用情况,内存可能会有很大的变化)


就你而言,你看到的是“几乎翻倍”当您从32位JVM移动到64位JVM时,可能需要更宽松的元空间分配。使用
-XX:MaxMetaspaceSize=128m
可能会使64位JVM的内存使用量降至512MB以下。

我不知道您的应用程序是如何实现的


产生如此惊人差异的一个可能原因可能是在执行垃圾收集之前可以使用多少内存。可以想象,与32位字的机器相比,具有64位字的机器分配了更多内存。垃圾收集器的运行频率可能会降低,因此仍会分配更多的垃圾内存,即使它不是真的必要或有用。

我没有意识到这些更改,我已将该参数添加到我的应用程序的包装中,内存使用情况与x32应用程序类似。谢谢。