logo

Atmiņas pārvaldība Java

Java valodā atmiņas pārvaldība ir objektu piešķiršanas un atdalīšanas process, ko sauc par atmiņas pārvaldību. Java automātiski pārvalda atmiņu. Java izmanto automātisku atmiņas pārvaldības sistēmu, ko sauc par a atkritumu savācējs . Tādējādi mums mūsu lietojumprogrammā nav jāievieš atmiņas pārvaldības loģika. Java atmiņas pārvaldība ir sadalīta divās galvenajās daļās:

    JVM atmiņas struktūra Atkritumu savācēja darbs

JVM atmiņas struktūra

JVM kaudzē izveido dažādus darbības laika datu apgabalus. Šīs zonas tiek izmantotas programmas izpildes laikā. Atmiņas apgabali tiek iznīcināti, kad JVM iziet, savukārt datu apgabali tiek iznīcināti, kad pavediens iziet.

Atmiņas pārvaldība Java

Metodes apgabals

Metodes apgabals ir daļa no kaudzes atmiņas, kas tiek koplietota starp visiem pavedieniem. Tas tiek izveidots, kad tiek palaists JVM. To izmanto, lai saglabātu klases struktūru, virsklases nosaukumu, interfeisa nosaukumu un konstruktorus. JVM metodes apgabalā saglabā šāda veida informāciju:

  • Pilnībā kvalificēts tipa nosaukums (piemēram, virkne)
  • Tipa modifikatori
  • Tipa tiešais virsklases nosaukums
  • Strukturēts saraksts ar pilnībā kvalificētiem supersaskarņu nosaukumiem.

Kaudzes apgabals

Kaudze saglabā faktiskos objektus. Tas tiek izveidots, kad tiek palaists JVM. Ja nepieciešams, lietotājs var kontrolēt kaudzi. Tam var būt fiksēts vai dinamisks izmērs. Kad izmantojat jaunu atslēgvārdu, JVM izveido objekta gadījumu kaudzē. Kamēr šī objekta atsauce tiek saglabāta kaudzē. Katram JVM procesam ir tikai viena kaudze. Kad kaudze ir pilna, atkritumi tiek savākti. Piemēram:

 StringBuilder sb= new StringBuilder(); 

Iepriekš minētais paziņojums izveido klases StringBuilder objektu. Objekts piešķir kaudzei, un atsauce sb piešķir steku. Kaudze ir sadalīta šādās daļās:

  • Jaunā paaudze
  • Izdzīvotāju telpa
  • Vecā paaudze
  • Pastāvīgā paaudze
  • Koda kešatmiņa

Atsauces veids

Ir četri atsauču veidi: Spēcīgs , Vāja , Mīksts , un Fantoma atsauce . Atsauču veidu atšķirības ir tādas, ka objekti uz kaudzes, uz kuriem tie attiecas, ir piemēroti atkritumu savākšanai saskaņā ar dažādiem kritērijiem.

Spēcīga atsauce: Tas ir ļoti vienkārši, jo mēs to izmantojam ikdienas programmās. Jebkurš objekts, kuram ir pievienota spēcīga atsauce, nav piemērots atkritumu savākšanai. Mēs varam izveidot spēcīgu atsauci, izmantojot šādu paziņojumu:

 StringBuilder sb= new StringBuilder(); 

Vāja atsauce: Pēc nākamā atkritumu savākšanas procesa tas neizdzīvo. Ja mēs neesam pārliecināti, kad dati tiks atkārtoti pieprasīti. Šādā stāvoklī mēs varam izveidot vāju atsauci uz to. Gadījumā, ja atkritumu savācējs apstrādā, tas iznīcina objektu. Kad mēs vēlreiz mēģinām izgūt šo objektu, mēs iegūstam nulles vērtību. Tas ir definēts java.lang.ref.WeakReference klasē. Mēs varam izveidot vāju atsauci, izmantojot šādu paziņojumu:

 WeakReference reference = new WeakReference(new StringBuilder()); 

Mīkstā atsauce: Tas tiek savākts, kad lietojumprogrammai sāk pietrūkt atmiņas. Atkritumu savācējs nesavāc viegli sasniedzamos priekšmetus. Visi mīkstās atsauces objekti tiek apkopoti, pirms tiek parādīta OutOfMemoryError kļūda. Mēs varam izveidot mīksto atsauci, izmantojot šādu paziņojumu:

 SoftReference reference = new SoftReference(new StringBuilder()); 

Fantoma atsauce: Tas ir pieejams java.lang.ref iepakojums. Tas ir definēts java.lang.ref.PhantomReference klasē. Objektu, uz kuru norāda tikai fantoma atsauce, var savākt ikreiz, kad atkritumu savācējs vēlas savākt. Mēs varam izveidot fantoma atsauci, izmantojot šādu paziņojumu:

 PhantomReference reference = new PhantomReference(new StringBuilder()); 

Stack Area

