logo

Управление на паметта в Java

В Java управлението на паметта е процесът на разпределяне и премахване на разпределението на обекти, наречен управление на паметта. Java управлява автоматично паметта. Java използва система за автоматично управление на паметта, наречена a боклукчия . По този начин не се изисква да прилагаме логика за управление на паметта в нашето приложение. Управлението на паметта на Java се разделя на две основни части:

    JVM структура на паметта Работа на Garbage Collector

JVM структура на паметта

JVM създава различни области с данни по време на изпълнение в куп. Тези области се използват по време на изпълнение на програмата. Областите на паметта се унищожават, когато JVM излезе, докато областите с данни се унищожават, когато нишката излезе.

Управление на паметта в Java

Област на метода

Областта на метода е част от паметта на стека, която се споделя между всички нишки. Създава се при стартиране на JVM. Използва се за съхраняване на структура на клас, име на суперклас, име на интерфейс и конструктори. JVM съхранява следните видове информация в областта на метода:

  • Напълно квалифицирано име на тип (напр.: низ)
  • Модификаторите на типа
  • Директно име на суперклас на типа
  • Структуриран списък на напълно квалифицираните имена на супер интерфейси.

Област на купчина

Heap съхранява действителните обекти. Създава се при стартиране на JVM. Потребителят може да контролира купчината, ако е необходимо. Може да бъде с фиксиран или динамичен размер. Когато използвате нова ключова дума, JVM създава екземпляр за обекта в куп. Докато референцията на този обект се съхранява в стека. Съществува само една купчина за всеки работещ JVM процес. Когато купчината се напълни, боклукът се събира. Например:

 StringBuilder sb= new StringBuilder(); 

Горният оператор създава обект от класа StringBuilder. Обектът разпределя към купчината, а препратката sb разпределя към стека. Купчината е разделена на следните части:

възраст на ритик рошан
  • Младо поколение
  • Пространство за оцелели
  • Старо поколение
  • Постоянно поколение
  • Кеш код

Референтен тип

Има четири вида препратки: Силен , слаб , Мека , и Фантомна справка . Разликата между типовете препратки е, че обектите в купчината, към която се отнасят, са допустими за събиране на боклук според различните критерии.

Силна препратка: Много е просто, тъй като го използваме в ежедневното си програмиране. Всеки обект, към който има силна препратка, не отговаря на условията за събиране на боклук. Можем да създадем силна препратка, като използваме следния израз:

 StringBuilder sb= new StringBuilder(); 

Слаба референция: Не оцелява след следващия процес на събиране на боклука. Ако не сме сигурни кога данните ще бъдат поискани отново. В това състояние можем да създадем слаба препратка към него. В случай, че събирачът на отпадъци обработва, той унищожава обекта. Когато отново се опитаме да извлечем този обект, получаваме нулева стойност. Определено е в java.lang.ref.WeakReference клас. Можем да създадем слаба препратка, като използваме следния израз:

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

Мека справка: Събира се, когато на приложението липсва памет. Събирачът на отпадъци не събира труднодостъпните предмети. Всички меки реферирани обекти се събират, преди да хвърли OutOfMemoryError. Можем да създадем мека препратка, като използваме следния израз:

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

Справка за фантом: Предлага се в java.lang.ref пакет. Определено е в java.lang.ref.PhantomReference клас. Обектът, който има само фантомна препратка, която ги сочи, може да бъде събран винаги, когато събирачът на боклук иска да събере. Можем да създадем фантомна препратка, като използваме следния оператор:

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

Област на стека

Stack Area се генерира при създаване на нишка. Може да бъде с фиксиран или динамичен размер. Паметта на стека се разпределя за нишка. Използва се за съхраняване на данни и частични резултати. Той съдържа препратки към купчини обекти. Той също така съдържа самата стойност, а не препратка към обект от купчината. Променливите, които се съхраняват в стека, имат определена видимост, наречена обхват.

сив код

Стекова рамка: Рамката на стека е структура от данни, която съдържа данните на нишката. Данните за нишката представляват състоянието на нишката в текущия метод.

  • Използва се за съхраняване на частични резултати и данни. Той също така извършва динамично свързване, връщане на стойности чрез методи и изключения за изпращане.
  • Когато даден метод се извиква, се създава нова рамка. Той унищожава рамката, когато извикването на метода завърши.
  • Всеки кадър съдържа собствен масив от локални променливи (LVA), стек от операнди (OS) и данни за кадъра (FD).
  • Размерите на LVA, OS и FD, определени по време на компилиране.
  • Само един кадър (кадърът за изпълнение на метода) е активен във всяка точка на дадена нишка за управление. Този кадър се нарича текущ кадър, а неговият метод е известен като текущ метод. Класът на метода се нарича текущият клас.
  • Рамката спира текущия метод, ако неговият метод извика друг метод или ако методът завърши.
  • Рамката, създадена от нишка, е локална за тази нишка и не може да бъде препратена от друга нишка.

Стек на родния метод

Известен е също като C стек. Това е стек за естествен код, написан на език, различен от Java. Java Native Interface (JNI) извиква собствения стек. Производителността на родния стек зависи от операционната система.

PC регистри

Всяка нишка има регистър на програмния брояч (PC), свързан с нея. PC регистърът съхранява адреса за връщане или собствен указател. Той също така съдържа адреса на JVM инструкциите, които се изпълняват в момента.

Работа на Garbage Collector

Общ преглед на Garbage Collector

Когато една програма се изпълнява в Java, тя използва паметта по различни начини. Купчината е част от паметта, където живеят обектите. Това е единствената част от паметта, която участва в процеса на събиране на боклука. Известен е още като купчина за събиране на боклук. Цялото събиране на боклука гарантира, че купчината има възможно най-много свободно пространство. Функцията на събирача на отпадъци е да намира и изтрива обектите, които не могат да бъдат достигнати.

