Amintiți-vă ce este colectarea gunoiului în Java

Colectarea gunoiului este procesul de recuperare a memoriei de rulare completă prin distrugerea obiectelor neutilizate.

Uneori, programatorul poate uita să distrugă obiecte inutile, iar memoria alocată acestora nu este eliberată. Din ce în ce mai multă memorie de sistem este consumată și, în cele din urmă, nu mai este alocată. Astfel de aplicații suferă de „scurgeri de memorie”.

După un anumit moment, nu mai există suficientă memorie pentru a crea obiecte noi și programul se termină anormal din cauza OutOfMemoryError .

Colectarea gunoiului în Java este procesul prin care programele Java gestionează memoria automat. Programele Java sunt compilate în bytecode care rulează pe Java Virtual Machine (JVM).

Când programele Java rulează pe JVM, obiectele sunt create pe heap, care este porțiunea de memorie alocată acestora.

În timp ce o aplicație Java rulează, în ea sunt create noi obiecte. Până la urmă, unele obiecte nu mai sunt necesare. Putem spune că în orice moment, memoria heap constă din două tipuri de obiecte.

  • Live - Aceste obiecte sunt folosite, sunt referite din altă parte.
  • Mort - aceste obiecte nu sunt folosite nicăieri altundeva, nu există referiri la ele.

Colectorul de gunoi găsește aceste obiecte nefolosite și le îndepărtează pentru a elibera memorie.

Colectarea gunoiului în Java este un proces automat . Programatorul nu trebuie să marcheze în mod explicit obiectele care urmează să fie șterse.

Fiecare JVM poate implementa propria sa versiune de colectare a gunoiului. Cu toate acestea, colectorul trebuie să se conformeze specificației standard JVM pentru a trata obiectele prezente în memoria heap pentru a marca sau identifica obiectele inaccesibile și pentru a le distruge prin compactare.

Accesibilitatea obiectului

Pentru a recunoaște un obiect ca fiind viu, prezența legăturilor nu este suficientă. Acest lucru se datorează faptului că unele obiecte moarte se pot referi la alte obiecte moarte. De aceea, este necesar ca printre toate referințele la un obiect să existe cel puțin una dintr-un obiect „viu”.

Accesibilitatea obiectului

Colectatorii de gunoi lucrează cu conceptul GC Roots ( rădăcini de colectare a gunoiului ) pentru a distinge între obiectele vii și cele moarte. Sunt obiecte 100% vii și din ele există link-uri care animă alte obiecte și așa mai departe.

Exemple de astfel de rădăcini:

  • Clasele care sunt încărcate de încărcătorul de clase de sistem.
  • Fluxuri live.
  • Parametrii metodelor în execuție curentă și variabilele locale.
  • Obiecte care sunt folosite ca monitor pentru sincronizare.
  • Obiecte care sunt reținute din colectarea gunoiului pentru un anumit scop.
  • Colectorul de gunoi parcurge întregul grafic al obiectelor din memorie, începând de la aceste rădăcini și urmând referiri la alte obiecte.

Pașii de colectare a gunoiului în Java

Implementarea standard de colectare a gunoiului are trei pași.

1. Marcați obiectele ca fiind vii

În acest moment, colectorul de gunoi (GC) trebuie să identifice toate obiectele vii din memorie parcurgând graficul obiectului.

Când vizitează un obiect, îl marchează ca disponibil și, prin urmare, viu. Toate obiectele care nu sunt accesibile din rădăcinile GC sunt considerate candidate pentru colectarea gunoiului.

2. Curățarea obiectelor moarte

După faza de marcare, spațiul de memorie este ocupat de obiecte vii (vizitate) sau moarte (nevizitate). Faza de curățare eliberează fragmentele de memorie care conțin aceste obiecte moarte.

3. Dispunerea compactă a obiectelor rămase în memorie

Nu este necesar ca obiectele moarte care au fost îndepărtate în faza anterioară să fie unul lângă celălalt. Astfel, riscați să obțineți un spațiu de memorie fragmentat (pe jumătate gol).

Dar, desigur, având în vedere acest lucru, este posibilă compactarea memoriei în momentul în care colectorul de gunoi îndepărtează obiectele moarte. Restul va fi situat într-un bloc învecinat la începutul grămezii.

Procesul de compactare facilitează alocarea secvenţială a memoriei pentru obiecte noi.