logo

Minneshantering i Java

I Java är minneshantering processen för allokering och avallokering av objekt, som kallas minneshantering. Java hanterar minneshantering automatiskt. Java använder ett automatiskt minneshanteringssystem som kallas a skräp samlare . Vi är alltså inte skyldiga att implementera minneshanteringslogik i vår applikation. Java-minneshantering delas in i två huvuddelar:

    JVM minnesstruktur Arbete av sophämtaren

JVM minnesstruktur

JVM skapar olika körtidsdataområden i en hög. Dessa områden används under programkörningen. Minnesområdena förstörs när JVM avslutas, medan dataområdena förstörs när tråden avslutas.

Minneshantering i Java

Metodområde

Metodområdet är en del av heapminnet som delas mellan alla trådar. Det skapas när JVM startar. Den används för att lagra klassstruktur, superklassnamn, gränssnittsnamn och konstruktörer. JVM lagrar följande typer av information i metodområdet:

  • Ett fullständigt kvalificerat namn av en typ (t.ex. sträng)
  • Typens modifierare
  • Typens direkta superklassnamn
  • En strukturerad lista över de fullt kvalificerade namnen på supergränssnitt.

Högområde

Heap lagrar de faktiska föremålen. Det skapas när JVM startar. Användaren kan styra högen om det behövs. Den kan vara av fast eller dynamisk storlek. När du använder ett nytt nyckelord skapar JVM en instans för objektet i en hög. Medan referensen för det objektet lagras i stacken. Det finns bara en hög för varje körande JVM-process. När högen blir full samlas soporna upp. Till exempel:

 StringBuilder sb= new StringBuilder(); 

Ovanstående uttalande skapar ett objekt av klassen StringBuilder. Objektet allokeras till högen, och referensen sb allokerar till stack. Heap är uppdelat i följande delar:

  • Ung generation
  • Överlevande utrymme
  • Gammal generation
  • Permanent generation
  • Kodcache

Referenstyp

Det finns fyra typer av referenser: Stark , Svag , Mjuk , och Fantomreferens . Skillnaden mellan typerna av referenser är att föremålen på högen de refererar till är berättigade till sophämtning enligt de olika kriterierna.

Stark referens: Det är väldigt enkelt då vi använder det i vår dagliga programmering. Alla föremål som har en stark referens är inte kvalificerad för sophämtning. Vi kan skapa en stark referens genom att använda följande uttalande:

array av struktur i c-språk
 StringBuilder sb= new StringBuilder(); 

Svag referens: Den överlever inte efter nästa sophämtningsprocess. Om vi ​​inte är säkra på när uppgifterna kommer att begäras igen. I detta tillstånd kan vi skapa en svag referens till den. I fallet, om sophämtaren bearbetar, förstör den föremålet. När vi igen försöker hämta det objektet får vi ett nollvärde. Det definieras i java.lang.ref.WeakReference klass. Vi kan skapa en svag referens genom att använda följande uttalande:

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

Mjuk referens: Den samlas in när applikationen har ont om minne. Sopsamlaren samlar inte upp de lätt nåbara föremålen. Alla mjuka refererade objekt samlas in innan det kastar ett OutOfMemoryError. Vi kan skapa en mjuk referens genom att använda följande uttalande:

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

Fantomreferens: Den finns i java.lang.ref paket. Det definieras i java.lang.ref.PhantomReference klass. Föremålet som endast har fantomreferenser som pekar på dem kan samlas in när sopsamlaren vill samla in. Vi kan skapa en fantomreferens genom att använda följande uttalande:

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

Stackområde

Stack Area genereras när en tråd skapas. Den kan vara av antingen fast eller dynamisk storlek. Stackminnet tilldelas per tråd. Den används för att lagra data och delresultat. Den innehåller referenser till högobjekt. Det har också själva värdet snarare än en referens till ett objekt från högen. Variablerna som lagras i stacken har en viss synlighet, så kallad scope.

Stackram: Stack frame är en datastruktur som innehåller trådens data. Tråddata representerar tillståndet för tråden i den aktuella metoden.

  • Den används för att lagra partiella resultat och data. Den utför också dynamisk länkning, värden returneras av metoder och sändningsundantag.
  • När en metod anropar skapas en ny ram. Det förstör ramen när anropet av metoden är klar.
  • Varje ram innehåller en egen Local Variable Array (LVA), Operand Stack (OS) och Frame Data (FD).
  • Storlekarna på LVA, OS och FD bestämdes vid kompileringstillfället.
  • Endast en ram (ramen för exekveringsmetoden) är aktiv vid någon punkt i en given kontrolltråd. Denna ram kallas den aktuella ramen, och dess metod är känd som den aktuella metoden. Metodklassen kallas den aktuella klassen.
  • Ramen stoppar den aktuella metoden, om dess metod anropar en annan metod eller om metoden slutförs.
  • Ramen som skapas av en tråd är lokal för den tråden och kan inte refereras av någon annan tråd.

Native Method Stack

Det är också känt som C-stack. Det är en stack för inbyggd kod skriven på ett annat språk än Java. Java Native Interface (JNI) anropar den ursprungliga stacken. Prestandan för den inbyggda stacken beror på operativsystemet.

PC-register

Varje tråd har ett programräknare (PC) register associerat med sig. PC-registret lagrar returadressen eller en inbyggd pekare. Den innehåller också adressen till JVM-instruktionerna som för närvarande exekveras.

Arbete av Garbage Collector

Garbage Collector Översikt

