摘要:在之后,原來永久代的數據被分到了堆和元空間中。元空間存儲類的元信息,靜態變量和常量池等放入堆中。這樣能在一些場景中顯著提高性能,因為避免了在堆內存和堆外內存來回拷貝數據。
以下內容部分轉載于: CS-Notes
程序計數器(Program Counter Register)記錄正在執行的虛擬機字節碼指令的地址(如果正在執行的是本地方法則為空)。
ps:什么是本地方法?
本地方法是由其他語言(如C、C++ 或其他匯編語言)編寫,編譯成和處理器相關的代碼。本地方法保存在動態連接庫中,格式是各個平臺專用的,運行中的java程序調用本地方法時,虛擬機裝載包含這個本地方法的動態庫,并調用這個方法。
學過計算機組成的同學將不難理解,通過計數器尋找到下一條指令
每一個線程都必須存在一個程序計數器,因為一個處理器在同一時間只能處理一個線程(對于單核處理器,或者多核處理器的一個內核)
通過程序計數器,來記錄每一個線程所執行到的位置,方便線程直接的切換
Java虛擬機棧(Java Virtual Machine Stacks)虛擬機棧也是每個線程私有的,它的生命周期與線程相同,虛擬機棧描述的是Java方法執行的內存模型
包括:局部變量表,操作數棧,動態鏈接,方法出口等信息
每一個方法的從執行到完成,就代表著一個棧的在虛擬機棧中的入棧和出棧的過程
該區域可能拋出以下異常
StackOverflowError :當線程請求的棧深度超過最大值,如遞歸造成的方法多次調用
OutOfMemoryError :棧進行動態擴展時如果無法申請到足夠內存
本地方法棧(Native Method Stack)本地方法(Native Method): 由其他語言(如C、C++ 或其他匯編語言)編寫,編譯成和處理器相關的代碼。本地方法保存在動態連接庫中,格
式是各個平臺專用的,運行中的java程序調用本地方法時,虛擬機裝載包含這個本地方法的動態庫,并調用這個方法。
具體用法和虛擬機棧類似,只不過它服務的對象為本地方法,在Sun公司的HotSpot虛擬機中,就將把本地方法棧和虛擬機棧合二為一
同樣會出現 StackOverflowError 和 OutOfMemoryError 錯誤
堆(Heap)堆是一塊被Java所有線程共享的一塊內存區域,主要用于存放對象實例和數組
在堆中可以分為
新生代(Young Generation)
老年代(Old Generation)
我們常說的 GC(Garbage Collected Heap) 說的就是整理這一塊的內存區域
堆的內存區域不需要連續,可以動態的增加內存,增加失敗會拋出 OutOfMemoryError 異常。
可以通過 -Xms 和 -Xmx 這兩個虛擬機參數來指定一個程序的堆內存大小,第一個參數設置初始值,第二個參數設置最大值。
java -Xms1M -Xmx2M HackTheJava方法區(Method Area)
方法區和堆一樣,也誰被所有線程共享的內存區域,用于存儲已被虛擬機加載的類,常量,靜態變量,即時編譯器編譯后的代碼等數據
有一個別名 Non-Heap(非堆),在HotSpot虛擬機上人們習慣稱之為 永久代(Permanent Generation)
方法區為JVM的一個規范,定義為存放某些數據,在不同的虛擬機中存在著不同的實現
因為在HotSpot虛擬機上,也存在這方法區的垃圾回收,所以稱為永久代。
在永久代中經常會產生對永久代的回收不完全導致內存泄漏爆出OutOfMemoryError的錯誤
為了更容易管理方法區,在JDK8中,廢棄了永久代,改用元空間代替
把方法區移至到元空間中,元空間存儲于本地內存中,而不是在JVM虛擬機中
方法區是一個 JVM 規范,永久代與元空間都是其一種實現方式。
在 JDK 1.8 之后,原來永久代的數據被分到了堆和元空間中。元空間存儲類的元信息,靜態變量和常量池等放入堆中。
運行時的常量池(Runtime Constant Pool)運行時的常量池是方法區的一部分,用于存放編譯期產生的各種字面量和符號引用
這部分內容將在類加載后進去方法區的運行時常量池存放
除了在編譯期生成的常量,還允許動態生成,例如 String 類的 intern()。
直接內存(Direct Memory)直接內存并不是虛擬機運行時數據區的一部分,也不是Java虛擬機規范中定義的內存區域
但是這個區域的內存被頻繁使用,任然會造成OutOfMemoryError的異常
在 JDK 1.4 中新引入了 NIO 類,它可以使用 Native 函數庫直接分配堆外內存,然后通過 Java 堆里的 DirectByteBuffer 對象作為這塊內存的引用進行操作。
這樣能在一些場景中顯著提高性能,因為避免了在堆內存和堆外內存來回拷貝數據。
PS: 直接內存不受Java堆大小的限制,但是既然是內存肯定還是會受本機總內存的影響
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74584.html
摘要:運行時數據區域的學習,是學習以及機制的基礎,也是深入理解對象創建及運行過程的前提。了解內存區域劃分,是學習概念的前提。 Java 運行時數據區域的學習,是學習 jvm 以及 GC 機制的基礎,也是深入理解 java 對象創建及運行過程的前提。廢話不多說,直接進入正題: 一張圖總結 showImg(https://segmentfault.com/img/bVOMAn?w=685&h=5...
摘要:也正是因此,一旦出現內存泄漏或溢出問題,如果不了解的內存管理原理,那么將會對問題的排查帶來極大的困難。 本文已收錄【修煉內功】躍遷之路 showImg(https://segmentfault.com/img/bVbsP9I?w=1024&h=580); 不論做技術還是做業務,對于Java開發人員來講,理解JVM各種原理的重要性不必再多言 對于C/C++而言,可以輕易地操作任意地址的...
摘要:內存模型和運行時數據區域的關系主內存對應著堆,工作內存對應著棧。在的單例模式中有運用到二運行時數據區域內存區域因為的運行時數據區域一直在改善,所以不同版本之間會有不同。 一、java內存模型 showImg(https://segmentfault.com/img/remote/1460000016694250?w=1810&h=941); java定義內存模型的目的是:為了屏蔽各種...
閱讀 2372·2021-11-24 10:31
閱讀 3427·2021-11-23 09:51
閱讀 2239·2021-11-15 18:11
閱讀 2387·2021-09-02 15:15
閱讀 2452·2019-08-29 17:02
閱讀 2285·2019-08-29 15:04
閱讀 831·2019-08-29 12:27
閱讀 2853·2019-08-28 18:15