Stack Area ģenerē, kad tiek izveidots pavediens. Tam var būt gan fiksēts, gan dinamisks izmērs. Steka atmiņa tiek piešķirta katram pavedienam. To izmanto datu un daļēju rezultātu glabāšanai. Tajā ir atsauces uz kaudzes objektiem. Tajā ir arī pati vērtība, nevis atsauce uz objektu no kaudzes. Kaudzē saglabātajiem mainīgajiem ir noteikta redzamība, ko sauc par tvērumu.

Stack Frame: Stack frame ir datu struktūra, kas satur pavediena datus. Pavediena dati atspoguļo pavediena stāvokli pašreizējā metodē.

  • To izmanto daļēju rezultātu un datu glabāšanai. Tas arī veic dinamisku saistīšanu, vērtību atgriešanu pēc metodēm un nosūtīšanas izņēmumus.
  • Kad metode tiek izsaukta, tiek izveidots jauns rāmis. Tas iznīcina rāmi, kad metodes izsaukšana ir pabeigta.
  • Katrs kadrs satur savu lokālo mainīgo masīvu (LVA), operanda kopu (OS) un rāmja datus (FD).
  • LVA, OS un FD izmēri noteikti kompilēšanas laikā.
  • Tikai viens kadrs (izpildes metodes rāmis) ir aktīvs jebkurā noteiktā vadības pavediena punktā. Šo kadru sauc par pašreizējo kadru, un tā metode ir zināma kā pašreizējā metode. Metodes klasi sauc par pašreizējo klasi.
  • Kadrs aptur pašreizējo metodi, ja tā metode izsauc citu metodi vai ja metode tiek pabeigta.
  • Pavediena izveidotais rāmis ir lokāls šim pavedienam, un uz to nevar atsaukties neviens cits pavediens.

Native Method Stack

To sauc arī par C steku. Tā ir vietējā koda kopa, kas rakstīta valodā, kas nav Java. Java Native Interface (JNI) izsauc vietējo steku. Vietējās steka veiktspēja ir atkarīga no OS.

Datoru reģistri

Katram pavedienam ir ar to saistīts programmu skaitītāju (PC) reģistrs. PC reģistrā tiek saglabāta atgriešanas adrese vai vietējais rādītājs. Tajā ir arī pašlaik izpildīto JVM instrukciju adrese.

Atkritumu savācēja darbs

Atkritumu savācēja pārskats

Kad programma tiek izpildīta Java valodā, tā izmanto atmiņu dažādos veidos. Kaudze ir atmiņas daļa, kurā dzīvo objekti. Tā ir vienīgā atmiņas daļa, kas iesaistīta atkritumu savākšanas procesā. To sauc arī par savācamo atkritumu kaudzi. Visa atkritumu savākšana nodrošina, lai kaudzei būtu pēc iespējas vairāk brīvas vietas. Atkritumu savācēja funkcija ir atrast un izdzēst objektus, kurus nevar sasniegt.

Objektu piešķiršana

Kad objekts tiek piešķirts, JRockit JVM pārbauda objekta izmēru. Tas atšķir mazus un lielus objektus. Mazais un lielais izmērs ir atkarīgs no JVM versijas, kaudzes lieluma, atkritumu savākšanas stratēģijas un izmantotās platformas. Objekta izmērs parasti ir no 2 līdz 128 KB.

Mazie objekti tiek glabāti Thread Local Area (TLA), kas ir bezmaksas kaudzes daļa. TLA nesinhronizējas ar citiem pavedieniem. Kad TLA kļūst pilna, tā pieprasa jaunu TLA.

kļūda: nevarēja atrast vai ielādēt galveno klasi

No otras puses, lieli objekti, kas neietilpst TLA, tiek tieši iedalīti kaudzē. Ja pavediens izmanto jauno telpu, tas tiek glabāts tieši vecajā telpā. Lielajam objektam nepieciešama lielāka sinhronizācija starp pavedieniem.

Ko dara Java atkritumu savācējs?

JVM kontrolē atkritumu savācēju. JVM izlemj, kad veikt atkritumu savākšanu. Varam arī lūgt JVM palaist atkritumu savācēju. Taču nekādos apstākļos nav garantijas, ka JVM ievēros. JVM palaiž atkritumu savācēju, ja konstatē, ka trūkst atmiņas. Kad Java programma pieprasa atkritumu savācējam, JVM parasti izpilda pieprasījumu īsā laikā. Tas nepārliecina, ka pieprasījumi tiek pieņemti.

Galvenais ir saprast, ka ' kad objekts kļūst piemērots atkritumu savākšanai? '

Katrai Java programmai ir vairāk nekā viens pavediens. Katram pavedienam ir sava izpildes kaudze. Java programmā ir jāpalaiž pavediens, kas ir galvenā () metode. Tagad mēs varam teikt, ka objekts ir piemērots atkritumu savākšanai, ja tam nevar piekļūt neviens dzīvs pavediens. Atkritumu savācējs uzskata, ka objekts ir derīgs dzēšanai. Ja programmai ir atsauces mainīgais, kas attiecas uz objektu, šis atsauces mainīgais ir pieejams dzīvajam pavedienam, šis objekts tiek saukts sasniedzams .

