2013-10-16 10 views
17

Un ambiente di produzione è diventato molto lento di recente. La CPU del processo ha preso il 200%. Ha continuato a funzionare comunque. Dopo aver riavviato il servizio, è tornato normale. Ho diversi sintomi: L'heap dello spazio dei superstiti di Par è rimasto vuoto per molto tempo e la raccolta dei dati inutili ha richiesto circa il 20% del tempo della CPU.Old Gen heap è pieno e l'Eden e Survivor sono bassi e quasi vuoto

opzioni JVM:

X:+CMSParallelRemarkEnabled, -XX:+HeapDumpOnOutOfMemoryError, -XX:+UseConcMarkSweepGC, -    XX:+UseParNewGC, -XX:HeapDumpPath=heapdump.hprof, -XX:MaxNewSize=700m, -XX:MaxPermSize=786m, -XX:NewSize=700m, -XX:ParallelGCThreads=8, -XX:SurvivorRatio=25, -Xms2048m, -Xmx2048m 

    Arch amd64 
    Dispatcher Apache Tomcat 
    Dispatcher Version 7.0.27 
    Framework java 
    Heap initial (MB) 2048.0 
    Heap max (MB) 2022.125 
    Java version 1.6.0_35 
    Log path /opt/newrelic/logs/newrelic_agent.log 
    OS Linux 
    Processors 8 
    System Memory 8177.964, 8178.0 

Maggiori informazioni nella foto allegata Quando il problema si è verificato sulla non-heap la cache codice utilizzato e CMS utilizzato perm gen sceso a metà.

ho preso informazioni dal newrelic. enter image description here

La domanda è perché non l'inizio del server di lavorare in modo lento.

A volte il server si arresta completamente, ma abbiamo rilevato che c'è un problema con PDFBox, quando si carica del pdf e contiene alcuni tipi di carattere si blocca la JVM.

Maggiori informazioni: ho notato che ogni giorno la vecchia generazione si sta riempiendo. Ora riavvio il server ogni giorno. Dopo il riavvio è tutto bello e dandy ma il vecchio gen si sta riempiendo fino al giorno successivo e il server rallenta fino a quando non ha bisogno di un riavvio.

+1

Allora, qual è la domanda? –

+0

Se il tuo spazio perm è esaurito e il tuo nuovo spazio è quasi vuoto, non avrebbe senso diminuire la dimensione del nuovo spazio e allocare più spazio al perm gen? Se lo fai e finisci con lo stesso problema, potresti avere una perdita di memoria. – TMN

+0

Il perm contiene le classi compilate e altre cose. Il problema che vedo è che la Vecchia Gen sta crescendo. Devo riavviare il server ogni giorno per tornare alla normalità. Quando il grafico di perm gen (e il resto) è andato giù, c'è il riavvio del tomcat. – Bogdan

risposta

22

per impostazione predefinita CMS inizia a raccogliere contemporaneamente se OldGen è del 70%. Se non è in grado di liberare memoria al di sotto di questo limite, verrà eseguito in modo permanente simultaneo, il che rallenterà notevolmente l'operazione. Se OldSpace si avvicina al pieno utilizzo di OldGen, si farà prendere dal panico e tornerà alla pausa GC di stop-the-world, che può essere molto lunga (come 20 secondi). Probabilmente hai bisogno di più spazio in OldGen (assicurati che la tua app non perda memoria di c!). Inoltre, è possibile abbassare la soglia per avviare una raccolta simultanea (default 70%) utilizzando

-XX: + UseCMSInitiatingOccupancyOnly -XX: CMSInitiatingOccupancyFraction = 50

questo innescherà collezione concomitante a partire con il 50% di occupazione e aumentare la probabilità CMS finisce GC in tempo. Questo aiuterà solo nel caso in cui il tuo tasso di allocazione sia troppo alto, dai tuoi grafici sembra non-abbastanza-headrooom/memleak + troppo alto XX: CMSInitiatingOccupancyFraction. Dare almeno 500 MB a 1 GB di spazio più OldGen

+1

Questo ha risolto il problema. Grazie. Siamo aumentati di 1 GB e ora non abbiamo problemi. – Bogdan