2012-07-20 15 views
18

Ho un problema con la memoria heap java. Ho sviluppato un'applicazione client server in java che viene eseguita come servizio Windows richiede più di 512 MB di memoria. Ho 2GB di RAM, ma quando faccio funzionare la mia applicazione viene generata un'eccezionecome aumentare la memoria heap java in modo permanente?

Out of memory error:java heap space

ma ho già impostato dimensione heap (massimo 512 MB) nel pannello di controllo Java e ho ancora ottenere lo stesso errore. Non riesco a impostare la dimensione dell'heap attraverso la riga di comando perché la mia applicazione funziona come un servizio Windows, quindi come posso aumentare la dimensione dell'heap predefinita?

+1

Le impostazioni nel pannello di controllo influiscono solo applet e applicazioni Java Web Start quindi non avrebbe alcun effetto sulla tua applicazione. – assylias

+0

Come si esegue java come servizio di Windows? Normalmente quale utility che si sta usando per farlo consente di specificare gli argomenti della riga di comando. –

risposta

-3

Si prega di notare che l'aumento della dimensione heap Java in seguito ad un java.lang.OutOfMemoryError: Java heap space è molto spesso solo una soluzione a breve termine.

Ciò significa che anche se si aumenta la dimensione dell'heap Java predefinita da 512 MB per dire 2048 MB, si potrebbe ancora ottenere questo errore a un certo punto se si ha a che fare con una perdita di memoria. La domanda principale da porsi è: perché stai ottenendo questo errore di OOM in primo luogo? È davvero un valore Xmx troppo basso o solo un sintomo di un altro problema?

Durante lo sviluppo di un'applicazione Java, è sempre fondamentale comprendere il suo requisito di ingombro di memoria statico e dinamico nelle prime fasi, questo aiuterà a prevenire problemi OOM complessi in seguito. Corretto dimensionamento di JVM Xms & Le impostazioni Xmx possono essere ottenute tramite il corretto profiling dell'applicazione e il test di carico.

+29

Mentre quello che stai dicendo non è sbagliato, questa non dovrebbe essere la risposta accettata perché non risponde affatto alla domanda dell'OP. – searchengine27

+1

Sì, questa "risposta" trascura completamente la possibilità che l'utente desideri eseguire regolarmente lavori che richiedono grandi quantità di dati in memoria ... niente a che fare con perdite di memoria. –

2

se è necessario aumentare la memoria riservata, ci sono parametri VM -Xms e -Xmx, utilizzo per es. -Xms512m -Xmx512m. V'è anche il parametro XX: MaxPermSize = 256m che cambia memoria riservata per la generazione permanente

Se l'applicazione viene eseguito come servizio di Windows, in pannelli di controllo -> Strumenti di amministrazione -> Servizi è possibile aggiungere alcuni parametri della corsa al vostro servizio

+0

posso impostare una variabile di ambiente come questa "JAVA_OPT = -Xms512m -Xmx512m" –

+0

non sono sicuro di questo, non l'ho mai provato. Se lo proverai, per favore pubblica qui il risultato;) Ho aggiornato il mio post, puoi aggiungere alcuni parametri al servizio windows –

+2

la variabile di ambiente JAVA_OPTS è tipicamente specifica dello script che stai usando (come gli script di avvio di tomcat). Non puoi assumere che l'impostazione avrà alcun effetto. Usa _JAVA_OPTIONS come indicato di seguito. Funziona su Windows e Linux, a patto che tu stia usando il jvm fornito da Oracle. Nessuna garanzia funzionerà su JRockit o IBM jvm. – Matt

31

Java Virtual Machine accetta due argomenti della riga di comando che impostano le dimensioni heap iniziali e massime: -Xms e -Xmx. È possibile aggiungere una variabile di ambiente di sistema denominata _JAVA_OPTIONS e impostare lì i valori della dimensione dell'heap.
Per esempio, se si desidera un massimo iniziale e 1024Mb dimensione heap 512Mb si potrebbe usare:

sotto Windows:

SET _JAVA_OPTIONS = -Xms512m -Xmx1024m 

sotto Linux:

export _JAVA_OPTIONS="-Xms512m -Xmx1024m" 

E 'possibile leggere il default Dimensione heap JVM a livello di codice utilizzando il metodo totalMemory() della classe Runtime. Usa il seguente codice per leggere la dimensione dell'heap JVM.

public class GetHeapSize { 
    public static void main(String[]args){ 

     //Get the jvm heap size. 
     long heapSize = Runtime.getRuntime().totalMemory(); 

     //Print the jvm heap size. 
     System.out.println("Heap Size = " + heapSize); 
    } 
} 
+2

Esportazione linux _JAVA_OPTIONS = "..." funziona. Per verificare: 'java -version' La prima riga dovrebbe riportare le opzioni, ad esempio:' Prelevato _JAVA_OPTIONS: -Xms512m -Xmx2048m'. – rickfoosusa

+0

Non sono sicuro del motivo, ma la VM Java non potrebbe mai essere lanciata per me con più opzioni di heap (iniziale e massima). Solo con 1 opzione in '_JAVA_OPTIONS' –

+0

thanku :) una piccola spiegazione ha aiutato molto! –

1

questo ha funzionato per me:

_JAVA_OPTIONS export = "-" Xmx1g

E 'importante che si dispone di spazi perchè per me non ha funzionato. Suggerirei semplicemente di copiare e incollare.Poi mi sono imbattuto:

-XshowSettings java: VM

e vi dirà:

_JAVA_OPTIONS raccolse: -Xmx1g