Šeit rodas jautājums, ka ' Vai Java lietojumprogrammai var pietrūkt atmiņas? '

Atbilde ir jā. Atkritumu savākšanas sistēma mēģina izņemt objektus no atmiņas, kad tie netiek izmantoti. Tomēr, ja uzturat daudz dzīvu objektu, atkritumu savākšana negarantē, ka ir pietiekami daudz atmiņas. Efektīvi tiks pārvaldīta tikai pieejamā atmiņa.

Atkritumu savākšanas veidi

Ir pieci atkritumu savākšanas veidi:

    Sērijas GC:Tas izmanto atzīmes un slaucīšanas pieeju jaunām un vecām paaudzēm, kas ir neliela un liela GC.Paralēlā GC:Tas ir līdzīgs seriālajam GC, izņemot to, ka tas rada N (CPU kodolu skaits sistēmā) pavedienus jaunās paaudzes atkritumu savākšanai.Paralēli vecais GC:Tas ir līdzīgs paralēlajam GC, izņemot to, ka abām paaudzēm tiek izmantoti vairāki pavedieni.Vienlaicīgs Mark Sweep (CMS) savācējs:Tas veic atkritumu savākšanu vecajai paaudzei. Varat ierobežot pavedienu skaitu CMS savācējā, izmantojot XX:ParalleCMSThreads=JVM opcija . Tas ir pazīstams arī kā vienlaicīga zemas pauzes savācējs.G1 atkritumu savācējs:Tas tika ieviests Java 7. Tās mērķis ir aizstāt CMS savācēju. Tas ir paralēls, vienlaicīgs un CMS savācējs. Nav jaunās un vecās paaudzes telpas. Tas sadala kaudzi vairākās vienāda izmēra kaudzēs. Vispirms tiek apkopoti reģioni ar mazākiem reāllaika datiem.

Atzīmēšanas un slaucīšanas algoritms

JRockit JVM izmanto atzīmes un slaucīšanas algoritmu atkritumu savākšanai. Tajā ir divas fāzes, atzīmēšanas fāze un slaucīšanas fāze.

Atzīmēšanas fāze: Objekti, kuriem var piekļūt no pavedieniem, vietējiem rokturiem un citiem GC saknes avotiem, ir atzīmēti kā aktīvi. Katram objektu kokam ir vairāk nekā viens saknes objekts. GC sakne vienmēr ir sasniedzama. Tātad jebkurš objekts, kura saknē ir atkritumu savākšanas sakne. Tas identificē un atzīmē visus objektus, kas tiek izmantoti, un pārējos var uzskatīt par atkritumiem.

Atmiņas pārvaldība Java

Slaucīšanas fāze: Šajā fāzē kaudze tiek šķērsota, lai atrastu plaisu starp dzīvajiem objektiem. Šīs nepilnības ir ierakstītas brīvajā sarakstā un ir pieejamas jaunu objektu piešķiršanai.

Ir divas uzlabotas iezīmēšanas un slaucīšanas versijas:

    Vienlaicīga atzīmēšana un slaucīšana Paralēlā iezīmēšana un slaucīšana

Vienlaicīga atzīmēšana un slaucīšana

Tas ļauj pavedieniem turpināt darboties lielas atkritumu savākšanas daļas laikā. Ir šādi marķējuma veidi:

    Sākotnējais marķējums:Tas identificē dzīvo objektu saknes kopu. Tas tiek darīts, kamēr pavedieni ir apturēti.Vienlaicīga marķēšana:Šajā marķējumā tiek ievērota atsauce no saknes kopas. Tas atrod un atzīmē pārējos dzīvos objektus kaudzē. Tas tiek darīts, kamēr pavediens darbojas.Marķējums pirms tīrīšanas:Tas identificē izmaiņas, kas veiktas ar vienlaicīgu atzīmēšanu. Citi dzīvi objekti atzīmēti un atrasti. Tas tiek darīts, kamēr pavedieni darbojas.Galīgais marķējums:Tas identificē izmaiņas, kas veiktas ar iepriekšējas tīrīšanas marķējumu. Citi dzīvi objekti atzīmēti un atrasti. Tas tiek darīts, kamēr pavedieni ir apturēti.

Paralēlā iezīmēšana un slaucīšana

Tas izmanto visu sistēmā pieejamo CPU, lai pēc iespējas ātrāk veiktu atkritumu savākšanu. To sauc arī par paralēlo atkritumu savācēju. Pavedieni netiek izpildīti, kad tiek izpildīta paralēlā atkritumu savākšana.

Mark and Sweep plusi

  • Tas ir periodisks process.
  • Tā ir bezgalīga cilpa.
  • Algoritma izpildes laikā nav atļautas papildu pieskaitāmās izmaksas.

Mark and Sweep mīnusi

  • Tas aptur normālu programmas izpildi, kamēr darbojas atkritumu savākšanas algoritms.
  • Programmā tas darbojas vairākas reizes.