logo

Muistinhallinta Javassa

Javassa muistinhallinta on kohteiden allokoinnin ja purkamisen prosessi, jota kutsutaan muistin hallintaan. Java hoitaa muistinhallinnan automaattisesti. Java käyttää automaattista muistinhallintajärjestelmää nimeltä a roskankerääjä . Näin ollen meidän ei tarvitse ottaa käyttöön muistinhallintalogiikkaa sovelluksessamme. Java-muistinhallinta jakautuu kahteen suureen osaan:

    JVM:n muistirakenne Jätteenkeräajan työskentely

JVM:n muistirakenne

JVM luo erilaisia ​​ajonaikaisia ​​tietoalueita kasaan. Näitä alueita käytetään ohjelman suorittamisen aikana. Muistialueet tuhoutuvat, kun JVM poistuu, kun taas tietoalueet tuhoutuvat säikeen poistuessa.

Muistinhallinta Javassa

Menetelmäalue

Method Area on osa keon muistia, joka jaetaan kaikkien säikeiden kesken. Se luo, kun JVM käynnistyy. Sitä käytetään luokkarakenteen, superluokan nimen, käyttöliittymän nimen ja rakentajien tallentamiseen. JVM tallentaa seuraavanlaisia ​​tietoja menetelmäalueelle:

  • Tyypin täysin hyväksytty nimi (esim. merkkijono)
  • Tyypin modifioijat
  • Kirjoita suora superluokan nimi
  • Jäsennelty luettelo superrajapintojen täydellisistä nimistä.

Kasan alue

Kasa tallentaa todelliset esineet. Se luo, kun JVM käynnistyy. Käyttäjä voi ohjata kasaa tarvittaessa. Se voi olla kiinteän tai dynaamisen kokoinen. Kun käytät uutta avainsanaa, JVM luo esiintymän objektille kasaan. Vaikka kohteen viite tallennetaan pinoon. Jokaiselle käynnissä olevalle JVM-prosessille on olemassa vain yksi kasa. Kun kasa täyttyy, roskat kerätään talteen. Esimerkiksi:

 StringBuilder sb= new StringBuilder(); 

Yllä oleva lauseke luo StringBuilder-luokan objektin. Objekti varaa keon ja viite sb varaa pinon. Kasa on jaettu seuraaviin osiin:

  • Nuori sukupolvi
  • Selviytymistila
  • Vanha sukupolvi
  • Pysyvä sukupolvi
  • Koodivälimuisti

Viitetyyppi

Viittauksia on neljää tyyppiä: Vahva , Heikko , Pehmeä , ja Haamuviittaus . Ero viittaustyyppien välillä on se, että kasan kohteet, joihin ne viittaavat, ovat kelvollisia roskien keräilyyn eri kriteereillä.

Vahva viittaus: Se on hyvin yksinkertainen, koska käytämme sitä päivittäisessä ohjelmoinnissamme. Mikään esine, johon on liitetty vahva viittaus, ei ole kelvollinen roskien keräämiseen. Voimme luoda vahvan viittauksen käyttämällä seuraavaa lausetta:

 StringBuilder sb= new StringBuilder(); 

Heikko viite: Se ei selviä seuraavan roskankeräysprosessin jälkeen. Jos emme ole varmoja, milloin tietoja pyydetään uudelleen. Tässä tilanteessa voimme luoda heikon viittauksen siihen. Jos jätteenkerääjä käsittelee, se tuhoaa kohteen. Kun yritämme uudelleen noutaa kyseisen objektin, saamme nolla-arvon. Se on määritelty kohdassa java.lang.ref.WeakReference luokkaa. Voimme luoda heikon viittauksen käyttämällä seuraavaa lausetta:

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

Pehmeä viite: Se kerätään, kun sovelluksen muisti on vähissä. Jätteenkeräin ei kerää pehmeästi ulottuvia esineitä. Kaikki pehmeäviittaiset objektit kerätään ennen kuin se lähettää OutOfMemoryError-ilmoituksen. Voimme luoda pehmeän viittauksen käyttämällä seuraavaa lausetta:

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

Phantom-viite: Se on saatavilla java.lang.ref paketti. Se on määritelty kohdassa java.lang.ref.PhantomReference luokkaa. Kohde, jolla on vain niihin osoittava haamuviittaus, voidaan kerätä aina kun roskankeräilijä haluaa kerätä. Voimme luoda haamuviittauksen käyttämällä seuraavaa lausetta:

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

Pinoalue

Pinoalue syntyy, kun säiettä luodaan. Se voi olla joko kiinteän tai dynaamisen kokoinen. Pinomuisti on varattu säiettä kohden. Sitä käytetään tietojen ja osittaisten tulosten tallentamiseen. Se sisältää viittauksia kasaobjekteihin. Se sisältää myös itse arvon eikä viittausta kasan objektiin. Pinoon tallennetuilla muuttujilla on tietty näkyvyys, jota kutsutaan laajuudeksi.

