2009-09-18 34 views
11

Bazı bellek ayarlarına ihtiyaç duyan bu webapp'um var. Zaten uygulamayı kendim belirlediğim ve işleri düzeltirken, JVM'nin kendisi en yoğun örneğimizde bana aşırı şekilde şişirilmiş görünüyor. (Düşük hacimli örneklerini bu sorun yok.) Ayrıntıları:Varsa, -d64 anahtarının Sun JVM yerleşik bellek kullanımı üzerindeki etkisi nedir?

  • Platformu:
    • RHEL4 64 bit (Linux 2.6.9-78.0.5.ELsmp #1 SMP x86_64)
    • Sun Java 6 (Java HotSpot(TM) 64-Bit Server VM (build 10.0-b23, mixed mode))
    • Tomcat 6 ile -d64 (startup.sh)
  • Benim webamamda şu anda üretimde yararları olan bir kod var. 64-bit çalışıyor.
  • Bir süre sonra (bir hafta) JVM'lerin yerleşik bellek boyutunun (üstte gösterildiği gibi), 0X112x3 ayarımın boyutu olan üç kez olduğunu gözlemledim. vb
  • olmayan yığın bellek boyutu, tüm yığın boyutu sadece tek haneli yüzde 64 bitlik bit adres alanı gerektirir kod sadece bir bölümü
  • yoktur
  • nispeten önemsiz olduğu

Bir 64-bit JVM gereksinimini yeniden ayarlayabilir ve -d64 anahtarını bırakabilirsem, bu JVM'nin yerleşik bellek ayak izini daha küçük yapar mı? Başka bir deyişle ...

-d64 anahtarının Sun JVM yerleşik bellek kullanımı üzerindeki etkisi nedir?

cevap

18

d64 anahtarının kullanımı JVM'yi 64-bit moduna geçirir. Teknik olarak, Solaris/Linux ve çoğu Unix üzerinde, JVM süreci LP64 modelinde yürütülür.

LP64 model, 32 bit modelden farklı olarak 64 bit genişlikte 32 bit modelden (ILP32) farklıdır. JVM için bu daha fazla bellek adreslenebilirliği sağlar, ancak aynı zamanda nesne referansları tarafından işgal edilen boyutun iki katına çıktığı anlamına gelir. Yani, 32-bit JVM'de ve 64-bit birimde belirli bir zamanda aynı sayıda nesne için daha büyük bir şişkinlik var.

Sıklıkla unutulan başka bir şey de talimatların kendileridir. 64-bit JVM'de, talimatların büyüklüğü yerel makine yazmaçının boyutunu kaplayacaktır. Bununla birlikte, 64 bit bir ortamda compressed object pointers kullanırsanız, JVM, 4 GB'den büyük yığın boyutları için mümkün olduğunda işaretçileri kodlayacak ve kod çözecektir. Kısaca belirtildiğinde, sıkıştırılmış işaretçiler kullandığınızda, JVM 32 bit geniş değerleri mümkün olduğunca kullanmaya çalışır.

İpucu: Bloğun bir kısmından kurtulmak için UseTpressedOops bayrağını -XX: + UseCompressedOops kullanarak açın. YMMV, ancak people have reported upto 50% drop in memory bloat by using compressed oops.

DÜZENLEME

The UseCompressedOops flag is supported in version 14.0 of the Java HotSpot VM, available from Java 6 Update 14 onwards.

+0

Fantastik Yanıt. Kodumu yeniden kodlamak için beni ikna ettin ve -64'ü bırakın. Geri dönüp nasıl gittiğiyle ilgili yorum yapacağım.Ayrıca bir JVM güncellemesinde çalışacağım, böylece -XX: + UseCompressedOops'ı deneyebilirim. Teşekkürler. Eylül 2009 için * Stu'nun Dünyaca Ünlü "Ayın Başar Haftası" * ödülünü kazandınız! –

+0

Vay, google-fu'un böyle bir tepkiyi açıklayacağını asla bilemezdim. Teşekkürler, cevabınız beni şaşırttı! Btw, yığınınızı 4GB'den daha az tutmayı başarırsanız, 64-bit JVM'niz 32-bit bir gibi davranacaktır; Ancak herhangi bir performans etkisi hakkında emin değilim. –

+0

Google-fo'dan fazlası !!! Kendime bakmıştım ve * düşünüyordum * bu çabaya değerdi ... ama * soooo * birçok JVM anahtarı ve değerleri, ve eğer-sonra-ama vakalar ve gotchyalar. Bu ezici olabilir ve benim ihtiyacım bir * "yapmak" için */* "rahatsız etmeyin" * cevap, ilgili kaşık besleme eşlik etti. Tekrar teşekkürler. –