2015-06-29 7 views
5

Ho notato che l'applicazione Spring Boot non obbedisce alla quantità di memoria impostata tramite l'opzione Xmx. Per esempio: java-jar -Xss64m -Xmx64m test.jarIl consumo di memoria di avvio a molla aumenta oltre l'opzione -Xmx

Ho anche stampato sulla console la quantità di memoria realmente utilizzato dall'applicazione all'avvio, e mostra: massima di memoria: 61M

long maxBytes = Runtime.getRuntime().maxMemory(); 
System.out.println("Max memory: " + maxBytes/1024/1024 + "M"); 

Quando Apro i processi di Windows prima di accedere a qualsiasi pagina web, mostra + -105M, quindi come può dire Java 61M?

Dopo l'accesso a qualsiasi pagina Web va da + -125M a + -135M. Perché c'è un tale aumento? Dovrebbe dare "java.lang.OutOfMemoryError: PermGen space" ma non aumentare in questo modo.

Mi fa preoccupare se molte applicazioni potrebbero esaurire la memoria sul server. A proposito, sto usando Java 1.8_45

+1

Si consiglia di leggere sul modello di memoria java, in particolare sulle modifiche in JRE 8. Xmx specifica la dimensione dell'heap, non PermGen. Con Java 8, PermGen aumenta dinamicamente, se necessario. Inoltre, la memoria, che il programma effettivamente utilizza e la memoria che è bloccata dal sistema operativo, può essere diversa. – dunni

+0

Ok, ma PermGen va oltre Xmx così? Non riesco a impostare PermGen max in JVM 8 –

+0

Come ho detto, con Xmx si imposta la dimensione massima per lo spazio heap, che è completamente indipendente dallo spazio permgen. Con Java 8, il permgen è stato effettivamente rimosso e sostituito da MetaSpace, che alloca lo spazio necessario direttamente dalla memoria nativa. Tuttavia, esiste un'opzione, in cui è possibile impostare la dimensione massima per il MetaSpace. Vedere questo articolo per maggiori informazioni: http://java.dzone.com/articles/java-8-permgen-metaspace – dunni

risposta

6

Dopo controllo dell'applicazione Primavera di avvio, ho scoperto alcuni possibili motivi quali:

  1. Numero di thread http (Undertow inizia circa 50 filetti per di default, ma è possibile aumentare/diminuire tramite proprietà la quantità di fili necessario)
  2. accesso alla routine native (.dll, .so) tramite JNI
  3. variabili statiche
  4. l'uso della cache (memcache, EHCache, ecc)
  5. Se una macchina virtuale è a 32 o 64 bit, 64 bit utilizza più memoria per eseguire la stessa applicazione, quindi se non è necessario un heap più grande di 1,5 GB, quindi mantenere l'applicazione runnnig su 32 bit per risparmiare memoria.
+0

java a 64 bit utilizza puntatori compressi (se si utilizza meno di 32 GB xmx), quindi non dovrebbe usare più memoria per eseguire la stessa applicazione? –

Problemi correlati