2014-09-30 11 views
7

Bellek kullanımı son derece yüksek olduğundan, uygulamanızın x64 versiyonunu profilliyordum, hepsi JavaFX MediaPlayer'dan geliyor gibi görünüyor, doğru şekilde dinleyicileri serbest bırakıyorum ve eventhandlers.Java - Tek x32 ile x64 arası bellek tüketimi

İşte tam karşıtlık. x64 bir konser üzerine ateş olurken

başında başlamasından

enter image description here

de x32 sürümü Ve şimdi x64 versiyonu

enter image description here

x32 versiyonu 256MB altında kalır; Bu her ikisi de kendi çalma listesi üzerinden oynamak için bırakılır.

Tüm kodlar aynıdır.

JDK: jdk1.8.0_20

JRE: jre1.8.0_20 başka x64 Java uygulaması

enter image description here

üzerinde meydana gelen hem

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

Aynı konuda

VM argümanlar

Bu bir hata mı yoksa biraz şey?

cevap

3

Gördüğünüz şey, işleminizi yürüten tüm JVM'nin bellek kullanımıdır. -Xmx256m ayarı, uygulamanızın kullanabileceği maksimum yığın alanını yalnızca sınırlar (ve JVM bunu zorlar). yığın alanı dışında, JVM başka amaçlar bir dizi için ek bellek kullanabilir (ben aşağıdaki listede birkaç özleyeceğim eminim): Şimdi Metaspace ile değiştirilir etti

  • PermGen. documentation göre bu için varsayılan bir sınırı vardır.

    -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. 
    
  • yığın alanı (bellek kullanılan ipliklerin = (sayı) * yığın boyutu için -Xss parametre

  • ile kontrol edebilir off-yığın boşluk (kodunuzda ByteBuffers kullanımı veya eHCache gibi üçüncü pary kütüphanelerinin kullanımı ya yönelecek dönüş kullanım dışı yığın bellekte)

  • JNI'yı kodu

  • GC, siz "neredeyse görüyoruz Senin durumunda

(çöp toplayıcılar tekrar yığın parçası değildir ve kullanılan kollektör ve uygulama belleği kullanıma bağlı olarak büyük ölçüde değişiklik gösterebilir kendi hafızasını gerekir) bellek kullanımını iki katına çıkarmak, artı 32bit'den 64 bit JVM'ye geçtiğinizde muhtemelen daha rahat bir şekilde Metaspace tahsisi. -XX:MaxMetaspaceSize=128m kullanmak muhtemelen 64 bit JVM için bellek kullanımını 512 MB'ın altına getirecektir.

+0

Bu değişikliklerden haberdar değildim ve parametreyi uygulamamın sarıcısına ekledim ve bellek kullanımı x32 uygulamasınınkiyle aynı. Teşekkür ederim. – user3037561

0

Uygulamanızı, nasıl uygulandığını bilmiyorum.

Böyle bir sürpriz farkın olası bir nedeni, bir çöp toplama işlemi gerçekleştirilmeden önce ne kadar belleğin kullanılabileceği olabilir. 64 bitlik bir kelimeye sahip bir makinenin, daha fazla bellekle, ardından 32 bitlik kelimelerle bir makineye tahsis edilmesi düşünülebilir. Çöp toplayıcı daha az sıklıkta çalışabilirdi, bu yüzden gerçekten gerekli ya da kullanışlı olmadığında bile daha fazla tahsis edilmiş bellek tahsis edilirdi.