谈一谈Java编程开发中虚拟机的内存区域划分?猿们怎么看?
java虛擬機(jī)在執(zhí)行Java程序的過程中會(huì)把它所管理的內(nèi)存劃分為若干個(gè)不同的數(shù)據(jù)區(qū)域,有的區(qū)域隨虛擬機(jī)進(jìn)程的啟動(dòng)而存在,有的區(qū)域則依賴線程而存在。包括以下幾個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū)域:
程序計(jì)數(shù)器(線程私有):
可以看作是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器,通過程序計(jì)數(shù)器知道當(dāng)前線程接下來要執(zhí)行什么指令,比如分支、循環(huán)、跳轉(zhuǎn)、異常處理等等;程序計(jì)數(shù)器的作用是給線程用的,所以它是線程私有的。該內(nèi)存區(qū)域是唯一一個(gè)不會(huì)拋OutOfMemoryError異常的區(qū)域。
java虛擬機(jī)棧(線程私有):
用來存儲(chǔ)局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口等信息。每一個(gè)方法從調(diào)用到執(zhí)行完成的過程,對(duì)應(yīng)一個(gè)棧幀在虛擬機(jī)棧中入棧到出棧的過程。局部變量表主要用來存放各種基礎(chǔ)數(shù)據(jù)類型(boolean/byte/char/int/long/double/void/short/float)、java對(duì)象引用(注意不是對(duì)象本身,對(duì)象是存儲(chǔ)在堆中的),其中,64位長(zhǎng)度的long和double,占用2個(gè)局部變量空間(Slot),其它數(shù)據(jù)類型只占用1個(gè)。虛擬機(jī)棧是線程私有的,生命周期和線程相同。在這個(gè)區(qū)域中,如果線程請(qǐng)求的棧深度大于虛擬機(jī)允許的深度,將拋出StackOverflowError異常;如果虛擬機(jī)棧可以動(dòng)態(tài)擴(kuò)展,拓展時(shí)無(wú)法申請(qǐng)到足夠的內(nèi)存,就會(huì)拋出OutOfMemoryError異常。
本地方法棧(線程私有):
和虛擬機(jī)棧相似,本地方法棧服務(wù)于native方法。
堆(線程共享):
是線程共享的一塊區(qū)域,幾乎所有的對(duì)象和數(shù)組都是存儲(chǔ)在堆,也是垃圾回收器管理的主要區(qū)域,也稱為“GC堆”。如果堆中內(nèi)存不足以完成對(duì)象內(nèi)存分配,就會(huì)拋出OutOfMemoryError異常。
方法區(qū)(線程共享):
是線程共享的一塊區(qū)域,用來存放類信息、常量、靜態(tài)變量、編譯后的代碼等。
運(yùn)行時(shí)常量池(線程共享):
屬于方法區(qū)的一部分,具備動(dòng)態(tài)性,可在運(yùn)行期間動(dòng)態(tài)放入常量池,如String類的intern()方法。
直接內(nèi)存:
直接內(nèi)存不屬于虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)的一部分,也不是java虛擬機(jī)規(guī)范中定義的內(nèi)存區(qū)域。NIO類通過Native函數(shù)直接分配堆外內(nèi)存,提高性能。不受java堆大小限制,但是受本機(jī)內(nèi)存限制。
為了讓學(xué)習(xí)變得輕松、高效,今天給大家免費(fèi)分享一套Java入門教學(xué)資源。幫助大家在成為Java架構(gòu)師的道路上披荊斬棘。需要入門的資料歡迎加入學(xué)習(xí)交流群:9285,05736
總結(jié)
以上是生活随笔為你收集整理的谈一谈Java编程开发中虚拟机的内存区域划分?猿们怎么看?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java的一些学习心得
- 下一篇: Java有快速打好基础的方法?