När ett program körs i Java använder det minne på olika sätt. Högen är en del av minnet där föremål lever. Det är den enda delen av minnet som är involverad i sophämtningsprocessen. Det är också känt som sopsamlingshög. All sophämtning ser till att högen har så mycket ledigt utrymme som möjligt. Sophämtarens funktion är att hitta och radera de föremål som inte går att nå.

css-omslutningstext

Objekttilldelning

När ett objekt allokerar, kontrollerar JRockit JVM storleken på objektet. Den skiljer på små och stora föremål. Den lilla och stora storleken beror på JVM-versionen, högstorlek, sophämtningsstrategi och plattform som används. Storleken på ett objekt är vanligtvis mellan 2 och 128 KB.

De små föremålen lagras i Thread Local Area (TLA) som är en fri del av högen. TLA synkroniserar inte med andra trådar. När TLA blir full, begär den en ny TLA.

Å andra sidan, stora föremål som inte får plats inuti TLA direkt tilldelas högen. Om en tråd använder det unga utrymmet, lagras det direkt i det gamla utrymmet. Det stora objektet kräver mer synkronisering mellan trådarna.

jämförbar java

Vad gör Java Garbage Collector?

JVM styr sopsamlaren. JVM bestämmer när sophämtningen ska utföras. Vi kan även begära att JVM får driva sophämtaren. Men det finns ingen garanti under några villkor att JVM kommer att följa. JVM kör sopsamlaren om den känner att minnet börjar ta slut. När Java-program begär för sopsamlaren, beviljar JVM vanligtvis begäran på kort tid. Den ser inte till att förfrågningarna accepteras.

Poängen att förstå är att ' när ett föremål blir kvalificerat för sophämtning? '

Varje Java-program har mer än en tråd. Varje tråd har sin exekveringsstack. Det finns en tråd att köra i Java-programmet som är en main()-metod. Nu kan vi säga att ett objekt är kvalificerat för sophämtning när ingen live-tråd kan komma åt det. Sopsamlaren anser att objektet kan raderas. Om ett program har en referensvariabel som refererar till ett objekt, den referensvariabeln som är tillgänglig för live-tråden, anropas detta objekt nås .

Här uppstår en fråga om att ' Kan en Java-applikation få slut på minne? '

Svaret är ja. Sophämtningssystemet försöker hämta föremål från minnet när de inte används. Men om du underhåller många levande föremål, garanterar inte sophämtning att det finns tillräckligt med minne. Endast tillgängligt minne kommer att hanteras effektivt.

Typer av sophämtning

Det finns fem typer av sophämtning:

    Seriell GC:Den använder sig av mark and sweeps-metoden för unga och gamla generationer, vilket är mindre och större GC.Parallell GC:Det liknar seriell GC förutom att det skapar N (antalet CPU-kärnor i systemet) trådar för den unga generationens sophämtning.Parallell Old GC:Den liknar parallell GC, förutom att den använder flera trådar för båda generationerna.Concurrent Mark Sweep (CMS) Collector:Den sköter sophämtningen för den gamla generationen. Du kan begränsa antalet trådar i CMS-samlaren med hjälp av XX:ParalleCMSThreads=JVM-alternativ . Den är också känd som Concurrent Low Pause Collector.G1 Garbage Collector:Den introducerades i Java 7. Dess mål är att ersätta CMS-samlaren. Det är en parallell, samtidig och CMS-samlare. Det finns inget utrymme för ung och gammal generation. Den delar upp högen i flera lika stora högar. Den samlar först in regioner med mindre livedata.

Markerings- och svepalgoritm

JRockit JVM använder märkes- och svepalgoritmen för att utföra sophämtningen. Den innehåller två faser, markeringsfasen och svepfasen.

Markera fas: Objekt som är tillgängliga från trådarna, inbyggda handtag och andra GC-rotkällor är markerade som live. Varje objektträd har mer än ett rotobjekt. GC-roten är alltid tillgänglig. Alltså alla föremål som har en sopsamlingsrot vid roten. Den identifierar och markerar alla föremål som används, och de återstående kan betraktas som skräp.

lista på java
Minneshantering i Java

Svepfas: I denna fas korsas högen för att hitta gapet mellan de levande objekten. Dessa luckor registreras i gratislistan och är tillgängliga för tilldelning av nya objekt.

Det finns två förbättrade versioner av markering och svep:

    Samtidigt Mark och Sweep Parallell Mark och Sweep

Samtidigt Mark och Sweep

Det gör att trådarna kan fortsätta löpa under en stor del av sophämtningen. Det finns följande typer av märkning:

    Inledande märkning:Den identifierar rotuppsättningen av levande objekt. Det görs medan trådar är pausade.Samtidig markering:I denna markering följs referensen från rotuppsättningen. Den hittar och markerar resten av de levande föremålen i en hög. Det görs medan tråden är igång.Förrengöringsmärkning:Den identifierar de ändringar som gjorts genom samtidig markering. Andra levande föremål markerade och hittade. Det görs medan trådarna körs.Slutmärkning:Den identifierar de ändringar som gjorts genom förrengöringsmärkning. Andra levande föremål markerade och hittade. Det görs medan trådar är pausade.

Parallell Mark och Sweep

Den använder all tillgänglig CPU i systemet för att utföra sophämtningen så snabbt som möjligt. Det kallas också för den parallella sophämtaren. Trådar körs inte när den parallella sophämtningen körs.

Fördelar med Mark and Sweep

  • Det är en återkommande process.
  • Det är en oändlig slinga.
  • Inga ytterligare omkostnader tillåtna under exekvering av en algoritm.

Nackdelar med Mark and Sweep

  • Den stoppar den normala programkörningen medan algoritmen för sopsamling körs.
  • Det körs flera gånger på ett program.