Questo articolo è un articolo speculare di traduzione automatica, clicca qui per saltare all'articolo originale.

Vista: 12807|Risposta: 0

[JavaSE] Acquisisci una comprensione approfondita del meccanismo di raccolta dei rifiuti di Java

[Copiato link]
Pubblicato su 04/12/2017 20:26:51 | | |
1. L'importanza del meccanismo di riciclaggio dei rifiuti  
Una caratteristica notevole del linguaggio Java è l'introduzione di un meccanismo di garbage collection, che risolve il problema di gestione della memoria più problematico per i programmatori C++, così che i programmatori Java non debbano più considerare la gestione della memoria durante la scrittura di programmi. A causa del meccanismo di raccolta dei rifiuti, gli oggetti in Java non hanno più il concetto di "scopo", solo il riferimento dell'oggetto ha un "scopo".La garbage collection può efficacemente prevenire la perdita di memoria e utilizzare efficacemente la memoria inattiva.

ps:内存泄露是指该内存空间使用完毕之后未回收,在不涉及复杂数据结构的一般情况下,Java 的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度,我们有时也将其称为“对象游离”。
2. Algoritmi nei meccanismi di raccolta dei rifiuti  
La specifica del linguaggio Java non specifica esplicitamente quale algoritmo di garbage collection utilizzare nella JVM, ma qualsiasi algoritmo di garbage collection generalmente deve fare due cose fondamentali: (1) trovare oggetti informativi inutili; (2) Riconquistare lo spazio di memoria occupato da oggetti inutili, così che lo spazio possa essere nuovamente utilizzato dal programma.
1. Collezionista di conteggio dei riferimenti
1.1 Analisi degli algoritmi

Il conteggio dei riferimenti è una delle prime strategie nei raccoglitori di spazzature. In questo approccio, esiste un conteggio di riferimento per ogni istanza di oggetto nell'heap. Quando un oggetto viene creato e l'istanza dell'oggetto viene assegnata a una variabile, il conteggio delle variabili viene impostato a 1. Quando qualsiasi altra variabile viene assegnata come riferimento a questo oggetto, il conteggio viene sommato di 1 (a = b, allora il contatore dell'istanza oggetto referenziato da b è +1), ma quando un riferimento a un'istanza oggetto ha superato la sua vita o viene impostato a un nuovo valore, il contatore di riferimento dell'istanza oggetto viene sottratto di 1. Qualsiasi istanza di un oggetto con un contatore di riferimento pari a 0 può essere raccolta come spazzatura. Quando un'istanza di oggetto viene raccolta da rifiuti, il contatore di riferimento di qualsiasi istanza oggetto a cui fa riferimento è meno 1.
1.2 Vantaggi e svantaggi
Merito:

Il raccoglitore di conteggio di riferimento può essere eseguito molto rapidamente, intrecciato nell'esecuzione del programma. È vantaggioso per ambienti in tempo reale dove i programmi non devono essere interrotti per lunghi periodi di tempo.
Mancanza:

