2015-06-07 9 views
13

Per quanto ne so, non possiamo forzare per Garbage Collection in JAVA. Il meglio che possiamo fare è inviare una richiesta chiamando lo System.gc() o Runtime.gc(). Così facendo invierai la richiesta di Garbage collection a JVM ma non è garantito che la raccolta dei dati inutili si verifichi. Quindi la mia domanda è: ci sono dei motivi particolari, PERCHÉ JVM è progettato in modo tale che non supporti Force Garbage Collection?Perché JVM è progettato in modo tale che non consenta la forza Garbage Collection?

+1

perché dovrebbe? Come è utile forzare una garbage collection? – Henry

+6

Un'implementazione * particolare * JVM * potrebbe * scegliere di garantire tale esecuzione a un GC. I JDK Oracle/Open no. Qui la domanda è: "Per quale * motivo di implementazione * gc' non impone immediatamente un GC di arresto nella JVM standard? " – user2864740

+0

Supponendo che si vogliano evitare le pause GC in orari inappropriati, si potrebbe probabilmente neutralizzarle utilizzando un garbage collector a bassa pausa (come CMS o G1) e con pool di oggetti per tipi di oggetti continuamente necessari.Questo dovrebbe ridurre al minimo gli eventi _stop-the-world_, poiché i pool di oggetti dovrebbero contrastare la frammentazione dell'heap, che è il tallone d'Achille per CMS e G1. – mucaho

risposta

16

La forzatura della garbage collection è inefficiente e non necessaria nella maggior parte dei casi ... se il programma è stato scritto correttamente.

Riferimento:

Si scopre che se controlli il lancio della JVM che eseguire l'applicazione (o applet o servlet o qualsiasi altra cosa), allora si può garantire che chiamare System.gc() eseguirà il GC. O almeno, questo è il caso delle JVM Sun/Oracle ... dove il comportamento è controllato tramite un'opzione -XX sul comando java.

Il punto che sta facendo javadoc è che questa è dipendente dalla piattaforma e un'applicazione portatile non può fare affidamento su di essa.


quanto alla tua domanda:

PERCHE JVM è stato progettato in un modo che non supporta Forza Garbage Collection?

In modo che la JVM possa essere protetta dall'impatto sulle prestazioni di codice scritto male; per esempio. in applet, plug-in, librerie di terze parti, ecc.

(E immagino, in parte perché gli ingegneri Sun originali erano un po 'stufi di persone che si lamentavano del fatto che "Java è lento" quando il vero problema erano chiamate inutili a System.gc() ...)


1 - Ma non sempre. Ad esempio, chiamare System.gc() in un momento opportuno può essere un modo per evitare una pausa relativa al GC in un momento inopportuno. Tuttavia, se il tuo codice funziona solo se esegui il GC in determinati punti, allora stai facendo qualcosa di sbagliato.

3

Java è progettato in modo tale che (a differenza di C++) non è necessario occuparsi della memoria inutilizzata. Se la memoria di runtime è configurata correttamente, non è necessario preoccuparsi della garbage collection. Detto questo, fare un gc() in genere innescherà uno sweep dello spazio della giovane generazione.

+1

Gosh, e qui ho pensato che i garbage collector che sono stati implementati per C++ funzionassero davvero! A parte questo, la garbage collection fa ** non ** significa che puoi ignorare la gestione della memoria. È abbastanza facile creare [perdite di memoria in Java] (http://stackoverflow.com/questions/6470651/creating-a-memory-leak-with-java). –

+0

@PeteBecker - Ti stai riferendo a collezionisti C++ conservatori come il GC Boehm, puntatori intelligenti o qualcos'altro? –

+0

@StephenC - I puntatori intelligenti sono una forma di gestione automatica della memoria, ma non sono garbage collection. –