2014-09-30 33 views
7

我一直在分析我的應用程序的x64版本,因爲內存使用量一直非常高,所有它似乎來自JavaFX MediaPlayer,我正確地釋放偵聽器和事件處理程序。Java - x32和x64之間的奇數內存消耗

這裏形成了鮮明的對比。

的X32版本在啓動

enter image description here

而且現在x64版本在啓動

enter image description here

的X32版本保持低於256MB,而64將拍攝過演出;這是兩個人都在通過他們的播放列表播放。

所有的代碼都是一樣的。

JDK:jdk1.8.0_20

JRE:jre1.8.0_20

兩個

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

同樣的問題VM參數上的其他64位Java應用程序

enter image description here

發生

這是一個錯誤還是我忽略了一些事情?

回答

3

您所看到的是運行您的進程的整個JVM的內存使用情況。 -Xmx256m設置僅限制應用程序可分配的最大堆空間(並且JVM將強制執行此操作)。的堆空間之外,JVM可以使用更多的內存用於其他目的的主機(我相信我會錯過一些在下面的列表):

  • PermGen的,目前已被元空間所取代。按照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參數

  • 控制這離堆空間(或者使用的ByteBuffers在你的代碼,或使用類似的EHCache第三pary庫而後者將在使用離堆內存)

  • JNI代碼

  • GC(垃圾收集器需要自己的記憶,這又不是堆的一部分,可以變化很大,這取決於所使用的收集器和應用程序的內存使用情況)

在你的情況,你所看到的「,幾乎雙倍「的內存使用,當你從一個32位移動到一個64位JVM時,外加一個更加放鬆的Metaspace分配。對於64位JVM,使用-XX:MaxMetaspaceSize=128m可能會將內存使用率降至512MB以下。

+0

我沒有意識到這些變化,我已經將該參數添加到我的應用程序的包裝中,內存使用情況與x32應用程序的使用情況類似。謝謝。 – user3037561 2014-10-01 01:55:26

0

我不知道你的應用程序分別是如何實現的。

這種溢出差異的一個可能的原因可能是在執行垃圾回收之前可以使用多少內存。可以想象,具有64位字的機器被分配更多的存儲器,然後是具有32位字的機器。垃圾收集器運行的頻率較低,所以仍然會分配更多的垃圾內存,即使它並非真正必要或有用。