2012-06-24 20 views
13

Java 6, Tomcat 6, Spring Framework 3, Hibernate 4, EhCache çalıştıran bir web uygulamamız var. Son derece uzun çöp toplama süreleriyle ilgili, 30 saniye veya daha uzun sürebilir ve uygulamayı yanıt vermeden bırakan bir sorunla karşılaşırız.Son derece uzun çöp toplama süreleri

Şu anda test ama onun dışında bariz açın: daha fazla bellek eklemek, acaba biz melodi çöp toplama süresini azaltmak için olabilir yönleri varsa.

Bellek kullanımını en çok etkileyen kişi, agresif önbellekleme yaptığımız için EHCache'dir. Ancak her zaman EHCache mağazalarını (yeni EhCache bayt boyutu mağazaları, önbelleğe alınmış nesne grafikleri oldukça büyük olabileceğinden, bizimle ilgili her türlü soruna yol açabilir) boyutlandırmak zor olur.

Bu

GC sürelerini azaltmak için JVM

JAVA_OPTS="$JAVA_OPTS -server -Xms256m -Xmx704m XX:OnOutOfMemoryError=/usr/share/scripts/on_server_crash.sh -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/tomcat6 -XX:MaxPermSize=192m -XX:+UseConcMarkSweepGC 
+0

Bellek uzun süre 704 MB'ye ulaşmadan önce bu uzun zamanları alıyor musunuz? JVM, kullanılan belleği arttırmaya karar vermeden önce kullanılan belleği azaltmaya (ve muhtemelen yeniden yerleştirmeye) çalışırken biraz "agresif" olabilir. -Xms704m -Xmx704m'yi kullanmaya başlarsanız aynı şekilde davranır mı? –

+0

"jstat -gc 1s pid" işlevini kullanarak, bellek kullanımınızın kreşlere ulaşıp ulaşmadığını veya kreşler ile eden ve eski arasındaki bellek paylaşımının değiştirilip değiştirilmediğini görebilirsiniz. –

+1

JProdilfer/Yourkit ile uygulamanızın kısa bir profili, katı önerileriniz olmayacaktır. –

cevap

3

benim ayarları yapabileceğiniz en iyi şey yığın bellek kapalı kullanmaktır. Mümkün olduğunca büyük verilerinizi taşıyabiliyorsanız, 100 saatlik MB yığın bellekle bile tüm GC zamanınızı 10 milisaniyeye kadar azaltabilirsiniz. Ehcache'nin yığın veri depolarını desteklediğine inanıyorum ama eğer kullanamıyorsanız ya da kullanamıyorsanız, alternatiflere bakmanızı öneririm.

Yalnızca 700 MB'lık bir maksimum bellek boyutuna sahip olduğunuza göre, çok sınırlı belleğe sahip bir sunucuda çalışıyorsunuz. Aksi takdirde, gerçekten ihtiyacınız olmadığına inanıyorsanız, maksimum 8 veya 16 GB ile başlamanızı ve bellek boyutunu azaltmanızı öneririm.

+0

Bellek boyutu, GC zamanlarında bir sorun olmamalıdır. GC'den önce oluşturulan yalnızca nesne sayısı başlar. – user2763361

+1

@ user2763361 Nesnelerin sayısı çok önemlidir ve referans sayısı ve referansların hangileri olduğu gibi diğer faktörler de vardır, ancak izleme araçlarında görebileceğiniz boyuttur.Tüketilen belleği azalttığınızda performansınızı artırabilirsiniz, çünkü bu genellikle nesne sayısını ve referans dolaylı kullanımını azaltır. Kısacası haklısınız, ancak hafıza kullanımını ölçmek daha kolay. –

+0

İyi dedi. İlgili: http://stackoverflow.com/questions/21675709/how-to-find-which-objects-are-creating-the-most-garbage – user2763361

1

FourSquare milletlerinden mükemmel bir araç var. Bu bağlantıyı ve sahip oldukları hızlı örneği kontrol edin. Foursquare Heap tool.. Yukarıda belirtilen araçlardan herhangi birinde bulunan tanılamalara dayanarak, sorunu çözmek için en çok sıralanan çözüm, daha fazla RAM eklemek veya CPU işlemcinize güç eklemek olacaktır. Bazı altyapı değişikliklerine açık iseniz Zing from Azul Systems'u kontrol edin. Ama bence ikinci seçenek bir streç olabilir.