x32和x64之间的内存消耗量很奇怪

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

这是鲜明的对比。

开始时的x32版本

现在在x64版本开始

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应用程序出现同样的问题

这是一个错误还是我忽略了一些东西?


你看到的是运行你的进程的整个JVM的内存使用情况。 -Xmx256m设置仅限制应用程序可分配的最大堆空间(并且JVM将强制执行此操作)。 在堆空间之外,JVM可以使用额外的内存来实现其他目的(我相信我会在下面的列表中错过几个):

  • PermGen现在已经被Metaspace所取代。 根据文档,这没有默认的限制:

    -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这样的第三个pary库,然后使用堆外存储器)

  • JNI代码

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

  • 就你而言,你看到的内存使用“几乎翻倍”,再加上从32位移动到64位JVM时可能更放松的Metaspace分配。 使用-XX:MaxMetaspaceSize=128m可能会将64位JVM的内存使用率降低至512MB以下。


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

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

    链接地址: http://www.djcxy.com/p/22935.html

    上一篇: Odd memory consumption between x32 and x64

    下一篇: Handling new iPhone screen sizes with a background image