I riferimenti circolari non possono essere rilevati. *Se l'oggetto genitore ha un riferimento a un oggetto figlio, l'oggetto figlio a sua volta fa riferimento all'oggetto genitore. In questo modo, il loro conteggio delle citazioni non può mai essere 0.
1.3 L'algoritmo di conteggio dei riferimenti non può risolvere il problema di riferimento circolare, ad esempio:
/** * Java学习交流QQ群:589809992 我们一起学Java! */public class Main {    public static void main(String[] args) {        MyObject object1 = new MyObject();        MyObject object2 = new MyObject();        object1.object = object2;        object2.object = object1;        object1 = null;        object2 = null;    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  
Le ultime due frasi assegnano oggetto1 e oggetto2 a null, il che significa che gli oggetti a cui sono puntati oggetto1 e oggetto2 non possono più essere accessibili, ma poiché si riferiscono l'uno all'altro, i loro contatori di riferimento non sono 0, quindi il raccoglitore di rifiuti non li riciclerà mai.
2. Tracciamento del Collector o algoritmo di mark and sweep
2.1 Algoritmo di ricerca radice


L'algoritmo di ricerca radice è introdotto dalla teoria dei grafi nella matematica discreta; il programma considera tutte le relazioni di riferimento come un grafo, partendo da un nodo GC ROOT, cercando il corrispondente nodo di riferimento; dopo aver trovato questo nodo, continuando a cercare il nodo di riferimento di questo nodo; quando tutti i nodi di riferimento vengono cercati, gli altri nodi sono considerati nodi non riferiti, cioè nodi inutili.
Java che può essere usato come GC Root
1. Oggetti di riferimento nello stack della macchina virtuale (tabella delle variabili locali)
2. L'oggetto referenziato dall'attributo statico nell'area del metodo
3. L'oggetto riferito dalla costante nell'area del metodo
4. Oggetti di riferimento nello stack di metodi locali (oggetti nativi)
2.2 Diagramma schematico dell'algoritmo di tracciamento

2.3 Analisi dell'algoritmo di eliminazione dei marcatori

L'algoritmo di purga del tag scansiona dalla collezione radice, segna gli oggetti sopravvissuti e poi scansiona l'intero spazio alla ricerca di oggetti non taggati da riciclare, come mostrato nella figura sopra. L'algoritmo tag-purge non ha bisogno di spostare oggetti e processa solo quelli non sopravvissuti, il che è estremamente efficiente quando ci sono molti oggetti sopravvissuti, ma poiché l'algoritmo tag-purge ricicla direttamente gli oggetti non sopravvissuti, causerà frammentazione della memoria.
3. Algoritmo di compattazione o algoritmo di finitura dell'etichetta


L'algoritmo tag-finish utilizza lo stesso metodo dell'algoritmo tag-clear per etichettare gli oggetti, ma è diverso durante la purga: dopo aver recuperato lo spazio occupato dagli oggetti non sopravvissuti, sposterà tutti gli oggetti sopravvissuti nello spazio libero all'estremità sinistra e aggiornerà il puntatore corrispondente. L'algoritmo tag-finish si basa sull'algoritmo tag-purge e sposta gli oggetti, quindi è più costoso, ma risolve il problema della frammentazione della memoria. Nell'implementazione di collettori basati sull'algoritmo di compattamento, generalmente vengono aggiunte handle e tabelle handle.
4. Algoritmo di copia (Collector di compattazione)


L'algoritmo è proposto per superare il sovraccarico della maniglia e risolvere la raccolta dei rifiuti del mucchio. Quando l'oggetto è pieno, la garbage collection basata sull'algoritmo di copia scansiona l'oggetto attivo dal root set e copia ogni oggetto attivo nella faccia libera (in modo che non ci siano fori liberi tra la memoria occupata dall'oggetto attivo), così che la superficie libera diventi la faccia dell'oggetto, la faccia originale dell'oggetto la faccia libera e il programma allochi la memoria nella nuova faccia dell'oggetto. Una tipica garbage collection basata sull'algoritmo coping è l'algoritmo stop-and-copy, che divide il mucchio in facce oggetto e faccia ad area libera, e il programma mette in pausa l'esecuzione durante il passaggio tra facce oggetto e facce di area libera.
5. Collezionista generazionale


La strategia generazionale di riciclaggio dei rifiuti si basa sul fatto cheIl ciclo di vita di oggetti diversi è diverso。 Pertanto, oggetti con cicli di vita diversi possono adottare algoritmi di riciclo differenti per migliorare l'efficienza del riciclo.
Giovane generazione
1. Tutti gli oggetti appena generati vengono posti prima nella generazione più giovane. L'obiettivo della generazione più giovane è raccogliere quegli oggetti con un ciclo di vita breve il più rapidamente possibile.

2. La memoria della nuova generazione è suddivisa in una regione dell'Eden e due zone sopravvissute (sopravvissuto0, sopravvissuto1) secondo il rapporto 8:1:1. Una zona Eden, due zone Survivor (in generale). La maggior parte degli oggetti viene generata nell'area dell'Eden. Quando anche l'area del survivor0 è piena, l'area dell'eden e quella del survivor0 vengono copiate in un'altra area di survivor1, poi l'area dell'eden e del survivor0 viene svuotata, poi l'area del survivor0 è vuota, e poi l'area del survivor0 e quella del survivor1 vengono scambiate. Cioè, mantenere vuota l'area sopravvissuta1, e così via.

3. Quando l'area sopravvissuta 1 non è sufficiente per conservare gli oggetti sopravvissuti dell'Eden e del sopravvissuto0, gli oggetti sopravvissuti vengono conservati direttamente all'era antica. Se anche la vecchiaia è piena, si attiva una GC completa, cioè la nuova generazione e la vecchia verranno riciclate

4. La GC della nuova generazione è anch'essa chiamata GC Minor, e la frequenza della GC minore è relativamente alta (non necessariamente si attiva quando l'area dell'Eden è piena)
Vecchia Generazione

1. Gli oggetti ancora vivi dopo aver sperimentato il riciclo di N rifiuti nella generazione più giovane saranno posti nella generazione più anziana. Pertanto, si può considerare che la vecchia generazione sia immagazzinata in alcuni oggetti con un lungo ciclo di vita.

2. La memoria è anche molto più grande di quella della nuova generazione (il rapporto approssimativo è 1:2), quando la memoria della vecchia età è piena, la Maggiorante Epoca è attivata, cioè la Piena Età, la frequenza della Piena Epoca è relativamente bassa, il tempo di sopravvivenza dell'oggetto di vecchia età è relativamente lungo e il tasso di sopravvivenza è alto.
Generazione permanente
Usata per memorizzare file statici, come classi Java, metodi, ecc. Le generazioni persistenti non hanno un impatto significativo sulla garbage collection, ma alcune applicazioni possono generare o chiamare dinamicamente alcune classi, come Hibernate, ecc., e in questo caso è necessario impostare uno spazio di generazione persistente relativamente grande per memorizzare queste nuove classi durante l'esecuzione.
3. GC (Raccolta rifiuti)Collezionisti utilizzati dalla nuova generazione: Serial, PraNew, Parallel Scavenge
Collezionisti utilizzati dai Collezionisti di Vecchiaia: Serial Old, Parallel Old, CMS

Collettore seriale (algoritmo di replica)
La nuova generazione di collettori a filettatura singola, marcatura e pulizia, sono a filettatura singola, con il vantaggio di essere semplici ed efficienti.
Vecchio Collezionista Seriale (Algoritmo di Finitura Etichetta)
Collezionista di fili singoli vecchi, versione vecchia del collezionista seriale.
Collezionista ParNew (algoritmo stop-copy)
Il nuovo collector di nuova generazione può essere considerato una versione multithreaded del Serial Collector, che offre prestazioni migliori rispetto al Serial in un ambiente CPU multi-core.
Parallel Scavenge Collector (algoritmo stop-copy)
Collettori paralleli per alta capacità di produzione e utilizzo efficiente della CPU. La velocità è generalmente del 99%, e la velocità = tempo thread utente / (tempo thread utente + tempo thread GC). È adatto a scenari come applicazioni di background che non richiedono un'elevata interazione corrispondente.
Vecchio Collettore parallelo (algoritmo stop-copy)
Una versione più vecchia del Parallel Scavenge collector, un parallel collector, con priorità di throughput
Collector CMS (Concurrent Mark Sweep) (algoritmo mark-clean)
Alta concorrenza, bassa pausa, ricerca del tempo di pausa di recupero GC più breve, alto utilizzo della CPU, tempo di risposta rapido, breve tempo di pausa e CPU multi-core che cerca tempi di risposta elevati
4. Il meccanismo di attuazione della GCPoiché l'oggetto è stato processato in generazioni diverse, anche l'area e il momento di raccolta dei rifiuti sono diversi. Esistono due tipi di GC: GC Scavenge e GC completo.
Scavenge GC
Normalmente, quando viene generato un nuovo oggetto e non si presenta per lo spazio in Eden, viene attivato il GC Scavenge, che GC fa GC nell'area Eden, elimina gli oggetti non sopravvissuti e sposta quelli sopravvissuti nell'area Survivor. Poi sistemano le due zone di Survivor. In questo modo la GC viene eseguita nell'area dell'Eden della generazione più giovane e non influenza quella più anziana. Poiché la maggior parte degli oggetti parte dall'area dell'Eden e l'area dell'Eden non è molto assegnata, la GC dell'area dell'Eden viene eseguita frequentemente. Pertanto, è generalmente necessario utilizzare algoritmi rapidi ed efficienti per rendere Eden libero il prima possibile.
Classifica generale completa
Organizza l'intera pila, inclusi Young, Tenured e Perm. Full GC è più lento di Scavenge GC perché richiede il riciclo dell'intero heap, quindi il numero di Full GC dovrebbe essere ridotto il più possibile. Una parte importante del processo di tuning della JVM è la messa a punto del FullGC. La GC completa può essere causata dalle seguenti ragioni:
1. La tenure è scritta per completo
2. La permanente è scritta in modo completo  
3. System.gc() viene visualizzato come una chiamata  
4. La strategia di allocazione del dominio dell'Heap cambia dinamicamente dopo l'ultima GC
5. Java con GC avrà anche problemi di perdita di memoria1. L'uso di classi di raccolta statica come HashMap, Vector, ecc. è la più soggetta a perdite di memoria, e il ciclo di vita di queste variabili statiche è lo stesso di quello dell'applicazione, e tutti gli oggetti non possono essere rilasciati perché saranno sempre applicati da Vector e altri.
Vettore statico v = nuovo Vettore(); per (int i = 1; i<100; i++) { Oggetto o = nuovo Oggetto();     v.add(o);     o = nullo; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  
In questo esempio, esiste un riferimento v per l'oggetto Vector e un riferimento o per l'oggetto Object nella pila di codice. Nel ciclo For continuiamo a generare nuovi oggetti, poi li aggiungiamo all'oggetto Vector e infine annulliamo il riferimento o. La domanda è: quando il riferimento o viene annullato, se si verifica GC, l'oggetto oggetto che abbiamo creato può essere riciclato da GC? La risposta è no. Perché quando GC traccia i riferimenti nello stack di codice, trova i v riferimenti, e se continui a tracciare verso il basso, scoprirai che ci sono riferimenti a oggetti Oggetto nello spazio di memoria a cui sono indicati i riferimenti v. Questo significa che, anche se il riferimento o è stato svuotato, ci sono ancora altri riferimenti all'oggetto oggetto accessibili, quindi il GC non può liberarli. Se dopo questo ciclo l'oggetto oggetto non ha alcun effetto sul programma, allora assumiamo che il programma Java abbia una perdita di memoria.
2. Varie connessioni, connessioni a database, connessioni di rete, connessioni IO, ecc. non mostrano la chiamata vicina alla chiusura e non vengono riciclate da GC, causando perdita di memoria.
3. L'uso degli ascoltatori può anche causare perdite di memoria quando l'ascoltatore non viene cancellato durante il rilascio dell'oggetto.




Precedente:I principianti giocano un po' di tecnologia nera in CSS
Prossimo:Attenzione al virus software Wanke Cloud snap Trojan!
Disconoscimento:
Tutto il software, i materiali di programmazione o gli articoli pubblicati dalla Code Farmer Network sono destinati esclusivamente all'apprendimento e alla ricerca; I contenuti sopra elencati non devono essere utilizzati per scopi commerciali o illegali, altrimenti gli utenti dovranno sostenere tutte le conseguenze. Le informazioni su questo sito provengono da Internet, e le controversie sul copyright non hanno nulla a che fare con questo sito. Devi eliminare completamente i contenuti sopra elencati dal tuo computer entro 24 ore dal download. Se ti piace il programma, ti preghiamo di supportare software autentico, acquistare la registrazione e ottenere servizi autentici migliori. In caso di violazione, vi preghiamo di contattarci via email.

Mail To:help@itsvse.com