更新時(shí)間:2020-08-19 11:37:44 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2443次
可能很多初學(xué)java的小伙伴對(duì)Java的堆棧內(nèi)存還不是很了解,為了幫助大家更好的學(xué)習(xí),動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編就來(lái)告訴大家什么是Java的堆棧內(nèi)存。

一、Java中變量在內(nèi)存中的分配
1. 類(lèi)變量(static修飾的變量):在程序加載時(shí)系統(tǒng)就為它在堆中開(kāi)辟了內(nèi)存,堆中的內(nèi)存地址存放于棧以便高速訪(fǎng)問(wèn)。靜態(tài)變量的生命周期—一直持續(xù)到整個(gè)“系統(tǒng)”關(guān)閉
2. 實(shí)例變量:當(dāng)你使用java關(guān)鍵字new的時(shí)候,系統(tǒng)在堆中開(kāi)辟并不一定是連續(xù)的空間分配給變量(比如說(shuō)類(lèi)實(shí)例),然后根據(jù)零散的堆內(nèi)存地址,通過(guò)哈希算法換算為一長(zhǎng)串?dāng)?shù)字以表征這個(gè)變量在堆中的“物理位置”。實(shí)例變量的生命周期–當(dāng)實(shí)例變量的引用丟失后,將被GC(垃圾回收器)列如可回收“名單”中,但并不馬上就釋放堆中內(nèi)存
3. 局部變量:局部變量,由聲明在某方法,或某代碼段里(比如for循環(huán)),執(zhí)行到它的時(shí)候在堆中開(kāi)辟內(nèi)存,當(dāng)局變量一旦脫離作用域,內(nèi)存立即釋放
二、堆內(nèi)存
什么是堆內(nèi)存?
堆內(nèi)存是java內(nèi)存中的一種,它的作用是用于存儲(chǔ)java中的對(duì)象和數(shù)組,當(dāng)我們new一個(gè)對(duì)象或者創(chuàng)建一個(gè)數(shù)組的時(shí)候,就會(huì)在堆內(nèi)存中開(kāi)辟一段空間給它,用于存放。
堆內(nèi)存的特點(diǎn)是什么?
第一點(diǎn):堆其實(shí)可以類(lèi)似的看做是管道,或者說(shuō)是平時(shí)去排隊(duì)買(mǎi)票的情況差不多,所以堆內(nèi)存的特點(diǎn)就是:先進(jìn)先出,后進(jìn)后出,也就是你先排隊(duì)好,你先買(mǎi)票。
第二點(diǎn):堆可以動(dòng)態(tài)地分配內(nèi)存大小,生存期也不必事先告訴編譯器,因?yàn)樗窃谶\(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存的,但缺點(diǎn)是,由于要在運(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存,存取速度較慢。
new對(duì)象在堆中如何分配?
由Java虛擬機(jī)的自動(dòng)垃圾回收器來(lái)管理。
棧內(nèi)存
棧內(nèi)存是Java的另一種內(nèi)存,主要是用來(lái)執(zhí)行程序用的,比如:基本類(lèi)型的變量和對(duì)象的引用變量
棧內(nèi)存的特點(diǎn)
第一點(diǎn):棧內(nèi)存就好像一個(gè)礦泉水瓶,往里面放入東西,那馬先放入的沉入底部,所以它的特點(diǎn)是:先進(jìn)后出,后進(jìn)先出。
第二點(diǎn):存取速度比堆要快,僅次于寄存器,棧數(shù)據(jù)可以共享,但缺點(diǎn)是,存在棧中的數(shù)據(jù)大小與生存必須是確定的,缺乏靈活性。
棧內(nèi)存分配機(jī)制
棧內(nèi)存可以稱(chēng)為一級(jí)緩存,由垃圾回收器自動(dòng)回收
數(shù)據(jù)共享
棧和堆的區(qū)別
JVM是基于堆棧的虛擬機(jī),JVM為新創(chuàng)建的線(xiàn)程都分配一個(gè)堆棧,也就是說(shuō),對(duì)于一個(gè)Java程序來(lái)說(shuō),它的運(yùn)行就是通過(guò)對(duì)堆棧的操作來(lái)完成的。堆棧以幀為單位保存線(xiàn)程的狀態(tài)。JVM對(duì)堆棧只進(jìn)行兩種操作:以幀為單位的壓棧和出棧操作。
差異:
1. 堆內(nèi)存用來(lái)存放由new創(chuàng)建的對(duì)象和數(shù)組
2. 棧內(nèi)存用來(lái)存放方法或者局部變量等
3. 堆是先進(jìn)先出,后進(jìn)后出
4. 棧是先進(jìn)后出,后進(jìn)先出
5. 共享性的不同:
(1)棧內(nèi)存是線(xiàn)程私有的
(2)堆內(nèi)存是所有線(xiàn)程共有的
(3)空間大小
(4)棧的空間大小遠(yuǎn)遠(yuǎn)小于堆的。

以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“Java的堆棧內(nèi)存詳解”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問(wèn),請(qǐng)?jiān)诰€(xiàn)咨詢(xún),有專(zhuān)業(yè)老師隨時(shí)為你服務(wù)。
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話(huà)與您溝通安排學(xué)習(xí)