jvm內存結構_淺談JVM內存結構

JVM 可以分為 5 個部分,分別是:

類加載器(Class Loader):加載字節碼文件到內存。

運行時數據區(Runtime Data Area):JVM 核心內存空間結構模型。

執行引擎(Execution Engine):對 JVM 指令進行解析,翻譯成機器碼,解析完成后提交到操作系統中。

本地庫接口(Native Interface):供 Java 調用的融合了不同開發語言的原生庫。

本地方法庫(Native Libraies):Java 本地方法的具體實現。

JVM 的結構如下圖所示:

f333f8b9833a65eaa22ce2ae5e1d3659.png

這其中最復雜的是運行時數據區,它也是 JVM 內存結構最重要的部分。運行時數據區又可以分為方法區、虛擬機棧、本地方法棧、堆以及程序計數器,并且方法區和堆是線程共享的,虛擬機棧、本地方法棧、程序計數器是線程隔離的。下面詳細講解運行時數據區的各個組成部分。

1.線程共享

方法區:方法區與 Java 堆一樣,是各個線程共享的內存區域,它用于存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據。雖然 Java 虛擬機規范把方法區描述為堆的一個邏輯部分,但是它卻有一個別名叫做 Non-Heap(非堆),目的應該是與 Java 堆區分開來。

:該區域是所有線程共享的,存放幾乎所有的對象實例。jvm管理的內存中最大的一塊,也是GC收集器主要管理的區域。按回收內存的角度可以分為新生代,老年代和永久代;再細分的話有Eden空間,From survior,To survior空間;不管如何劃分都是為了更好的回收內存,存儲的也是對象實例。

新生代:新生代又可分為 Eden,from Survivor,to Survivor。Eden 區用來存放剛剛創建的對象,如果 Eden 區放不下,則放在 Survivor 區,甚至老年代中。Survivor 區又可分為 Survivor From 和 Survivor To,GC 回收時使用,將 Eden 中存活的對象存入 Survior From 中,下一次回收時,將 Survior From 中的對象存入 Survior To 中,清除 Survior From ,下一次回收時重復此步驟,Survior From 變成 Survior To,Survivor To 變成 Survivor From,依次循環,同時每次回收,對象的年齡都 +1,年齡增加到一定程度的對象,移動到老年代中。

老年代:存放年齡大的對象

永久代:jdk7之前就是用永久代來實現方法區,本質上來講兩者并不等價,僅因為Hotspot將GC分代擴展至方法區,所以將其稱為永久代。在物理內存上是和堆是連續的但邏輯上是隔離的;jdk8后移除了永久代,用元空間代替。使用的是本地內存,這樣減少了內存溢出的問題。

4ab6580bdb5afd1d57477180aea37686.png

2.線程私有

本地方法棧:棧中方法都是用native修飾的,這些方法在Java中只有定義沒有具體實現。

  • 由javah命令從.class文件轉換成.h文件(頭文件,里面包含函數原型和宏定義)
  • 用.cpp文件實現 .h 文件中的方法
  • 將 .cpp 文件編譯成動態鏈接庫文件 .dll
  • 使用 System.loadLibrary() 加載動態連接庫文件

調用native方法的基本原理是利用反射機制,在運行時找到 .dll 文件并且解析,根據動態鏈接庫中的文件名稱創建出對象和方法,然后就可以利用對象調用方法了。

虛擬機棧:實際上,Java 虛擬機棧是由一個個棧幀組成,而每個棧幀中都擁有:局部變量表、操作數棧、動態鏈接、方法出口信息。

局部變量表主要存放了編譯器可知的各種數據類型(boolean、byte、char、short、int、float、long、double)、對象引用(reference 類型,它不同于對象本身,可能是一個指向對象起始地址的引用指針,也可能是指向一個代表對象的句柄或其他與此對象相關的位置)。

Java 虛擬機棧會出現兩種錯誤:StackOverFlowError 和 OutOfMemoryError。

  • StackOverFlowError: 若 Java 虛擬機棧的內存大小不允許動態擴展,那么當線程請求棧的深度超過當前 Java 虛擬機棧的最大深度的時候,就拋出 StackOverFlowError 錯誤。
  • OutOfMemoryError: 若 Java 虛擬機棧的內存大小允許動態擴展,且當線程請求棧時內存用完了,無法再動態擴展了,此時拋出 OutOfMemoryError 錯誤。

程序計數器:它是一塊較小的空間,可以看做當前線程執行字節碼的行號指示器。字節碼解釋器通過改變計數器的值來選取下一條需要執行的字節碼指令。 另外,為了線程切換后能恢復到正確的執行位置,每條線程都需要有一個獨立的程序計數器,各線程之間計數器互不影響,獨立存儲,我們稱這類內存區域為“線程私有”的內存。它也是jvm內存里唯一一個不會出現OOM的區域。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/271188.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/271188.shtml
英文地址,請注明出處:http://en.pswp.cn/news/271188.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java annotation應用_java Annotation的應用

一、Annotation 示例Override Annotation1 Override2 public void onCreate(Bundle savedInstanceState);二、Annotation 概念及作用1 概念An annotation is a form of metadata, that can be added to Java source code. Classes, methods, variables, parameters and package…

鴻蒙和安卓,到底有什么區別?

對于開發者來說兩個最關鍵的點值得關注:一個是 Beta 版的開發工具,一個是開源網站。開源網站在開發者大會上宣布將 HarmonyOS源代碼捐贈給中國開放原子開源基金會,并在大會上公布了鴻蒙系統的開源路線。OpenHarmony 官方源碼地址:…

錯題集03

