摘要:虛擬機在執行程序的過程中會把它所管理的內存劃分為若干個不同的數據區域,本篇文章將會對這些數據區域進行簡略的介紹。運行時常量池運行時常量池是方法區的一部分。直接內存直接內存不是虛擬機運行時數據區的一部分,不是虛擬機規范中定義的內存區域。
Java虛擬機在執行Java程序的過程中會把它所管理的內存劃分為若干個不同的數據區域,本篇文章將會對這些數據區域進行簡略的介紹。
JVM所管理的內存包括的數據區域如下圖所示:
根據這張圖我們來一個個介紹這些數據區域。
程序計數器程序計數器(ProgramCounterRegister)是一塊較小的內存空間,它可以看作是當前線程所執行的字節碼的行號指示器。在虛擬機的概念模型里(僅是概念模型,各種虛擬機可能會通過一些更高效的方式去實現),字節碼解釋器工作時就是通過改變這個計數器的值來選取下一條需要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等基礎功能都需要依賴這個計數器來完成。
每條線程都需要一個獨立的程序計數器,各條線程之間計數器互不影響,獨立存儲,我們稱這類內存區域為“線程私有”的內存。
如果線程正在執行的是一個Java方法,這個計數器記錄的是正在執行的虛擬機字節碼指令的地址;如果正在執行的是Native方法,這個計數器值則為空(Undefined)。
此內存區域是唯一一個在Java虛擬機規范中沒有規定任何OOM情況的區域。
虛擬機棧Java虛擬機棧也是線程私有的,生命周期與線程相同。
虛擬機棧描述的是Java方法執行的內存模型:每個方法在執行時都會創建一個棧幀用于存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。每個方法從調用直至執行完成的過程,就對應著一個棧幀在虛擬機中入棧到出棧的過程。
常說的堆和棧中的棧其實指的是Java虛擬機棧或說是虛擬機棧中的局部變量表部分。局部變量表存放了編譯期可知的基本數據類型、對象引用和returnAddress類型(指向了一條字節碼指令的地址)。
Java虛擬機規范中,對這個區域規定了兩種異常情況:
如果線程請求的棧深度大于虛擬機所允許的深度,將拋出StackOverflowError異常;
如果虛擬機棧可以動態擴展,如果擴展時無法申請到足夠的內存,就會拋出OutOfMemoryError異常;
本地方法棧本地方法棧與虛擬機棧作用類似,區別是虛擬機棧為虛擬機執行Java方法服務,本地方法棧為虛擬機使用到的Native方法服務。
與虛擬機棧一樣,本地方法中也會拋出StackOverflowError和OOM異常
Java堆Java堆是被所有線程共享的一塊內存區域,在虛擬機啟動時創建。用來存放對象實例。
從內存回收角度看,由于現在收集齊基本都采用分代收集算法,所以Java堆還可以細分為:新生代和老年代。從內存分配角度看,線程共享的Java堆中額能劃分出多個線程私有的分配緩沖區(TLAB)。
Java堆可以處于物理上不連續的內存空間中,只要邏輯上連續即可。實現時可固定大小也可擴展大小(-Xmx,-Xms)。如果隊中沒有內存完成實例分配,且堆也無法再擴展,會拋出OOM異常。
方法區方法區與Java堆一樣,是各個線程共享的內存區域。
用于存儲已被虛擬機加載的類信息、常量、靜態變量、即使編譯器編譯后的代碼數據,別名Non-Heap。
當方法區無法滿足內存分配需求時,拋出OOM異常。
運行時常量池運行時常量池是方法區的一部分。用于存放編譯期生成的各種字面量和符號引用。
當常量池無法再請到內存時會拋出OOM異常。
直接內存不是虛擬機運行時數據區的一部分,不是Java虛擬機規范中定義的內存區域。但這部分內存也被頻繁使用,也可能導致OOM。本機直接內存的分配不會受到Java堆大小的限制,但還是會受到本機總內存大小以及處理器尋址空間的限制。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/76754.html
摘要:內存模型和運行時數據區域的關系主內存對應著堆,工作內存對應著棧。在的單例模式中有運用到二運行時數據區域內存區域因為的運行時數據區域一直在改善,所以不同版本之間會有不同。 一、java內存模型 showImg(https://segmentfault.com/img/remote/1460000016694250?w=1810&h=941); java定義內存模型的目的是:為了屏蔽各種...
摘要:下面的截圖內容來自從規范我們可以看到,規范要求的運行時數據區域有程序計數器虛擬機棧堆方法區本地方法棧運行時常量池這及部分。查了一下,還是沒有查到官方對于運行時數據區域的說明,但是許多博客都指出將字符串常量池移動到了堆中。 不少java程序員一提JVM運行時數據區域,就會說堆和棧,當然也有java程序員給出方法區、虛擬機棧、本地方法棧、堆、程序計數器這個答案,但是還有人給出永久代、虛擬機...
摘要:方法區在實際內存空間站可以是不連續的。這一規定,可以說是給了虛擬機廠商很大的自由。但是值得注意的是,堆其實還未每一個線程單獨分配了一塊空間,這部分空間在分配時是線程獨享的,在使用時是線程共享的。 在我的博客中,之前有很多文章介紹過JVM內存結構,相信很多看多我文章的朋友對這部分知識都有一定的了解了。 那么,請大家嘗試著回答一下以下問題: 1、JVM管理的內存結構是怎樣的? 2、不同的...
摘要:虛擬機包括一套字節碼指令集一組寄存器一個棧一個垃圾回收堆和一個存儲方法域。而使用虛擬機是實現這一特點的關鍵。虛擬機在執行字節碼時,把字節碼解釋成具體平臺上的機器指令執行。此內存區域是唯一一個在虛擬機規范中沒有規定任何情況的區域。 1、 什么是JVM? JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用于計算設備的規范,它是一個虛構出來的計算機,...
摘要:堆區堆是虛擬機所管理的內存中最大的一塊,它是被所有線程共享的一塊內存區域,該區域在虛擬機啟動的時候創建。 運行時數據區域 ? ?想要了解jvm,那對其內存分配管理的學習是必不可少的;java虛擬機在執行java程序的時候會把它所管理的內存劃分成若干數據區域。這些區域有著不同的功能、用途、創建/銷毀時間。java虛擬機所分配管理的內存區域如圖1所示 程序計數器 ? ?程序計數器是一塊比較...
摘要:對字節碼文件進行解釋執行,把字節碼翻譯成相關平臺上的機器指令。使用命令可對字節碼文件以及配置文件進行打包可對一個由多個字節碼文件和配置文件等資源文件構成的項目進行打包。和不存在永久代這種說法。 Java技術體系 從廣義上講,Clojure、JRuby、Groovy等運行于Java虛擬機上的語言及其相關的程序都屬于Java技術體系中的一員。如果僅從傳統意義上來看,Sun官方所定義的Jav...
閱讀 1672·2021-11-12 10:35
閱讀 1618·2021-08-03 14:02
閱讀 2688·2019-08-30 15:55
閱讀 2028·2019-08-30 15:54
閱讀 762·2019-08-30 14:01
閱讀 2430·2019-08-29 17:07
閱讀 2254·2019-08-26 18:37
閱讀 3034·2019-08-26 16:51