一文讀懂什麼是JVM內存區域

一、

1、什麼叫做java內存區域

什麼是內存?

在計算機硬件中,內存指的是cpu運算時,用於暫時存放cpu運算過程中的數據的區域,主要負責從固存中提取cpu運算需要的數據並將cpu運算結果如要保存到固定存儲中則保存的一塊斷電後其所含有的數據便會消失的存儲數據硬件。(個人理解)

那什麼叫java內存區域

理解了什麼是內存的話,java內存區域也就理解了,即java程序(這裏指的java程序是什麼意思?肯定是指用java代碼寫的程序,準確的說是用到java虛擬機的程序,即指打包好的程序也只開發時的程序即只要用到java虛擬機就是java程序)在運行時候的cpu計算產生的數據所存放的區域。(個人理解)

2、內存溢出異常

指某一程序或其程序中的容器所包含的內容超過了屬於自己的內存大小造成程序的中斷。

 

二、運行時的數據區域

1、數據區域的概念同java的內存區域

2、數據區域的分類

1、隨Java虛擬機的存在而一直存在

 

2、隨某一程序(用戶線程)的存在而存在

 

3、分區

               

線程獨佔區/

隨某一進程存在而存在

程序計數器

當前線程所執行字節碼的行號指示器

棧:方法執行的線程的

內存模型

JVM棧

1、每個方法執行的時候會JVM創建一個棧幀(stack frame)用於存儲局部變量表、操作數棧、動態連接、方法出口等信息。

2、細說局部變量表

1、編譯期可知的基本數據類型(boolean,byte,char,short,int,float,long,double)和對象引用(對象的地址、對象的句柄、與對象位置相關的信息)

2、存儲單位是:局部變量槽(slot)--4字節一個

除long,double爲兩個slot組成,其餘數據類型均佔一個slot

3、編譯器已知方法的需要在棧幀分配多大(這裏多大指的是slot數量)

3、StackOverflow-->請求的棧深度大於虛擬機所允許的深度

Outofmemoryerror-->棧擴展時無法申請到足夠的內存

本地方法棧

爲本地方法服務

線程共享區域/

隨JVM存在而存在

堆內存/java堆

1、隨虛擬器的啓動而創建

存放對象實例

2、垃圾收集器管理的區域

3、分配內存

4、可存放於物理上不連續的內存空間

可固定大小也可擴展(設置 -Xmx -Xms設定)

方法區

1、存儲被虛擬機加載的類型信息、常量、靜態變量、即時編譯器編譯後代碼緩存

2、JDK8之前有永久代的概念

JDK8之後用元空間替代

3、運行時常量池

1、常量池表:編譯期生成的各種字面量與符號引用

2、具備動態性

常量不一定要在編譯期產生也可在運行期產生

直接內存

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

2、NIO引用一種基於通道與緩衝區的I/O方式,使用Native函數庫直接分配堆外內存,然後通過一個存儲在java堆裏面的DirectByteBuffer對象作爲這塊內存的引用進行操作

發佈了27 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章