2012-04-09 34 views
6

sınırının ötesine gitmiyor -Xmx2g ile, tepe belleğin 1G'ye ulaştığını ve büyük koleksiyonların (toplayıcı toplayıcı) olduğunu görüyorum. -Xmx3g ile 1.5G'ye ulaşır ve büyük bir koleksiyon yapar. -Xmg4g ile 2G'ye ulaşır ve büyük koleksiyonlar yapar. Ancak, buradan 6G, 8G, 12G'ye kadar maksimum belleği artırmaya çalıştım ve tepe belleğin 2G'ye ulaştığı tüm zamanlar büyük koleksiyonlar yapıyor.Yüksek bellek kullanımı,

2G'nin ötesine nasıl kullanılır? Bunun için hiçbir ortama rastlamadım. -XMS burada mı? Bunlar -Xmx, -Xmx'in yarısı -Xms yaptım.

Jetty, Java 1.6.024 kullanıyorum.

GÜNCELLEME: Evet, 64 bit JVM kullanıyorum. Kullanmakta olduğum JVM seçenekleri şunlardır: -Xmx6g -Xms3g -XX: MaxPermSize = 256m En yüksek belleği belirlerken, JConsole'daki bellek grafiğine bakıyorum. 2G ve damlalara ulaşır (büyük koleksiyon). Eski Gen 1.5G max ulaşır ve daha sonra damla olur.

Teşekkürler, Pramlar.

+4

64 bit JVM kullanmanız adil bir varsayım mıdır? Sormaya değer, çünkü 32-bit JVM'de 2GB boyut sınırlaması var. – duffymo

+0

Bence 64-bit JVM olduğunu söyleyebilirim, çünkü Java çok daha büyük bir yığın boyutu belirttiğinizde programı çalıştırmadan sona erecektir. 1500m'den (tam sınır JVM'ye bağlıdır). – rob

+0

-XX özellikleriyle oynamayı denediniz mi? –

cevap

1

Üç bellek bölgesi vardır, eden, hayatta kalan ve tenured alan.

Şüphelendiğim şey, en büyük boyutu artırırken, ya kiralanan ya da eden alanların büyümediğidir.

Bu iki bölgenin önemli olmasının nedeni, kiralanan alanın Tam bir GC'yi doldurmasıyla tetiklendiğinde (bu boyutun büyüyeceğinden şüpheleniyorum) Öğe alanı dolduğunda ve hayatta kalan alanda tüm nesneleri kopyalamak için yeterli alan olmadığında sol, tam bir GC de tetiklenir.

Sorununuzun nedeni budur, oluşturulan sayıyı azaltamayacaksanız, performans sorunu olması muhtemel çok sayıda orta ölçekli nesne oluşturuyorsunuz. Bir alternatif, eden büyüklüğünü arttıran daha büyük bir yeni boyut belirlemektir.

onlar temizlenir zaman bireysel alanlarının ölçülerinizi verecek -mx12g -XX:NewSize=10g - verbosegc

son seçenek deneyin.

+0

Peter, cevabın için teşekkürler. Bir takip sorum var. Nesnenin korunan boyutlarından biri yaklaşık 4MB'dir. Ve dakika başına böyle bir nesne oluştururuz ve statik bir ConcurrentHashMap içinde daha önceki bir dakika nesnesiyle değiştiririz. Görebildiğim kadarıyla bu en büyük nesne.Tabii ki çok sayıda String nesnesi ve diğer geçici nesneler var, ama hepsi 4MB'den çok daha küçük. Bu 3G'nin Eden alanı için çok büyük bir boyut mu? Çünkü 6G olduğumda 1’ten NewRatio’yu denedim ve bu da en yüksek kullanımın 2G’nin ötesine geçmesine yardımcı olmadı. Teşekkürler. – prams

+0

Büyük nesneler doğrudan kiralanan alana tahsis edilir. Eğer gerçekten çok az nesneden oluşan bir nesneye sahipseniz, o zaman onlar, o alanın uzağına tahsis edilmelidir. Böyle büyük nesneler için, basit bir şekilde yapabiliyorsanız, bunları geri dönüştürmekten daha iyi olursunuz. –

+0

NewSize'i büyük boyutlu olarak ayarlamak, daha yüksek tepe bellek nesnelerine ulaşılmasına yardımcı oldu. Teşekkürler. Yapılandırmamı ve oluşturduğumuz nesnelerin bazı ayrıntılarını size bildiririm. Ve bir soru soracaktır (bir sonraki yorumda). Profilci, bellekte çok fazla yer olduğunu gösterir: 1) Saniyede yaklaşık 5 dizge (her biri 110 KB) oluşturulur. 2) 4 nesne (tek bir sınıfa ait) içeren bir nesne dakikada bir oluşturulur ve statik eşzamanlı bir eşleşmeye (böylece eşzamanlı olarak yalnızca 1 nesne içerir) oluşturulur. Bu 4 nesnelerin her biri 10K Dizi Listeleri, 10K Tarih ve diğer dizeleri vb – prams