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