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