????????最近一段時(shí)間面試經(jīng)常被問到j(luò)ava中堆和棧的問題磺樱,為了后面不會(huì)忘砰蠢,于是整理一份。其實(shí)這是java內(nèi)存區(qū)域劃分的問題虱岂,也就是jvm內(nèi)存區(qū)域劃分的問題(如何分配和回收內(nèi)存空間)玖院。
? ? ? ? java數(shù)據(jù)區(qū)通常包括這幾個(gè)部分:程序計(jì)數(shù)器(Program Counter Register)、Java棧(VM Stack)第岖、本地方法棧(Native Method Stack)难菌、方法區(qū)(Method Area)、堆(Heap)蔑滓。
????????程序計(jì)數(shù)器:用于指示需要執(zhí)行的指令郊酒,每個(gè)進(jìn)程各自擁有獨(dú)立的程序計(jì)數(shù)器。
????????Java棧:由棧幀組成键袱。棧幀在一個(gè)方法被調(diào)用時(shí)創(chuàng)建燎窘,并壓棧。在方法結(jié)束時(shí)出棧杠纵。故當(dāng)前java棧頂部的棧幀必對(duì)應(yīng)正在執(zhí)行的方法荠耽。每個(gè)進(jìn)程各自擁有獨(dú)立的java棧。棧幀中記錄的內(nèi)容包含:局部變量表(Local Variables)比藻、操作數(shù)棧(Operand Stack)铝量、指向當(dāng)前方法所屬的類的運(yùn)行時(shí)常量池的引用(Reference to runtime constant pool)、方法返回地址(Return Address)和一些額外的附加信息银亲。
????????????????局部變量表:對(duì)于基本數(shù)據(jù)類型的變量直接存儲(chǔ)它的值慢叨,對(duì)于引用類型的變量則存儲(chǔ)指向?qū)ο蟮囊谩?/p>
? ??????????????操作數(shù)棧:可理解為java虛擬機(jī)棧中的一個(gè)用于計(jì)算的臨時(shí)數(shù)據(jù)存儲(chǔ)區(qū),用于方法執(zhí)行時(shí)零時(shí)存儲(chǔ)數(shù)據(jù)的务蝠。
????????????????指向常量池的引用:常量不存儲(chǔ)在java棧中拍谐,所以棧用需要使用常量就需要存儲(chǔ)常量的引用。
? ? ? ??????????方法返回地址:方法完成后,需要返回之前調(diào)用該方法的方法轩拨,所以需要存儲(chǔ)方法返回前的地址践瓷。
? ??????本地方法棧:與java棧作用類似,一個(gè)用于執(zhí)行java方法亡蓉,一個(gè)用于執(zhí)行本地方法晕翠。
? ??????堆:用于存儲(chǔ)對(duì)象實(shí)例和數(shù)組實(shí)例的。由所有線程共享砍濒。
????????方法區(qū):存儲(chǔ)類信息(類名淋肾、方法信息、字段信息)爸邢、靜態(tài)變量樊卓、常量(運(yùn)行時(shí)常量池)、以及編譯器編譯后的代碼杠河。