jos muuten jos muuten jos java

Pinokehys: Pinokehys on tietorakenne, joka sisältää säikeen tiedot. Säikeen tiedot edustavat säikeen tilaa nykyisessä menetelmässä.

  • Sitä käytetään osittaisten tulosten ja tietojen tallentamiseen. Se suorittaa myös dynaamista linkittämistä, arvojen palauttamista menetelmien mukaan ja lähetyspoikkeuksia.
  • Kun menetelmä kutsuu, uusi kehys luodaan. Se tuhoaa kehyksen, kun menetelmän kutsu on valmis.
  • Jokainen kehys sisältää oman paikallisen muuttujan taulukon (LVA), operandipinon (OS) ja kehysdatan (FD).
  • LVA:n, OS:n ja FD:n koot määritetään käännöshetkellä.
  • Vain yksi kehys (suoritusmenetelmän kehys) on aktiivinen missä tahansa kohdassa tietyssä ohjaussäikeessä. Tätä kehystä kutsutaan nykyiseksi kehykseksi, ja sen menetelmä tunnetaan nykyisenä menetelmänä. Metodin luokkaa kutsutaan nykyiseksi luokaksi.
  • Kehys pysäyttää nykyisen menetelmän, jos sen menetelmä kutsuu toisen menetelmän tai jos menetelmä valmistuu.
  • Säikeen luoma kehys on paikallinen kyseiselle säikeelle, eikä siihen voi viitata millään muulla säikeellä.

Alkuperäinen menetelmäpino

Se tunnetaan myös nimellä C-pino. Se on pino alkuperäiselle koodille, joka on kirjoitettu muulla kielellä kuin Java. Java Native Interface (JNI) kutsuu alkuperäistä pinoa. Alkuperäisen pinon suorituskyky riippuu käyttöjärjestelmästä.

PC-rekisterit

Jokaiseen säikeeseen liittyy ohjelmalaskuri (PC) -rekisteri. PC-rekisteri tallentaa palautusosoitteen tai alkuperäisen osoittimen. Se sisältää myös parhaillaan suoritettavien JVM-käskyjen osoitteen.

Jätteenkeräajan työ

Jätteenkeräimen yleiskatsaus

Kun ohjelma suoritetaan Java-kielellä, se käyttää muistia eri tavoin. Kasa on osa muistia, jossa esineet elävät. Se on ainoa osa muistia, joka osallistuu roskien keräysprosessiin. Se tunnetaan myös kerättävänä roskakasana. Kaikella roskatkeräyksellä varmistetaan, että kasaan jää mahdollisimman paljon vapaata tilaa. Roskakeräimen tehtävänä on löytää ja poistaa kohteet, joihin ei päästä käsiksi.

Objektin jako

Kun objekti varaa, JRockit JVM tarkistaa objektin koon. Se erottaa pienet ja suuret esineet. Pieni ja suuri koko riippuu JVM-versiosta, kasan koosta, jätteenkeräysstrategiasta ja käytetystä alustasta. Objektin koko on yleensä 2-128 kt.

Pienet objektit tallennetaan Thread Local Area (TLA) -alueeseen, joka on vapaa osa kasasta. TLA ei synkronoidu muiden säikeiden kanssa. Kun TLA täyttyy, se pyytää uutta TLA:ta.

Toisaalta suuret esineet, jotka eivät mahdu TLA:n sisään, allokoidaan suoraan kasaan. Jos lanka käyttää nuorta tilaa, se tallennetaan suoraan vanhaan tilaan. Suuri kohde vaatii enemmän synkronointia säikeiden välillä.

Mitä Java Garbage Collector tekee?

JVM ohjaa roskakoria. JVM päättää, milloin jätekeruu suoritetaan. Voimme myös pyytää JVM:tä ottamaan roskankeräimen käyttöön. Mikään ei kuitenkaan takaa, että JVM noudattaa niitä. JVM suorittaa roskakeräimen, jos se havaitsee, että muisti on vähissä. Kun Java-ohjelma pyytää roskakoria, JVM yleensä hyväksyy pyynnön lyhyessä järjestyksessä. Se ei varmista, että pyynnöt hyväksytään.

Asia on ymmärrettävä, että milloin esine tulee jätteenkeräyskelpoiseksi? '

Jokaisessa Java-ohjelmassa on useampi kuin yksi säie. Jokaisella säikeellä on suorituspinonsa. Java-ohjelmassa on ajettava säie, joka on main()-metodi. Nyt voidaan sanoa, että objekti on kelvollinen roskakoriin, kun mikään live säie ei pääse siihen käsiksi. Jätteenkeräilijä katsoo, että kohde on poistettavissa. Jos ohjelmalla on viitemuuttuja, joka viittaa objektiin, joka viitemuuttuja on live-säikeen käytettävissä, tämä objekti on ns. tavoitettavissa .