(選擇一項) 3A: B: C: D: 正確答案是 B解析:LinkedList是實現List,Collection接口,是鏈表方式進行構建的,根據開發要求不同,可以使用LinkedList實現棧(先進先出)和堆(先進后出)這樣的數據結構。(選擇一項) 4A: B: C: D: 正確答案是 C解析:由于Hashtable是線程…

從零開始學python人工智能課程_從零開始如何學習人工智能?

想要學習人工智能?這里有一條完整路徑資源在本文中,《Analytics India》雜志給出了學習AI的最佳途徑。...科技領域的天平正在向人工智能傾斜,IT領域的技術人員正在將AI應用到現有產品中。但是對于企業來說, AI人才才是關鍵。企業培…

項目管理基礎:軟件開發的方法介紹

軟件開發方法主要有結構化方法、原型化方法、面向對象開發方法、敏捷方法。1、結構化方法結構化方法由結構化分析、結構化設計、結構化程序設計組成,它是一種面向數據流的開發方法。結構化分析:依據分解與抽象的原則,按照系統中數據處理的流程…

類加載器子系統的作用

類加載器子系統的作用

Magento Block設計分析(深入分析)

Magento中Block是一個很重要的組件,它在Block中充當非常重要的角色,下面我們來分析一下Magento中Block是怎樣設計的,我們應該怎樣使用這個重要的角色。1、Magento Block類圖: 圖1: 繼承Varien_Object的對象都有一個_data類變量,用…

JAVA輸出x和y和z_JAVA實例:輸入三個整數x,y,z,請把這三個數由小到大輸出-吾愛編程網...

今天為大家分享一個java經典實例輸入三個整數x,y,z,請把這三個數由小到大輸出,相信很多初學者都會學到這道題目,接下來吾愛編程為大家介紹一下程序的相關寫法,有需要的小伙伴可以參考一下:1、題目:輸入三個整數x,y,z,請…

軟件項目管理相關概念介紹筆記

1、成本估算由于軟件項目具有可見性差、難定量化的特點,一般情況下很難在項目完成前準確的評估軟件項目開發的工作量和費用。通常會根據以往開發類似項目的經驗來進行成本估算。也可以將整個項目劃分為若干個子系統或按照軟件的生命周期的各個階段分別進行費用估算&…

python爬取微博熱搜_Python 超簡單爬取微博熱搜榜數據

微博的熱搜榜對于研究大眾的流量有非常大的價值。今天的教程就來說說如何爬取微博的熱搜榜。 熱搜榜的鏈接是:用瀏覽器瀏覽,發現在不登錄的情況下也可以正常查看,那就簡單多了。使用開發者工具(F12)查看頁面邏輯,并拿到每條熱搜的…

LeetCode14 Longest Common Prefix

題意: Write a function to find the longest common prefix string amongst an array of strings. (Easy) 這兩天實驗室項目太忙了, 老板各種活,只能挑著先水幾道easy題,這兩個題是昨天做的沒來得及寫總結。 分析: 暴…

類加載器ClassLoader的角色

類加載器ClassLoader的角色

軟件項目管理:進度管理相關概念介紹

軟件項目管理當中,項目進度的合理安排是如期完成軟件項目的重要基礎,也是合理分配資源的重要依據。項目進度安排是項目管理工作當中非常重要的組成部分。軟件開發項目進度安排的方式:1、系統最終交付日期已經確定,軟件開發部門必須…

ios開發 多人語音聊天_手游語音市場的現狀、機遇與挑戰

文/手游那點事小魚原創2014年持續火熱的手游市場成就了一大批企業的上市夢,同時也在大環境下產生了對系列手游增值服務的需求。基于玩家對手游社交性的需求,以及借鑒傳統端游,頁游中成功的社交體系,手游市場逐步出現了對手游語音的…

linux 下運行 tomcat

一開始找不到表名,原來mysql 表名區分大小寫。 修改參數 lower_case_table_names1 成功運行后不能通過瀏覽器訪問! 開啟8080端口 一、關閉防火墻 firewall-cmd --state 查看狀態 [rootVM_7_88_centos /]# firewall-cmd --state running [rootVM_7_88…

軟件項目管理:軟件工具與開發環境相關知識介紹

1、軟件工具相關名詞概念軟件工具:用來輔助軟件開發、運行、維護、管理等過程中的活動軟件。軟件開發環境:是指支持軟件產品開發的軟件系統,它由軟件工具集和環境集成機制構成。軟件工具集:包括支持軟件開發相關過程、活動、任務的…

apollo java客戶端_攜程配置中心Apollo的Java客戶端API的使用

一、SpringBoot集成1.發布配置信息設置本機為DEV環境:Linux在/opt/settings/server.properties增加配置envDEV,windows在c:\opt\settings\server.properties圖1 在apollo portal上新建項目后,默認就有了application命名空間。在DEV環境下新建…

JNI----Native本地方法接口

Native本地方法接口 JNI:Java Native Interface 本地接口的作用是融合不同的編程語言為Java所用,它的初衷是融合C/C程序 native:凡是帶native關鍵字的,說明java的作用范圍達不到了,會去調用底層c語言的庫&#xff01…

python的flag是什么意思_網上老說的flag是什么意思

近些年,國內的網絡發展速度還是很快的,大家可以通過網絡了解很多的東西,因此網絡上也有很多熱詞開始流行起來,其中flag算是十分流行的一個詞匯,網上老說的flag是什么意思?立個flag是什么梗?可能還有一些朋友并不是很…

項目管理基礎:系統分析相關概念介紹

1、系統分析的主要任務系統分析主要任務是對現行的系統進一步詳細調查,將調查得到的資料集中,對組織內部整體管理狀況和信息處理過程進行分析,為系統開發提供所需要的資料,并提交系統方案說明書。2、系統分析的主要階段系統分析主…