2009-03-23 19 views
27

Ogni 15-30 minuti Netbeans mostra "java.lang.OutOfMemoryError: PermGen space". Da quanto ho appreso da Google questo sembra essere correlato a perdite di classloader o perdite di memoria in generale.Come posso evitare errori di spazio PermGen in Netbeans?

Sfortunatamente tutti i suggerimenti che ho trovato erano relativi ai server delle applicazioni e non ho idea di adattarli a Netbeans. (Non sono nemmeno sicuro che sia lo stesso problema)

È un problema nella mia applicazione? Come posso trovare la fonte?

+0

vedere anche http://stackoverflow.com/questions/717550/java-lang-outofmemoryerror-java-heap-space-with-netbeans – Steen

+0

Perché non si esegue l'aggiornamento a una versione più recente di NetBeans? 6,5 è veramente vecchio –

+4

@a_horse_with_no_name: come questa domanda. L'ho chiesto più di tre anni fa. –

risposta

32

E 'a causa della costante di classe di carico.

Java memorizza codice byte di classe e tutte le costanti (ad esempio costanti stringa) nell'heap permanente che non è garbage collection per impostazione predefinita (che ha senso nella maggior parte delle situazioni perché le classi vengono caricate solo una volta durante il ciclo di vita di un'applicazione).

Nelle applicazioni che spesso caricare le classi durante una vita intera che sono:

  • server web e delle applicazioni durante la ridistribuzione calda;
  • IDE durante l'esecuzione di applicazioni sviluppate (ogni volta che si preme il pulsante Esegui in Netbeans o eclipse, carica le classi dell'applicazione in modo nuovo);
  • ecc. questo comportamento non è corretto perché un heap si riempie alla fine.

È necessario attivare la garbage collection dell'heap permanente per evitare questo errore.

Io uso le opzioni

-XX:MaxPermSize=256M 
-XX:+CMSClassUnloadingEnabled 
-XX:+CMSPermGenSweepingEnabled 

(fermati mio Eclipse 3.4 da lanciare "java.lang.OutOfMemoryError: PermGen space" così dovrebbe funzionare anche con NetBeans).

Edit: Basta notare che per Netbeans di impostare queste opzioni in: [Netbeans installation]\etc\netbeans.conf Si dovrebbe prefixe quelle opzioni con -J e aggiungerli a netbeans_default_options (vedi commenti in netbeans.conf per maggiori informazioni).

+0

OK, nessuna delle risposte mi è stata di aiuto, ma questo mi ha comprata più tempo tra riavvio :) –

+0

prova ad ingrassare MaxPermSize a 512M o più perché la raccolta dei rifiuti di permament hep non sarà ancora d'aiuto se un'applicazione si impegna a archiviarli più di può contenere (la quantità di oggetti permamanet vivi supera la capacità heap permament) –

+1

Gli argomenti sembrano funzionare per me (analisi del codice byte di rt.jar nel mio caso), tuttavia, ho ricevuto l'avvertimento 'Si prega di utilizzare CMSClassUnloadingEnabled al posto di CMSPermGenSweepingEnabled in futuro ». Tuttavia ha funzionato ancora. – Grundlefleck

2

Vedere questo link su come impostare la dimensione di PermSize. Molto probabilmente questo non è un problema del tuo codice, quindi l'unica soluzione sarebbe aumentare PermSize. Ho scoperto che questo è abbastanza spesso, quando lavori con JAXB. In generale, se si utilizzano molte librerie che dipendono anche da molti altri file jar, la dimensione predefinita dello spazio PermGen potrebbe non essere sufficiente.

vedere questi post del blog per maggiori dettagli: Classloader leaks e How to fix the dreaded "java.lang.OutOfMemoryError: PermGen space"

1

È possibile modificare le opzioni di avvio di NetBeans JVM modificando il file /etc/netbeans.conf. Spesso ho questo tipo di errori quando sviluppo una Webapp e la distribuisco spesso. In tal caso, riavvio Tomcat di volta in volta.

4

tenta di aggiungere il seguente argomento per NetBeans netconf: -J-XX: MaxPermSize = 256m

2

Se si sta sviluppando un'applicazione web, provare a mettere l'opzione VM Server

-Xmx512m -Xms512m -XX on: MaxPermSize = 512m

andare in Strumenti/Server // Piattaforma/VM Options (NetBeans 7.4)