Java Memoria: Mucchio Spazio e Garbage Collector

Ulteriori informazioni su come Java gestisce la memoria attraverso lo spazio heap e la raccolta dei rifiuti. Capire l'allocazione di memoria può contribuire a evitare perdita di memoria in programmi Java.

A+ A-

Recentemente, ho scritto una applicazione Java che, una volta eseguito, richiede un po 'di memoria, e ho iniziato a ottenere l'errore OutOfMemory:

 Errore: java.lang.OutOfMemoryError: Java spazio di heap 

Questo accade spesso quando abbiamo bisogno di eseguire programmi di memoria ad alto consumo. Di seguito sono riportati alcuni modi per risolvere questi problemi.

Che cosa è Java spazio mucchio?

Prima di tutto, permette di capire che cosa è lo spazio di heap. Ebbene, Java utilizza la memoria soprattutto negli arrangiamenti di heap e stack di . Java mantiene i parametri che vengono passati da un metodo di chiamata ad un metodo chiamato , sotto forma di una struttura multistrato (cioè parametri vengono spinti in e spuntato fuori della pila secondo il bisogno). D'altra parte, mucchio è spazio di memoria ad accesso casuale in cui Java crea e mantiene oggetti. Java crea l'oggetto all'interno di questo spazio mucchio ovunque esso trova spazio sufficiente per contenere l'oggetto. Così, quando si crea un nuovo oggetto (eg String () ;) l'oggetto viene creato nello spazio di heap e occupa la memoria, che può adattarsi. Durante la raccolta dei rifiuti, Java libera lo spazio mucchio di quegli oggetti che non sono più referenziati. Ma se il numero di riferimento (vale a dire "necessaria") oggetti continua a crescere e noi non li deferenza -la JVM si esaurisce lo spazio di heap.

La quantità di memoria che una classe richiederebbe dipende dal numero e dal tipo dei suoi membri di dati.

  1. La classe stessa richiede minimo di 8 byte
  2. Ogni membro dei dati richiede 4 byte (lunga e doppia richiedono 8 byte). Anche una variabile booleana è utilizzare 4 byte se è necessario un solo bit per essere memorizzato.
  3. Quantità di memoria utilizzata cresce in blocchi di 8 byte
Ottimizzare i programmi Java

Il primo passo per aggirare questo problema deve passare attraverso il programma e vedere come potrebbe essere modificato in modo da rendere l'uso di memoria minore. Da tempo il costo della memoria è stato estremamente basso rispetto a quello che è stato durante 1960. E programmatori sono diventati abbastanza stravagante in termini di quote di memoria per i loro programmi. Tuttavia ancora, il più delle volte, abbiamo bisogno di scrivere programmi che richiedono più memoria di quella disponibile. La frugalità nel contesto di utilizzo della memoria è sempre bene perché non solo riduce le probabilità di crash del programma, ma anche a volte aumenta la velocità di esecuzione.

Si dovrebbe impostare gli oggetti di essere null quando non sono più necessari nel codice. Questo è ancora più importante se si esegue un ciclo in cui si crea oggetto (s), ma poi non disfarsene quando non sono necessari.

Fare uso del metodo di garbage collector di Java

Il secondo passo verso l'ottimizzazione dell'utilizzo della memoria potrebbe essere quella di chiamare in modo esplicito il metodo Garbage Collection. Java richiama automaticamente questo metodo come e quando richiesto e libera lo spazio di memoria che contiene gli oggetti che non si fa riferimento. Ma si può anche chiamare questo metodo esplicitamente nel codice (ad esempio, dopo un "grande compito" è compiuto e il prossimo "grande compito" sta per iniziare). Per chiamare il garbage collector, usare:

 Runtime.getRuntime () gc ().; 

È possibile monitorare lo stato della memoria, prima e dopo il metodo GC () viene chiamato.

 System.out.println ( "nnCalling Garbage Collectornn");
System.out.println ( "Memoria libera PRIMA:" + Runtime.getRuntime () freeMemory ().);
Runtime.getRuntime () gc ().;
System.out.println ( "Memoria libera DOPO:". + Runtime.getRuntime () freeMemory ());
System.out.println ( "nnGarbage raccolta finishednn"); 

Metodo FreeMemory () restituisce la quantità di memoria libera disponibile misurata in byte. Per altri metodi forniti dalla classe Runtime vedere Java API

Dare più memoria al JVM

Gli sforzi per l'utilizzo della memoria ottimizzazione nonostante, a volte JVM in effetti ha bisogno di più memoria. In questi casi possiamo dire JVM tramite linea di comando di utilizzare una quantità di memoria specificata:

 java -Xms2000m -Xmx3500m 

-Xms E -Xmx passa specificare la quantità di spazio di swap (memoria virtuale) che JVM può utilizzare nella macchina.

-Xms Specifica il minimo (cioè iniziali) quantità di memoria

-Xmx Specifica la quantità massima di memoria che JVM potrebbe usare.

Questi valori di memoria devono essere specificati in megabyte.

Quindi, questo era circa Java gestisce la memoria attraverso lo spazio di heap e il meccanismo di garbage collection. Queste sono scelte intelligenti e ogni programmatore Java dovrebbero avere chiara comprensione di come Java gestisce la memoria. Solo sarete in grado di lavorare in modo efficiente su programmi intensivi di memoria.