2015-04-02 19 views
29

Ho un'applicazione J2EE con qualche comportamento interessante ... l'heap sembra comportarsi bene, crescendo e diminuendo con le raccolte di spazzatura come previsto nel tempo. Non c'è apprezzabile espansione complessiva dell'heap a lungo termine. Tuttavia, il metaspace continua a crescere costantemente a circa 20 Mb all'ora finché non raggiungiamo MaxMetaspace e incontriamo un OOME. Ho provato entrambi i garbage collector paralleli e G1 (jdk1.8.0_40).Come diagnosticare una perdita di metaspazio Java 8?

L'applicazione non viene ri-distribuita durante l'esecuzione, quindi non sembra che si tratti della tipica perdita di classloader. Qualcuno ha suggerimenti su come rintracciare la fonte di questa perdita?

+0

Hai già trovato una risposta? –

+0

Potete fornire ulteriori informazioni: server JEE, librerie usate. – sibnick

+1

Questo è stato un tentativo di eseguire un'app J2EE legacy su JBoss 4.2.3.GA in Java 8. Questa non è una configurazione supportata, ma il client voleva davvero provarla. So che ci sono stati importanti cambiamenti nel caricamento di classe di JBoss da allora, quindi ho il sospetto che si trattasse di un problema con la classe loader. L'ipotesi di Phillipe in merito alla generazione di proxy può avere qualche merito. Alla fine abbiamo deciso di "mordere il proiettile" e portare l'app su Wildfly 8. –

risposta

3

La causa principale della java.lang.OutOfMemoryError: Metaspace è:

  • troppo molte classi o
  • troppo grandi classi essendo caricato al Metaspace.

Se si desidera ricreare il problema utilizzare questo frammento di codice:

public class Metaspace { 
static javassist.ClassPool cp = javassist.ClassPool.getDefault(); 

public static void main(String[] args) throws Exception { 
    for (int i = 0; ; i++) { 
     Class c = cp.makeClass("eu.plumbr.demo.Generated" + i).toClass(); 
    } 
    } 
} 

Tutte queste definizioni di classe generati finiscono per consumare Metaspace.

Javaassist in Maven repo.

Si può trovare molto di più su OOME here

3

Fare un heap dump e analizzarlo con Eclipse MAT. Guarda le classi che hai caricato. Controlla se c'è qualcosa di inaspettato, in particolare le classi duplicate. Ha anche un esploratore di classloader.

Modifica: In teoria si potrebbe anche essere che si generano costantemente proxy.

+1

Abbiamo provato il MAT explorer explorer. Sfortunatamente l'app è impegnata e abbastanza complessa e la perdita è stata abbastanza lenta da rendere ancora una proposta "ago in un pagliaio". Questa configurazione doveva essere comunque una soluzione provvisoria e abbiamo raggiunto il punto di rendimenti decrescenti, quindi abbiamo rinunciato. –

+0

Non sono a conoscenza di un problema WildFly. OP non ha mai eseguito il debug del problema, quindi potrebbe essere qualsiasi cosa che includa la sua applicazione. –