Разпределение на обекти

Когато даден обект разпределя, JRockit JVM проверява размера на обекта. Той прави разлика между малки и големи предмети. Малкият и големият размер зависят от версията на JVM, размера на купчината, стратегията за събиране на отпадъци и използваната платформа. Размерът на един обект обикновено е между 2 и 128 KB.

програма за капсулиране

Малките обекти се съхраняват в Thread Local Area (TLA), което е свободна част от купчината. TLA не се синхронизира с други нишки. Когато TLA се напълни, той изисква нов TLA.

От друга страна, големи обекти, които не се побират в TLA, директно се разпределят в купчината. Ако дадена нишка използва младото пространство, тя директно се съхранява в старото пространство. Големият обект изисква повече синхронизация между нишките.

Какво означава Java Garbage Collector?

JVM контролира събирача на отпадъци. JVM решава кога да извърши събирането на боклука. Можем също така да поискаме от JVM да стартира събирача на отпадъци. Но няма гаранция при никакви условия, че JVM ще се съобрази. JVM стартира събирача на отпадъци, ако усети, че паметта е на изчерпване. Когато Java програма поиска за събирача на отпадъци, JVM обикновено предоставя заявката в кратък срок. Не гарантира, че заявките се приемат.

Въпросът за разбиране е, че ' кога даден обект става подходящ за събиране на боклук? '

случай на превключване на java

Всяка Java програма има повече от една нишка. Всяка нишка има свой стек за изпълнение. Има нишка за изпълнение в Java програма, която е метод main(). Сега можем да кажем, че даден обект е подходящ за събиране на боклук, когато никоя жива нишка няма достъп до него. Събирачът на отпадъци счита този обект за подходящ за изтриване. Ако дадена програма има референтна променлива, която препраща към обект, тази референтна променлива е достъпна за жива нишка, този обект се извиква постижимо .

Тук възниква въпросът, че ' Може ли Java приложение да остане без памет? '

Отговорът е да. Системата за събиране на отпадъци се опитва да изтрие обекти от паметта, когато те не се използват. Въпреки това, ако поддържате много живи обекти, събирането на боклука не гарантира, че има достатъчно памет. Само наличната памет ще се управлява ефективно.

Видове събиране на отпадъци

Има пет вида събиране на боклука, както следва:

    Сериен GC:Той използва подхода за маркиране и почистване за млади и стари поколения, който е второстепенен и основен GC.Паралелен GC:Подобно е на серийния GC, с изключение на това, че създава N (броя процесорни ядра в системата) нишки за събиране на боклук от младо поколение.Паралелен стар GC:Той е подобен на паралелния GC, с изключение на това, че използва множество нишки и за двете поколения.Колектор за паралелно маркиране (CMS):Той събира боклука за старото поколение. Можете да ограничите броя на нишките в CMS колектора, като използвате XX:ParalleCMSThreads=JVM опция . Известен е още като паралелен колектор с ниска пауза.G1 Събирач на боклук:Въведен е в Java 7. Целта му е да замени CMS колектора. Това е паралелен, едновременен и CMS колектор. Няма пространство за млади и стари поколения. Той разделя купчината на няколко еднакви по размер купчини. Първо събира регионите с по-малко живи данни.

Алгоритъм за маркиране и почистване

JRockit JVM използва алгоритъма за маркиране и почистване за извършване на събиране на отпадъци. Той съдържа две фази, фаза на маркиране и фаза на почистване.

Маркирайте фаза: Обектите, които са достъпни от нишките, собствените манипулатори и други коренни източници на GC, се маркират като активни. Всяко дърво на обекти има повече от един корен обект. GC root е винаги достъпен. Така че всеки обект, който има корен за събиране на отпадъци в своя корен. Той идентифицира и маркира всички обекти, които се използват, а останалите могат да се считат за боклук.

Управление на паметта в Java

Фаза на почистване: В тази фаза купчината се пресича, за да се намери празнината между живите обекти. Тези пропуски се записват в свободния списък и са достъпни за ново разпределение на обекти.

Има две подобрени версии на маркиране и почистване:

топ 10 хентай
    Едновременно маркиране и почистване Паралелно маркиране и почистване

Едновременно маркиране и почистване

Това позволява на нишките да продължат да работят по време на голяма част от събирането на боклука. Има следните видове маркировка:

    Първоначална маркировка:Той идентифицира основния набор от живи обекти. Прави се, докато нишките са на пауза.Едновременно маркиране:В това маркиране се следва препратката от основния набор. Намира и маркира останалите живи обекти на куп. Прави се, докато нишката работи.Маркировка за предварително почистване:Той идентифицира промените, направени чрез едновременно маркиране. Маркирани и намерени други живи обекти. Прави се докато нишките вървят.Крайна маркировка:Той идентифицира промените, направени чрез маркиране преди почистване. Маркирани и намерени други живи обекти. Прави се, докато нишките са на пауза.

Паралелно маркиране и почистване

Той използва целия наличен CPU в системата за извършване на събирането на боклука възможно най-бързо. Нарича се още паралелен събирач на отпадъци. Нишките не се изпълняват, когато се изпълнява паралелното събиране на отпадъци.

Плюсове на Mark and Sweep

  • Това е повтарящ се процес.
  • Това е безкраен цикъл.
  • Не се допускат допълнителни разходи по време на изпълнението на алгоритъм.

Минуси на Mark и Sweep

  • Той спира нормалното изпълнение на програмата, докато алгоритъмът за събиране на отпадъци работи.
  • Изпълнява се няколко пъти по програма.