logo

Stack vs Heap Java

Java valodā, atmiņas pārvaldība ir būtisks process. To automātiski pārvalda Java. JVM sadala atmiņu divās daļās: kaudze atmiņa un kaudzes atmiņa. No Java viedokļa abas ir svarīgas atmiņas zonas, taču abas tiek izmantotas dažādiem mērķiem. The galvenā atšķirība starp steka atmiņu un kaudzes atmiņu ir tas, ka steku izmanto, lai saglabātu metodes izpildes secību un vietējos mainīgos, savukārt kaudzes atmiņā tiek glabāti objekti un tiek izmantota dinamiskā atmiņas piešķiršana un atdalīšana. Šajā sadaļā mēs detalizēti apspriedīsim atšķirības starp kaudzi un kaudzi.

Stack vs Heap Java

Stack Memory

Steka atmiņa ir fiziska vieta (RAM), kas izpildes laikā ir piešķirta katram pavedienam. Tas tiek izveidots, kad tiek izveidots pavediens. Atmiņas pārvaldība stekā atbilst LIFO (Last-In-First-Out) secībai, jo tā ir pieejama globāli. Tas saglabā mainīgos lielumus, atsauces uz objektiem un daļējus rezultātus. Atmiņa ir piešķirta steka dzīves laikam, līdz funkcija atgriežas. Ja nav vietas jaunu objektu izveidei, tas izmetjava.lang.StackOverFlowError. Elementu darbības joma ir ierobežota ar to pavedieniem. The JVM izveido atsevišķu kaudzi katram pavedienam.

Kaudzes atmiņa

Tas tiek izveidots, kad tiek startēts JVM, un lietojumprogramma to izmanto tik ilgi, kamēr lietojumprogramma darbojas. Tajā tiek glabāti objekti un JRE klases. Ikreiz, kad mēs veidojam objektus, tas aizņem vietu kaudzes atmiņā, kamēr šī objekta atsauce tiek izveidota kaudzē. Tas neatbilst nevienai kārtībai, piemēram, kaudzei. Tas dinamiski apstrādā atmiņas blokus. Tas nozīmē, ka atmiņa nav jāapstrādā manuāli. Lai automātiski pārvaldītu atmiņu, Java nodrošina atkritumu savācēju, kas izdzēš objektus, kas vairs netiek izmantoti. Atmiņa, kas piešķirta kaudzēm, dzīvo līdz kādam notikumam, vai nu programma tiek pārtraukta, vai nenotiek atmiņas atbrīvošana. Lietojumprogrammā elementi ir pieejami globāli. Tā ir kopīga atmiņas telpa, kas tiek koplietota ar visiem pavedieniem. Ja kaudzes vieta ir pilna, tas izmetjava.lang.OutOfMemoryError. Kaudzes atmiņa ir sadalīta šādos atmiņas apgabalos:

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

Nākamajā attēlā parādīts steka atmiņas un kaudzes vietas sadalījums.

Stack vs Heap Java

Atšķirība starp kaudzes un kaudzes atmiņu

Šajā tabulā ir apkopotas visas galvenās atšķirības starp steka atmiņu un kaudzes vietu.

Parametrs Stack Memory Kaudzes telpa
Pieteikums Tajā tiek glabāti priekšmeti, kuriem ir ļoti īss kalpošanas laiks, piemēram, metodes, mainīgie, un atsauces mainīgie no objektiem. Tas uzglabā objektus un Java Runtime Environment ( JRE ) klases.
Pasūtīšana No tā izriet LIFO pasūtījums. Tam nav nekādas secības, jo tā ir dinamiska atmiņas piešķiršana, un tai nav noteikta modeļa atmiņas bloku piešķiršanai un atdalīšanai.
Elastība Tas ir nav elastīgs jo mēs nevaram mainīt piešķirto atmiņu. Tas ir elastīgs jo mēs varam mainīt piešķirto atmiņu.
Efektivitāte Tā ir ātrāk piekļuve, piešķiršana un sadalīšana. Tā ir lēnāk piekļuve, piešķiršana un atdalīšana.
Atmiņas lielums Tas ir mazāks izmērā. Tas ir lielāks izmērā.
Izmantotās Java opcijas Mēs varam palielināt steka lielumu, izmantojot JVM opciju -Xss. Mēs varam palielināt vai samazināt kaudzes atmiņas lielumu, izmantojot opcijas - Xmx un -Xms JVM.
Redzamība vai darbības joma Mainīgie lielumi ir redzami tikai īpašnieka pavedienam. Tas ir redzams visiem pavedieniem.
Kosmosa paaudze Kad pavediens ir izveidots, operētājsistēma automātiski piešķir steku. Lai lietojumprogrammai izveidotu kaudzes vietu, valoda izpildes laikā vispirms izsauc operētājsistēmu.
Izplatīšana Katram objektam tiek izveidota atsevišķa kaudze. Tas tiek koplietots starp visiem pavedieniem.
Izņēmuma metieni JVM met java.lang.StackOverFlowError ja kaudzes izmērs ir lielāks par ierobežojumu. Lai izvairītos no šīs kļūdas, palieliniet kaudzes izmēru. JVM met java.lang.OutOfMemoryError ja JVM nevar izveidot jaunu vietējo metodi.
Piešķiršana/ sadale To veic automātiski kompilators . To veic manuāli programmētājs .
Izmaksas Tās izmaksas ir mazāk . Tās izmaksas ir vairāk salīdzinot ar steku.
Īstenošana Tās īstenošana ir grūti . Tās īstenošana ir viegli .
Piešķiršanas kārtība Atmiņas piešķiršana ir nepārtraukts . Atmiņa ir piešķirta nejauši pasūtījums.
Pavediens-Drošība Tas ir drošs pavedienam, jo ​​katram pavedienam ir sava kaudze. Tas nav pavedienu drošs, tāpēc ir nepieciešama pareiza koda sinhronizācija.