Tässä herää kysymys, että ' Voiko Java-sovelluksen muisti loppua? '

Vastaus on kyllä. Roskienkeräysjärjestelmä yrittää kerätä esineitä muistista, kun ne eivät ole käytössä. Jos kuitenkin ylläpidät monia eläviä kohteita, roskien kerääminen ei takaa, että muistia on tarpeeksi. Vain käytettävissä olevaa muistia hallitaan tehokkaasti.

Jätekeräyksen tyypit

Jätteenkeräystyyppejä on viisi:

    Sarja GC:Se käyttää mark and sweeps -lähestymistapaa nuorille ja vanhoille sukupolville, mikä on vähäistä ja suurta GC:tä.Rinnakkais GC:Se on samanlainen kuin sarja-GC, paitsi että se synnyttää N (järjestelmän prosessoriytimien lukumäärä) säiettä nuoren sukupolven roskien keräämistä varten.Rinnakkais vanha GC:Se on samanlainen kuin rinnakkainen GC, paitsi että se käyttää useita säikeitä molemmille sukupolville.Samanaikainen Mark Sweep (CMS) -kerääjä:Se hoitaa vanhan sukupolven roskat. Voit rajoittaa säikeiden määrää CMS-kokoelmassa käyttämällä XX:ParalleCMSThreads=JVM-vaihtoehto . Se tunnetaan myös nimellä Concurrent Low Pause Collector.G1 roskakori:Se esiteltiin Java 7:ssä. Sen tavoitteena on korvata CMS-keräilijä. Se on rinnakkainen, samanaikainen ja CMS-keräilijä. Nuorten ja vanhojen sukupolvien tilaa ei ole. Se jakaa kasan useisiin samankokoisiin kasoihin. Se kerää ensin alueet, joilla on vähemmän live-dataa.

Mark and Sweep -algoritmi

JRockit JVM käyttää merkki- ja pyyhkäisyalgoritmia roskien keräämiseen. Se sisältää kaksi vaihetta, merkkivaiheen ja pyyhkäisyvaiheen.

Merkintävaihe: Objektit, jotka ovat käytettävissä säikeistä, alkuperäisistä kahvoista ja muista GC-juurilähteistä, on merkitty reaaliaikaisiksi. Jokaisessa objektipuussa on useampi kuin yksi juuriolio. GC-juuri on aina tavoitettavissa. Joten mikä tahansa esine, jonka juurella on roskatkeräysjuuri. Se tunnistaa ja merkitsee kaikki käytössä olevat kohteet, ja loput voidaan pitää roskana.

Muistinhallinta Javassa

Lakaisuvaihe: Tässä vaiheessa kasa ajetaan läpi elävien kohteiden välisen raon löytämiseksi. Nämä aukot kirjataan vapaaseen luetteloon ja ovat käytettävissä uusien kohteiden allokointia varten.

Merkitse ja pyyhkäisystä on kaksi parannettua versiota:

    Samanaikainen Mark and Sweep Parallel Mark and Sweep

Samanaikainen Mark and Sweep

Sen avulla säikeet voivat jatkaa toimintaansa suuren osan roskienkeräyksestä. On olemassa seuraavanlaisia ​​merkintöjä:

    Alkuperäinen merkintä:Se tunnistaa elävien objektien juurijoukon. Se tehdään ketjujen ollessa taukotilassa.Samanaikainen merkintä:Tässä merkinnässä noudatetaan juurijoukon viittausta. Se löytää ja merkitsee loput elävät kohteet kasaan. Se tehdään langan ollessa käynnissä.Esipuhdistusmerkintä:Se tunnistaa samanaikaisen merkinnän tekemät muutokset. Muita eläviä esineitä merkitty ja löydetty. Se tehdään säikeiden ollessa käynnissä.Lopullinen merkintä:Se tunnistaa esipuhdistusmerkinnällä tehdyt muutokset. Muita eläviä esineitä merkitty ja löydetty. Se tehdään ketjujen ollessa taukotilassa.

Parallel Mark and Sweep

Se käyttää kaikkia käytettävissä olevia prosessoreita järjestelmässä suorittaakseen roskien keräämisen mahdollisimman nopeasti. Sitä kutsutaan myös rinnakkaisjätteenkerääjäksi. Säikeet eivät käynnisty, kun rinnakkainen roskienkeräys suoritetaan.

Mark and Sweepin plussat

  • Se on toistuva prosessi.
  • Se on ääretön silmukka.
  • Ylimääräisiä yleiskustannuksia ei sallita algoritmin suorittamisen aikana.

Mark and Sweepin miinukset

  • Se pysäyttää ohjelman normaalin suorituksen, kun roskankeräysalgoritmi on käynnissä.
  • Se suoritetaan useita kertoja ohjelmassa.