2012-04-19 38 views
8

Tomcat 6'da bir ömür boyu portal çalışıyoruz. Her portlet, içerdiği bir web uygulamasıdır, böylece portletin kendisi için gereken tüm kitaplıkları içerir. Şu anda 30'dan fazla portletimiz var. Bunun sonucu olarak, kurduğumuz her portlet ile tomcatımızın permeni artmaktadır.Büyük Permgen büyüklüğü + performans etkisi

Artık izleyebileceğimiz iki yol var. Portletlerimizin her biri tarafından kullanılan kitaplıklardan bazılarını tomcat paylaşılan kitaplığına taşıyın. Bu bizim permgen boyutu azaltmak için ilkbahar/hibernate/cxf/.... gibi şeyler içerebilir veya daha kolay permgen boyutunu artırmak olacaktır.

Bu ikinci seçenek, her portleti bağımsız bir varlık olarak tutmamıza izin verir.

Şimdi sorulması gereken, permgen boyutunu arttırmaktan kaynaklanan olumsuz bir performans etkisi var mıdır? Şu anda 512MB'de çalışıyoruz. Bu konuda çok az bilgi buldum. Ancak, bazı yayınların insanların sorun olmaksızın 1024MB permgen boyutunda çalıştığı hakkında konuştuklarını gördük.

+0

1 GB'lik bir PermGen'in bir soruna neden olmasını beklemezdim. –

+1

İlgili soru: http://stackoverflow.com/q/9636328/1140748 –

+0

Bu, sorunuzu yanıtlamaz, ancak başka bir yönü ekler: Eklenti başına 1 portal uygulamacığına yapay bir sınırlama getirme kararını düşünürüm. Verdiğiniz portletlerin sayısıyla, bahse girerim, ambalajla ilgili olanları birlikte düşünmeyi önerdiğim bazı konular vardır. Bu, ağrılarınızın ve IMHO eklentilerinizin eklentilerinize genel bakışınızı dikkate alacaktır. –

cevap

3

Sunucunuzda yeterli bellek varsa, bir şeylerin yanlış gidebileceğini hayal edemiyorum. Eğer yapmazsanız, Tomcat muhtemelen başlamayacaktır, çünkü yeterli bellek ayırmayacaktır. Yani eğer işe başlarsa, iyisin. Benim deneyimim kadarıyla, 1GB PermGen mükemmel ses.

Büyük bir PermGen'in dezavantajı, daha az sistem belleği bırakarak, daha sonra yığın (Xmx) için ayırabilmenizdir. Öte yandan, portletleri düşünmek için kendi kendine yeten varlıklar olarak düşünmenin yararlarını yeniden gözden geçirmenizi tavsiye ederim. Örneğin:

  • birlikte çalışabilirlik sorunları: tüm portletler potansiyel aynı kütüphanelerin farklı sürümlerini kullanmaya izin verilmesi halinde, bunlar birbirleriyle ve
  • amaçlandığı gibi portal kendisi ile işbirliği olmayacak bazı riski vardır
  • performans: PermGen ayak izi sadece bir şeydir, ancak burada her yerde kavanozlar eklenir ve portletlerde ek dosya tanıtıcıları gerekir; Windows hakkında bilmiyorum, ancak bu uzun vadede linux sunucusunun performansını incitecek. değişim ait
  • özgürlük: Eğer portletin lib kütüphanelerine lib/ext kütüphanelerini geçiş, sizin portletlerini inşa etmek maven kullanıyorsanız (bu portal kütüphanelerini daha can sıkıcı olabilir) bağımlılıkları kapsamını değiştirme meselesi olduğu; olarak hatırladığım kadarıyla Liferay SDK da kolay bağımlılıkları çözümlemek için ek karınca görevi ekleme ve gerekli
+0

perm gen, java yığınının bir parçası değildir, Xmx üzerinde herhangi bir etkisi olmayacaktır –

+0

Kendinde olmayacak - ama Xmx için ayırmak için daha az bellek bırakacak, değil mi? –

+0

evet, haklısın Michal - 'daha az bellek' 'daha az sistem belleği' olarak okumadı. –

1

olarak portlet en lib onları silerek bir anda benzer bir anahtarı yapmaya ant ile benzer bir geçiş yapmayı kolaylaştırır PermGen belleği tam koleksiyonlar tarafından toplanan çöp olabilir, bu sayede tam bir toplama gerçekleştiğinde GC zamanını artırabilir.

Bu koleksiyonlar çok sık olmamalı ve tipik olarak hala tam GC 1GB permgen hafızasına bir saniyeden daha az zaman alacaktır - sadece bu sayıyı (biraz puslu) bellekten alıyorum. GC zamanları hakkında bazı zamanlama testleri için endişeleniyorsunuz (-verbose:gc ve günlükleri okuyun, daha fazla ayrıntıyı here)

0

Permgen boyutu OLD Gen'in dışındadır - lütfen karıştırmayın. 2. noktada anlaştık - permizeyi yapabileceğimiz kadar artırabiliriz - bellek oldukça ucuz olduğu için bu bizim kodumuzu nasıl yönetdiğimiz konusunda bazı soruları gündeme getirebilir. Neden bu kadar çok JI’a ihtiyaç duyduğumuza - neden kaç tane sınıf yüklüyoruz? Uygulama kaç dosya tanıtıcıları açıyor (lsof komutuyla kontrol edin). Onlara cevap vermeye çalışmalıyız.

+0

Bu soruya bir cevap vermemektedir. Bir yazarın eleştirisini veya açıklamasını istemek için, gönderilerinizin altında bir yorum bırakın. Her zaman kendi gönderilerinize yorum yazabilirsiniz ve yeterli sayıda [ününüzü] aldıktan sonra (http://stackoverflow.com/help/whats-reputation) [herhangi bir yayına yorum yapabilir] (http://stackoverflow.com/help/privileges/comment). –

+0

Sanırım, sanırım, karıştırmanın suçlanması benim cevabımla işaretlenmişti, söz konusu ifadeyi biraz daha açık hale getirmek için biraz tereddüt ettim. Ben sadece, Permgen'e verilen sistem hafızasını arttırmanın, daha sonra Xmx'e vermek için daha az "kek" bırakacağını kastettim. Bellek kullanımı konusundaki sorunuza gelince, siz kafa karışıklığınızda kesinlikle haklısınız, ancak OP canlı çalışıyor ve can kurtaran her portlet için ayrı bir ClassLoader yaratıyor. Bu, örneğin, ilkbaharın birden fazla defa sınıflanmış olması anlamına gelebilir ve PermGen bu şekilde Liferay ile çatıdan kolayca geçebilir. –