у Јави, управљање меморијом је витални процес. Њиме управља Јава аутоматски. ЈВМ дели меморију на два дела: гомила меморија и меморија гомиле. Из перспективе Јаве, обе су важне меморијске области, али се обе користе у различите сврхе. Тхе главна разлика између меморије стека и меморије хрпе је да се стек користи за чување редоследа извршења метода и локалних променљивих, док меморија хрпе складишти објекте и користи динамичку алокацију и ослобађање меморије. У овом одељку ћемо детаљно размотрити разлике између стека и гомиле.
Стацк Мемори
Меморија стека је физички простор (у РАМ-у) додељен свакој нити у време извршавања. Настаје када се креира нит. Управљање меморијом у стеку следи ЛИФО (Ласт-Ин-Фирст-Оут) редослед јер је доступно глобално. Чува променљиве, референце на објекте и делимичне резултате. Меморија додељена стеку живи све док се функција не врати. Ако нема простора за креирање нових објеката, избацује сејава.ланг.СтацкОверФловЕррор. Обим елемената је ограничен на њихове нити. Тхе ЈВМ креира посебан стек за сваку нит.
Хеап меморија
Креира се када се ЈВМ покрене и користи га апликација све док апликација ради. Чува објекте и ЈРЕ класе. Кад год креирамо објекте, он заузима простор у меморији гомиле док се референца тог објекта креира у стеку. Не прати никакав редослед попут стека. Динамички рукује меморијским блоковима. То значи да не морамо ручно да рукујемо меморијом. За аутоматско управљање меморијом, Јава обезбеђује сакупљач смећа који брише објекте који се више не користе. Меморија додељена хрпи живи све док се не догоди било који догађај, било да је програм прекинут или без меморије. Елементи су глобално доступни у апликацији. То је заједнички меморијски простор који се дели са свим нитима. Ако је простор гомиле пун, баца сејава.ланг.ОутОфМемориЕррор. Хеап меморија је даље подељена на следеће меморијске области:
- Млада генерација
- Сурвивор спаце
- Стара генерација
- Перманентна генерација
- Кеш кода
Следећа слика приказује доделу меморије стека и простора на хрпи.
Разлика између стек и хеап меморије
Следећа табела сумира све главне разлике између меморије стека и простора гомиле.
Параметар | Стацк Мемори | Хеап Спаце |
---|---|---|
Апликација | У њему се чувају предмети који имају веома кратак век као нпр методе, варијабле, и референтне варијабле од објеката. | То складишти објеката и Јава Рунтиме Енвиронмент ( ЈРЕ ) класе. |
Наручивање | Следи на ЛИФО ред. | Не прати никакав редослед јер је динамичка алокација меморије и нема никакав фиксни образац за доделу и делокацију меморијских блокова. |
Флексибилност | То је није флексибилан јер не можемо да променимо додељену меморију. | То је флексибилан јер можемо да променимо додељену меморију. |
Ефикасност | Има брже приступ, алокација и делокација. | Има спорији приступ, алокација и делокација. |
Величина меморије | То је мањи величина. | То је већи величина. |
Коришћене Јава опције | Можемо повећати величину стека користећи ЈВМ опцију -Кссс. | Можемо повећати или смањити величину хеап меморије коришћењем опција - Ксмк и -Ксмс ЈВМ. |
Видљивост или обим | Променљиве су видљиве само власничкој нити. | То је видљиво свим нитима. |
Генерација свемира | Када се креира нит, оперативни систем аутоматски додељује стек. | Да би креирао простор гомиле за апликацију, језик прво позива оперативни систем током извршавања. |
Дистрибуција | За сваки објекат се креира посебан стек. | Дели се међу свим нитима. |
Изузетак баца | ЈВМ баца јава.ланг.СтацкОверФловЕррор ако је величина стека већа од ограничења. Да бисте избегли ову грешку, повећајте величину стека. | ЈВМ баца јава.ланг.ОутОфМемориЕррор ако ЈВМ није у стању да креира нови изворни метод. |
Алокација/ Деаллоцатион | То се аутоматски ради компајлер . | То се ради ручно од стране програмер . |
Цост | Њена цена је мање . | Њена цена је више у поређењу са стеком. |
Имплементација | Његова имплементација је тешко . | Његова имплементација је лако . |
Редослед расподеле | Алокација меморије је континуирано . | Меморија додељена у насумично ред. |
Тхреад-Сафети | Безбедан је за нити јер свака нит има свој стек. | Није безбедан нити, тако да је потребна правилна синхронизација кода. |