在java開發中,jvm負責內存分配,對於開發者而已很省事,但是當你程序存在內存溢出或者內存泄漏時,你就很難定位到具體原因。
1. jvm的組成區域:方法區 ,堆,虛擬機棧,本地方法棧,程序計數器pc
方法區和堆是線程共享的,其餘不是
2.程序計數器pc:是一塊較小的內存空間,用於記錄執行的位置。由於jvm的多線程是通 過線程交替和執行時間決定的,所以在交替的時候,必要pc判斷執行的 位置。每個線程都需要獨立存儲的pc,pc也叫線程私有的內存。是唯一不 會有outOfmemeoryError 的區域。
3.堆:線程共享的區域,是jvm中最大的一塊內存區域,基本的對象實例和數組都在堆上
分配,由於編譯器和逃逸分析技術的發展,所以的對象實例都在堆上分配變的不那
絕對了。
堆是垃圾回收器管理的主要的區域,所以也叫gc堆。在gc堆中可分爲新生代,老年
代。堆的物理區域可以不連續,邏輯上聯繫即可。隨說是共享,但是可以有多劃分
出多個線程私有的緩衝區。
會有outOfMemeoryErro
4.虛擬機棧: 線程私有,主要在程序執行過程中,分配局部變量存儲區,變量存儲區可
可叫局部變量表。局部變量存放編譯期各種數據。
long & double 64位 佔2個局部變量空間,其餘的都1個。
如果程序請求的棧深度深於 jvm允許深度:StackOverFlowErro.
現在的jvm都可以動態擴展,若擴展還不夠:outOfMemoryErro.。
5.本地方法棧:線程私有,本地方法棧跟虛擬機棧功能相似,本地方法棧主要是給native
方法執行分配空間,而虛擬機棧主要是給java語言的程序執行分配空間。
會有StackOverFlowErro 和outOfMeMeoryErro。
6.方法區:線程共享,主要是給類信息,常量,靜態變量分配存儲控制。有的虛擬機把方法區
直接劃分爲堆的邏輯部分,但其他的沒有則叫非堆用於區分。方法區極小不回收,主
要是,對類信息回收的要求比較苛刻。主要的回收目標是常量和類型。有outOfMemeoryErro
注,運行時常量池 是方法區的一部分。