全局變量存放在堆還是棧 jvm堆和棧的區(qū)別?
jvm堆和棧的區(qū)別?1. 棧:每當(dāng)啟動(dòng)一個(gè)新線程的時(shí)候,java虛擬機(jī)都會(huì)為它分配一個(gè)java棧。JVM只會(huì)對(duì)java棧執(zhí)行兩種操作:以棧幀為單位的壓棧或者出棧。每個(gè)線程包含一個(gè)棧區(qū),棧中只保存基礎(chǔ)數(shù)
jvm堆和棧的區(qū)別?
1. 棧:每當(dāng)啟動(dòng)一個(gè)新線程的時(shí)候,java虛擬機(jī)都會(huì)為它分配一個(gè)java棧。JVM只會(huì)對(duì)java棧執(zhí)行兩種操作:以棧幀為單位的壓棧或者出棧。每個(gè)線程包含一個(gè)棧區(qū),棧中只保存基礎(chǔ)數(shù)據(jù)類型的對(duì)象和自定義對(duì)象的引用(不是對(duì)象),對(duì)象都存放在堆區(qū)中 。
2. 堆:存儲(chǔ)的全部是對(duì)象,每個(gè)對(duì)象包含一個(gè)與之對(duì)應(yīng)的class信息–class的目的是得到操作指令。jvm只有一個(gè)堆區(qū)(heap)被所有線程共享,堆區(qū)中不存放基本類型和對(duì)象引用,只存放對(duì)象本身。
java中的堆和棧有什么區(qū)別?要詳細(xì)點(diǎn)的?
以簡(jiǎn)單的例子舉例,每次調(diào)用方法都會(huì)在棧中創(chuàng)建一個(gè)棧楨來(lái)保存方法中的局部變量,比如說(shuō)main方法中的test變量,但是new方法是會(huì)在堆中創(chuàng)建對(duì)象的,然后把堆地址保存在test變量里面。test1方法中b變量時(shí)直接存放在棧楨中的,因?yàn)槭腔绢愋汀.?dāng)test1方法調(diào)用完畢,棧楨自動(dòng)會(huì)彈出,棧中的變量同樣會(huì)被回收,b、test變量都會(huì)被回收,但是堆中的對(duì)象時(shí)需要垃圾回收期進(jìn)行回收的。JVM會(huì)檢測(cè)到Test對(duì)象沒(méi)有被根對(duì)象引用的時(shí)候,就會(huì)進(jìn)行垃圾回收。
在Java里堆內(nèi)存和棧內(nèi)存有什么區(qū)別?
這個(gè)來(lái)自于古老的C語(yǔ)言概念,凡是在函數(shù)中用基本數(shù)據(jù)類型(string除外)申請(qǐng)的局部變量,也就是函數(shù)退出則這些變量就消亡的變量,包括函數(shù)自己的參數(shù)定義,都用棧內(nèi)存的方式構(gòu)造內(nèi)存,這樣做的目的是進(jìn)入該函數(shù)、變量值進(jìn)棧,函數(shù)退出自動(dòng)退棧,這樣就自動(dòng)完成了內(nèi)存申請(qǐng)和回收,這些??臻g的變量只能被該函數(shù)自己引用,其他函數(shù)不能引用。
而C語(yǔ)言的全局變量、JAVA的對(duì)象,也就是說(shuō)如C語(yǔ)言用malloc()函數(shù),C 、JAVA等用new構(gòu)造的對(duì)象,都在堆方式組織的內(nèi)存中,這樣的目的是讓很多函數(shù)都能引用到這些存儲(chǔ)空間的值或者對(duì)象。存儲(chǔ)在堆空間的對(duì)象和數(shù)據(jù),需要編程者按需要釋放,如C語(yǔ)言用free(),C 則要析構(gòu)函數(shù),Java就有自動(dòng)回收機(jī)制。
隨手寫(xiě)的,有錯(cuò)勿噴。
如何準(zhǔn)確理解Java中的堆與棧?
謝邀!
Java運(yùn)行時(shí)數(shù)據(jù)區(qū)中的棧有Java虛擬機(jī)棧和本地方法棧,都是用于方法的執(zhí)行;堆用于存放對(duì)象實(shí)例和數(shù)組。
Java虛擬機(jī)棧
每個(gè)Java方法執(zhí)行的時(shí)候都會(huì)創(chuàng)建一個(gè)棧幀,棧幀用于存儲(chǔ)局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈表和方法出口等信息,每個(gè)Java方法從開(kāi)始調(diào)用到執(zhí)行完成的過(guò)程,都對(duì)應(yīng)著一個(gè)棧幀在Java虛擬機(jī)棧中入棧到出棧的過(guò)程。在Java虛擬機(jī)規(guī)范中規(guī)定,如果線程請(qǐng)求的深度大于虛擬機(jī)所允許的深度,將拋出StackOverflowError異常;如果虛擬機(jī)可以動(dòng)態(tài)擴(kuò)展,但是在擴(kuò)展時(shí)申請(qǐng)不到足夠的內(nèi)存,將會(huì)拋出OutOfMemoryError異常。Java虛擬機(jī)棧的生存周期是跟隨線程的,是線程私有的。
本地方法棧
Java虛擬機(jī)棧是為執(zhí)行Java方法服務(wù)的,而本地方法棧是為執(zhí)行本地方法服務(wù)的,它的作用與Java虛擬機(jī)棧相似,同樣它也會(huì)拋出StackOverflowError異常和OutOfMemoryError異常。本地方法棧的生存周期也是跟隨線程的,也是線程私有的。
堆
堆是Java虛擬機(jī)中內(nèi)存空間最大的一塊,基本上所有的對(duì)象實(shí)例及數(shù)組都在這里分配內(nèi)存空間,它是所有線程共享的區(qū)域。在Java虛擬機(jī)規(guī)范中,堆可以處于物理上不連續(xù)的內(nèi)存空間,只要邏輯上連續(xù)就行。當(dāng)堆中沒(méi)有足夠內(nèi)存分配時(shí),并且此時(shí)也無(wú)法再擴(kuò)展,將會(huì)拋出OutOfMemoryError異常。
Java中的字符串常量池與Java中的堆和棧的區(qū)別?
java常量池不在堆中也不在棧中,是獨(dú)立的內(nèi)存空間管理。
1. 棧:存放基本類型的變量數(shù)據(jù)和對(duì)象的引用,但對(duì)象本身不存放在棧中,而是存放在堆(new 出來(lái)的對(duì)象)或者常量池中(字符串常量對(duì)象存放在常量池中。)
2. 堆:存放所有new出來(lái)的對(duì)象。
3. 常量池:存放字符串常量和基本類型常量(public static final)。
對(duì)于字符串:其對(duì)象的引用都是存儲(chǔ)在棧中的,如果是編譯期已經(jīng)創(chuàng)建好(直接用雙引號(hào)定義的)的就存儲(chǔ)在常量池中,如果是運(yùn)行期(new出來(lái)的)才能確定的就存儲(chǔ)在堆中。對(duì)于equals相等的字符串,在常量池中永遠(yuǎn)只有一份,在堆中有多份。