jvm組成區域及個區域

   在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


注,運行時常量池 是方法區的一部分。



   

  


  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章