Son zamanlarda Java için bir program üzerinde çalışıyorum. Başlangıçta, Java'nın bellek yönetimini hep sevmişimdir, hafıza tahsis etmekten endişelenmenize gerek yok, sadece tahsis edin, çöp toplayıcı belleği sizin için geri alacak. Şimdi program büyük miktarda veriyle geliştirildi ve hız için tüm bilgileri hafızaya yükleyeceğim, böylece hızlı yanıt sağlanacak. Hâlâ kendi veri miktarımı tekrar tekrar sayıyorum, bu da başlangıçta yeterli olmalı (makinemde 4G bellek var, ama Windows 3.5G'yi tanıyor ama mevcut veri hacmimle karşılaştırıldığında sorun yaşamalı).
Beklenmedik şekilde, ilk deneyin programı birkaç saat çalıştı ve bir Hafıza Dışı İstisna ile karşılaştı. Kendi VM ayarlarıma baktığımda -Xms512M -Xmx1024M ayarlarını ayarladım. Düşünmeden doğrudan -Xms512M -Xmx2048M olarak değiştirdim ve sonuçta nesne yığını için yeterli alan ayıramadım. Program kalkmıyor. Ancak o zaman orijinal maksimum hafızanın hâlâ bir sınırı olduğunu fark ettim. İnternette arama yaptım ve bu konuyu ele alan birçok makale buldum. Son olarak, BEA'nın DEV2DEV forumunda en faydalı makaleyi buldum
Burada moderatör YuLimin testi yaptı ve sonuca vardı:
Şirket JVM sürümü Maksimum bellek (mega) istemci Maksimum bellek (mega) sunucu
SUN 1.5.x 1492 1520
SUN 1.5.5(Linux) 2634 2660
PAZAR 1.4.2 1564 1564
SUN 1.4.2(Linux) 1900 1260
IBM 1.4.2(Linux) 2047 N/A
BEA JRockit 1.5 (U3) 1909 1902
Şu anda JDK1.6.0_05 kullanıyorum, test ettim. İstemci durumunda en büyük sorun, JDK'nın -Server parametresini tanımaması ve sunucu durumunu test edememesi. Tahminler de yaklaşık aynı.
PAZAR 1.6.0 1442 Yayın
Java'da büyük bellek kullanmak imkansız görünüyor. Genel olarak deyim, hafıza çok büyükse çöp toplama süresi uzun olur. Bu da anlaşılır, genellikle bellek yeterli olmadığında toplanır, tarama 2G bellek elbette 1G'den çok daha yavaştır ve daha fazla bellek nesnesi vardır, tahmini ilişki katlanarak artar.
Aşağıda YuLimin'in test yöntemleri ve test kayıtları eklenmiş olarak yer almaktadır.
Test yöntemi: Komut satırında test etmek için java -XmxXXXXM -sürüm komutunu kullanın ve ardından XXXX'in değerini kademeli olarak artırın; normal çalışıyorsa belirtilen bellek boyutu kullanılabilir oluraksi takdirde bir hata mesajı yazılır. |