2012-04-19 21 views
8

Stiamo eseguendo un portale liferay su tomcat 6. Ciascun portlet è un'applicazione Web contenuta in modo che includa tutte le librerie richieste dal portlet stesso. Al momento disponiamo di oltre 30 portlet. Il risultato è che il permgen del nostro tomcat aumenta con ogni portlet che distribuiamo.Grande dimensione Permgen + impatto sulle prestazioni

Ora abbiamo due percorsi che possiamo seguire. Spostare alcune delle librerie che vengono utilizzate regolarmente da ciascuno dei nostri portlet nella libreria condivisa di tomcat. Questo includerebbe cose come primavera/ibernazione/cxf/.... per ridurre la nostra dimensione di permgen O sarebbe più semplice aumentare la dimensione di permgen.

Questa seconda opzione ci consentirebbe di mantenere ogni portlet come un'entità autonoma.

La domanda ora è: c'è un impatto negativo sulle prestazioni dall'aumento delle dimensioni del permgen? Al momento stiamo lavorando a 512 MB. Ho trovato poche informazioni a riguardo. Ma ho trovato alcuni post in cui le persone parlano di una dimensione permgen di 1024 MB senza problemi.

+0

Non mi aspetto un PermGen da 1 GB per causare un problema. –

+1

Domanda correlata: http://stackoverflow.com/q/9636328/1140748 –

+0

Questo non risponde alla tua domanda, ma aggiunge un altro aspetto: considero la decisione di avere 1 portlet per plugin una limitazione artificiale. Con il numero di portlet che offri, scommetto che ci sono alcuni aspetti correlati in cui consiglierei di prendere in considerazione gli aspetti relativi al packaging. Questo si prenderà cura dei tuoi dolori e IMHO aumenterà la visione d'insieme dei tuoi plugin. –

risposta

3

Finché si dispone di memoria sufficiente sul server, non riesco a immaginare che qualcosa possa andare storto. Se non lo fai, beh, Tomcat non potrebbe nemmeno iniziare, probabilmente, perché non sarebbe in grado di allocare memoria sufficiente. Quindi, se si avvia, sei bravo. Per quanto riguarda la mia esperienza, 1GB PermGen è perfettamente suono.

Lo svantaggio di un grande PermGen è che ti lascia meno memoria di sistema che puoi quindi allocare per heap (Xmx).

D'altro canto, ti consiglierei di riconsiderare i vantaggi del pensare ai portlet come entità autonome. Ad esempio:

  • emette interoperabilità: se tutti i portlet possono utilizzare potenzialmente differenti versioni di stesse librerie, v'è un certo rischio che essi non cooperano tra loro e con il portale stesso come previsto
  • prestazioni: l'ingombro di PermGen è solo una cosa, ma l'aggiunta di giare ogni qui e là nei portlet richiederà ulteriori descrittori di file; Non so su Windows, ma questo danneggerà le prestazioni del server Linux a lungo termine.
  • libertà di cambiamento: se si sta usando Maven per costruire portlet, il passaggio da lib/ext librerie a lib librerie di portlet è solo una questione di cambiare il campo di applicazione delle dipendenze (questo può essere più fastidioso con librerie portale); per quanto mi ricordo, Liferay SDK rende anche più facile fare un interruttore simile con formica per fare un interruttore simile in un batter d'occhio con l'aggiunta di ulteriore task ant per risolvere le dipendenze e di cancellarli dal portlet di lib come richiesto
+0

perm gen non fa parte dell'heap java, non avrà alcun effetto su Xmx –

+0

Non lo farà da solo - ma ti lascerà meno memoria da allocare per Xmx, non è così? –

+0

sì, hai ragione Michal - non ha letto "meno memoria" come "meno memoria di sistema". –

1

La memoria PermGen può essere garbage collection da raccolte complete, quindi aumentarlo può aumentare la quantità di tempo GC quando si verifica una raccolta completa.

Queste raccolte non devono essere eseguite troppo spesso, e in genere richiedono meno di un secondo al massimo GC 1 GB di memoria permgen - Sto solo prendendo questo numero dalla memoria (un po 'confusa), quindi se sei davvero preoccupato per i tempi di GC per alcuni test di temporizzazione (usa -verbose:gc e leggi i registri, maggiori dettagli here)

0

La dimensione del permesso è al di fuori di OLD Gen - quindi per favore non confonderlo. Concordato sul secondo punto: possiamo aumentare il permsize quanto più possiamo fare, dato che la memoria è piuttosto economica ma ciò solleverebbe alcune domande su come stiamo gestendo il nostro codice. perché diamine abbiamo bisogno di questo tanto di perm -Io JTa consuma così tanto - quante classi stiamo caricando? Quanti descrittori di file l'app sta aprendo (controlla con il comando lsof). Dovremmo cercare di rispondere a quelli.

+0

Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti da un autore, lascia un commento sotto il loro post - puoi sempre commentare i tuoi post, e una volta che hai [reputazione] sufficiente (http://stackoverflow.com/help/whats-reputation) essere in grado di [commentare qualsiasi post] (http://stackoverflow.com/help/privileges/comment). –

+0

Dato che, credo, l'accusa di mescolanza è stata puntata sulla mia risposta, ho riformulato un po 'la frase in questione per renderla più chiara. Volevo semplicemente dire che aumentare la porzione di memoria di sistema assegnata a PermGen ti lascerebbe meno "torta" per poi dare a Xmx. Per quanto riguarda la tua domanda di utilizzo della memoria, beh, hai assolutamente ragione nella tua confusione, ma l'OP sta eseguendo liferay e liferay crea ClassLoaders separati per ogni portlet che si distribuisce su di esso. Ciò può significare che tutta la, ad esempio, la primavera viene classificata più volte ed è così che PermGen attraversa facilmente il tetto con Liferay. –