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