java中棧和堆的區(qū)別 jvm堆和棧的區(qū)別?
jvm堆和棧的區(qū)別?1. 堆棧:每當(dāng)啟動(dòng)一個(gè)新線程時(shí),Java虛擬機(jī)都會為它分配一個(gè)Java堆棧。JVM將只在Java堆棧上執(zhí)行兩個(gè)操作:堆棧按下或以堆棧幀為單位退出堆棧。每個(gè)線程都包含一個(gè)堆棧區(qū)域,
jvm堆和棧的區(qū)別?
1. 堆棧:每當(dāng)啟動(dòng)一個(gè)新線程時(shí),Java虛擬機(jī)都會為它分配一個(gè)Java堆棧。JVM將只在Java堆棧上執(zhí)行兩個(gè)操作:堆棧按下或以堆棧幀為單位退出堆棧。每個(gè)線程都包含一個(gè)堆棧區(qū)域,其中只存儲基本數(shù)據(jù)類型的對象和自定義對象(而不是對象)的引用,對象存儲在堆棧區(qū)域中。
2. 堆:存儲所有對象,每個(gè)對象都包含相應(yīng)的類信息——類的目的是獲取操作指令。JVM中的所有線程只共享一個(gè)堆。堆不存儲基本類型和對象引用,只存儲對象本身。
堆棧區(qū)別?
堆棧:它是一種“先進(jìn),后出”的數(shù)據(jù)結(jié)構(gòu)。它通常用于在方法(函數(shù))中保存參數(shù)和局部變量。在Java中,所有基本類型和引用類型都存儲在堆棧中。堆棧中數(shù)據(jù)的生存空間通常在當(dāng)前范圍內(nèi)(即{…}包圍的區(qū)域)
Heap:它是可以動(dòng)態(tài)應(yīng)用的內(nèi)存空間(可用內(nèi)存空間的鏈表由操作系統(tǒng)維護(hù))。C中malloc語句生成的內(nèi)存空間在堆中。
在Java中,new用于所有應(yīng)用程序,XXX()構(gòu)造的對象存儲在堆中。當(dāng)垃圾收集器檢測到某個(gè)對象未被引用時(shí),它將自動(dòng)銷毀該對象。因此,從理論上講,Java中對象的生存空間是沒有限制的。只要有一個(gè)引用類型指向它,它就可以在任何地方使用
舉個(gè)簡單的例子。每次調(diào)用方法時(shí),都會在堆棧中創(chuàng)建一個(gè)堆棧幀,以保存方法中的局部變量,例如主方法中的測試變量。但是,新方法將在堆中創(chuàng)建對象,然后將堆地址保存在測試變量中。在test1方法中,B變量直接存儲在堆棧幀中,因?yàn)樗腔绢愋汀U{(diào)用test1方法時(shí),堆棧幀會自動(dòng)彈出,堆棧中的變量也會被回收,B和test變量也會被回收,但堆中的對象需要在垃圾回收期間被回收。當(dāng)JVM檢測到根對象沒有引用測試對象時(shí),它將執(zhí)行垃圾收集。