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?
risposta
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.
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.
Gosh, e qui ho pensato che i garbage collector che sono stati implementati per C++ funzionassero davvero!
@PeteBecker - Ti stai riferendo a collezionisti C++ conservatori come il GC Boehm, puntatori intelligenti o qualcos'altro? –
@StephenC - I puntatori intelligenti sono una forma di gestione automatica della memoria, ma non sono garbage collection. –
- 1. Algoritmo di garbage collection JVM
- 2. La JVM forza la garbage collection quando raggiunge il limite -Xmx?
- 3. impedisce la garbage collection
- 4. Che cos'è la garbage collection JavaScript?
- 5. Java: perché non viene raccolta la garbage collection?
- 6. Garbage collection - root node
- 7. Garbage collection in bash
- 8. Unity3D: ottimizza la garbage collection
- 9. Come profilare la garbage collection in Ruby
- 10. Garbage Collection in Delphi
- 11. GWT Garbage Collection
- 12. Unusual Garbage Collection Patterns
- 13. Come minimizzare la garbage collection in Go?
- 14. Nessun garbage collection mentre la pipeline PowerShell è in esecuzione
- 15. Garbage collection in Perl threads
- 16. indesiderati Garbage Collection
- 17. Garbage collection manuale in Python
- 18. Forcing Garbage Collection
- 19. Garbage collection e cgo
- 20. requestAnimationFrame garbage collection
- 21. Chiarimento PHP Garbage Collection
- 22. C'è garbage collection in PHP?
- 23. Come Spring Singleton Scope è Garbage Collection?
- 24. Garbage Collection e chiamate asincrone/Oggetti futuri
- 25. Java 8 metaspace garbage collection
- 26. Generatori PHP - Garbage Collection
- 27. Il metodo ListlistList() impedisce la garbage collection del resto dell'elenco?
- 28. Garbage collection in dalvik vm
- 29. Scala Garbage Collection?
- 30. Lua: garbage collection + datiutente
perché dovrebbe? Come è utile forzare una garbage collection? – Henry
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
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