更新時(shí)間:2020-08-26 10:05:26 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1465次
大家都知道,Java中有堆、棧和方法區(qū),那它們之間有什么關(guān)系呢?小編就給Java堆棧方法區(qū)做了一個(gè)簡(jiǎn)單分析。
基礎(chǔ)數(shù)據(jù)類型直接在棧空間分配, 方法的形式參數(shù),直接在棧空間分配,當(dāng)方法調(diào)用完成后從棧空間回收。 引用數(shù)據(jù)類型,需要用new來(lái)創(chuàng)建,既在棧空間分配一個(gè)地址空間,又在堆空間分配對(duì)象的類變量 。 方法的引用參數(shù),在棧空間分配一個(gè)地址空間,并指向堆空間的對(duì)象區(qū),當(dāng)方法調(diào)用完成后從棧空間回收。
局部變量 new 出來(lái)時(shí),在棧空間和堆空間中分配空間,當(dāng)局部變量生命周期結(jié)束后,棧空間立刻被回收,堆空間區(qū)域等待GC回收。 方法調(diào)用時(shí)傳入的 literal 參數(shù),先在棧空間分配,在方法調(diào)用完成后從棧空間分配。字符串常量在 DATA 區(qū)域分配 ,this 在堆空間分配 。數(shù)組既在棧空間分配數(shù)組名稱, 又在堆空間分配數(shù)組實(shí)際的大小!
哦 對(duì)了,補(bǔ)充一下static在DATA區(qū)域分配。
從Java的這種分配機(jī)制來(lái)看,堆棧又可以這樣理解:堆棧(Stack)是操作系統(tǒng)在建立某個(gè)進(jìn)程時(shí)或者線程(在支持多線程的操作系統(tǒng)中是線程)為這個(gè)線程建立的存儲(chǔ)區(qū)域,該區(qū)域具有先進(jìn)后出的特性。
每一個(gè)Java應(yīng)用都唯一對(duì)應(yīng)一個(gè)JVM實(shí)例,每一個(gè)實(shí)例唯一對(duì)應(yīng)一個(gè)堆。應(yīng)用程序在運(yùn)行中所創(chuàng)建的所有類實(shí)例或數(shù)組都放在這個(gè)堆中,并由應(yīng)用所有的線程共享.跟C/C++不同,Java中分配堆內(nèi)存是自動(dòng)初始化的。Java中所有對(duì)象的存儲(chǔ)空間都是在堆中分配的,但是這個(gè)對(duì)象的引用卻是在堆棧中分配,也就是說(shuō)在建立一個(gè)對(duì)象時(shí)從兩個(gè)地方都分配內(nèi)存,在堆中分配的內(nèi)存實(shí)際建立這個(gè)對(duì)象,而在堆棧中分配的內(nèi)存只是一個(gè)指向這個(gè)堆對(duì)象的指針(引用)而已。
大家對(duì)Java堆棧方法區(qū)了解了嗎?如果還有不懂的地方,可以在動(dòng)力節(jié)點(diǎn)官網(wǎng)技術(shù)文檔中查閱相關(guān)資料。
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)