Java內存分區(深入理解java虛擬機學習筆記)

程序計數器:  

      1、較小的內存空間

    2、看做當前線程所執行的字節碼的行號指示器,對比彙編語言

    3、線程獨有

4、如果線程正在執行一個java方法,計數器記錄的是正在執行的虛擬機字節碼指令地址

5、如果執行的是native方法,則計數器爲空


Java虛擬機棧

1、線程私有

2、Java方法執行的內存模型,

3、每個方法執行都會創建一個棧幀用於存儲局部變量表,操作數棧,動態鏈接,方法出口等信息

4、局部變量表中存儲了各種基本數據類型

5局部變量表中存儲了對象引用,不同於對象本身,,,注意這一點,請看java編程思想

6 線程請求的棧深度大於虛擬機所允許的深度出現棧溢出錯誤

7、虛擬機棧會動態擴展無法申請到足夠內存會拋出outofmemoryerror異常

8、當進入一個方法,這個方法需要在幀中分配多大的局部變量空間完全確定,方法運行期間不會改變局部變量表的大小


本地方法棧

本地方法棧發揮的作用域虛擬機棧發揮的作用相似,區別在於虛擬機棧爲java方法服務,本地棧爲native方法服務

Java堆

1、java虛擬機所管理的內存中最大的一塊

2、被所有線程共享

3、唯一目的就是存放對象實例(注意是對象實例不是對象引用Important)

4、幾乎所有對象實例以及數組都要在對上分配

5、java堆是垃圾收集器管理的主要區域,也被稱爲GC堆

6、從內存回收的角度java堆被細分爲:新生代和老年代

新生代可以細分爲Eden空間(朝生夕死),From Survivor空間  TO Survivor空間(採用複製清除算法的時候決定了需要這麼劃分堆空間),新生對象出現在Eden空間,之後就“苟延殘喘”,“顛沛流離”

老年代:標記清除算法

7,虛擬機額內存空間都是可擴展的設計成爲,通過-Xmx和-Xms控制


方法區:

1、各個線程共享的內存區域

2、類信息

3、常量

4、靜態變量

5、即時編譯器編譯過後的代碼等數據

6、具有的特點,在整個虛擬機中只存一份的數據,但並不是所有都放到這裏面

7、運行時常量池

    1)方法區的一部分

    2)編譯期生成的各種字面量和符號引用

    3)重要特徵:動態性,可以在編譯期間動態增加常量


直接內存:

    1、不是虛擬機運行時數據區的一部分

2、不是java虛擬機規範中定義的內存矛

3.nio引入通道和緩衝區的io方式,有native函數庫直接分配堆外內存,受到本機內存限制,不收java堆大小的限制。、








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