Bellek yoğun uygulamalar için JVM maksimum yığın boyutunu artırma


88

2 GB'den fazla bellek kullanan bir Java belleği yoğun uygulama çalıştırmam gerekiyor, ancak yığın maksimum boyutunu artırmak için sorunlar yaşıyorum. Şimdiye kadar aşağıdaki yaklaşımları denedim:

  • -Xmx parametresini ayarlama, örneğin -Xmx3000m. Bu yaklaşım, JVM'nin oluşturulmasında başarısız olur. Google'da araştırdığım kadarıyla, -Xmx'in 2GB'den az olması gerektiği anlaşılıyor.

  • Kullanımı + AggressiveHeap seçeneği: -XX . Bu yaklaşımı denediğimde, bilgisayarımda 8 GB bellek olmasına rağmen yığın boyutunun 1273,4 MB olduğunu söyleyen bir 'Yeterli bellek yok' hatası alıyorum.

JVM'nin maksimum yığın boyutunu artırmaya çalışabileceğim başka bir yaklaşım var mı? İşte bilgisayar özelliklerinin bir özeti:

  • İşletim Sistemi: Windows 7 (64 bit)
  • İşlemci: Intel Core i7 (2.66 GHz)
  • Bellek: 8 GB
  • java sürümü:
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) Client VM (build 16.0-b13, mixed mode, sharing)

7
BTW: Minimum ve maksimum bellek boyutu artık standart seçeneklerdir. -Xms ve -Xmx yerine -ms ve -mx kullanabilirsiniz. -X ?? standart olmayan seçenekler için ayrılmıştır.
Peter Lawrey

2
Hangi JVM için standart? HotSpot JVM için hala standart değiller (1.8'den itibaren). Docs.oracle.com/javase/8/docs/technotes/tools/unix/…
Huckle

-mx ve -ms var ve çalışıyor, ancak resmi java belgelerinde bulamıyorum @PeterLawrey> belgelere bağlantı ekleyebilir misiniz? Teşekkürler
Michal Bernhard

2
@MichalBernhard Java 1.1 ile geriye dönük uyumluluğa sahiptir. Bu sürüm için belgelendiğini gördüm, ancak şimdi bulmak zor olabilir. ;)
Peter Lawrey

1
Açıklama için teşekkürler @PeterLawrey. Ancak artık standart olduğunu söylediğinizde, Java 1.1'den standart olduğunu (ancak sonraki sürümlerde belge olmadığını) mı kastediyorsunuz? Garip görünüyor :) btw Java 1.1 belgelerinde bağlantı buldum ve haklısınız: ad.ntust.edu.tw/course/ad5601701/jmdl/docs/java/tooldocs/win32/…
Michal Bernhard

Yanıtlar:



96

JVM'yi 32 bit modunda kullanırken, ayrılabilecek maksimum yığın boyutu 1280 MB'dir. Öyleyse, bunun ötesine geçmek istiyorsanız, 64-modda JVM'yi çağırmanız gerekir.

Aşağıdakileri kullanabilirsiniz:

$ java -d64 -Xms512m -Xmx4g HelloWorld

nerede,

  • -d64: 64 bit JVM'yi etkinleştirir
  • -Xms512m: İlk yığın boyutunu 512 MB olarak ayarlayacak
  • -Xmx4g: Maksimum yığın boyutunu 4 GB olarak ayarlayacaktır

Gereksinimlerinize (YMMV) göre -Xms ve -Xmx'i ayarlayabilirsiniz.

JVM performans ayarlaması hakkında çok iyi bir kaynak, şu konuya bakmak isteyebilir: http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html


JVM'm 32 bit ve maksimum -Xmx1024M'ye izin veriyor. Ayrıca 64bit sürümü deneyecek.
kiltek

JVM 64-bit'i denedim ve mükemmel çalıştı. Artık 4096 MB maksimum yığın boyutu ayarlayabilirim. Hem 32 hem de 64 bit yüklediğinizde, en azından Windows'ta uygulamalarınız için Java yolunu yüklü yeni 64 bit sürüme işaret etmeniz gerekir. Aksi takdirde hata devam eder. Windows'ta bu genellikle sistemin Ortam Değişkenlerinde Java yolu değiştirilerek yapılabilir.
Fabiano

Sanırım maksimum yığın için sınır 1280 değil, 1700MB'ye yakın bir şey. 32 bit JVM kurulumumda 1600MB maksimum yığın kullandım ve iyi çalıştı.
Fabiano

Komutunuzdaki HelloWorld argümanı nedir? linux üzerinde java -jar myApp.jar komutu ile başlatılan bir Java işleminin maksimumunu ayarlamak istersem bu komutu nasıl kullanabilirim?
LordScone

Merhaba, ayarlayabileceğim maksimum java yığın boyutunu sorabilir miyim? Uygulamayı çalıştırdığımda, makinemdeki varsayılan -Xmx 4 GB, ancak 4 GB'tan fazla ayarlayabilir miyim?
Ock

14

2GB sınırının 32 bit Java için olduğuna inanıyorum. V1.6'nın her zaman 64 bit olduğunu sanıyordum, ancak sadece görmek için 64 bit modunu zorlamayı deneyin: -d64 seçeneğini ekleyin.


-D64 seçeneği işe yaramadı, GregS'nin önerdiği gibi 64 bit JVM'yi kullanmayı deneyeceğim ve sonuçları rapor edeceğim.
Alceu Costa

1
-D64 ve -d32 anahtarları yalnızca Solaris'te doğru şekilde çalışır (en azından bu belgelere göre): java.sun.com/docs/hotspot/HotSpotFAQ.html#64bit_layering .
Lukasz Stelmach

Her iki seçeneği de denedim. -D64 ile JVM, Xmx seçeneğini belirtmesem bile başlatılamıyor. -D64 yalnızca Xmx'i belirtmediğimde çalışır.
Alceu Costa

@Lukasz -d64 ve -d32 de Apple'ın JVM'sinde çalışıyor gibi görünüyor. Ancak bu belge, Sun'ın Windows ve Linux JVM'leri için işlevsel olmadıklarını ima ediyor gibi görünüyor.
G__

8

32 bit Java, yaklaşık 1,4 ila 1,6 GB ile sınırlıdır.

Oracle 32 bit yığın SSS

Alıntı

32 bit JVM için maksimum teorik yığın sınırı 4G'dir. Mevcut takas, çekirdek adres alanı kullanımı, bellek parçalama ve VM ek yükü gibi çeşitli ek kısıtlamalar nedeniyle, pratikte sınır çok daha düşük olabilir. Çoğu modern 32 bit Windows sisteminde maksimum yığın boyutu 1,4G ile 1,6G arasında değişecektir. 32 bit Solaris çekirdeklerinde adres alanı 2G ile sınırlıdır. 32 bit VM çalıştıran 64 bit işletim sistemlerinde, maksimum yığın boyutu daha yüksek olabilir ve birçok Solaris sisteminde 4G'ye yaklaşır.


4

Aşağıdaki conf benim için çalışıyor:

JAVA_HOME=/JDK1.7.51-64/jdk1.7.0_51/
PATH=/JDK1.7.51-64/jdk1.7.0_51/bin:$PATH
export PATH
export JAVA_HOME

JVM_ARGS="-d64 -Xms1024m -Xmx15360m -server"

/JDK1.7.51-64/jdk1.7.0_51/bin/java $JVM_ARGS -jar `dirname $0`/ApacheJMeter.jar "$@"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.