摘要:運(yùn)行時(shí)數(shù)據(jù)區(qū)域名詞解釋程序計(jì)數(shù)器線程私有,存儲(chǔ)每個(gè)線程的指令,不存儲(chǔ)方法內(nèi)容。方法報(bào)錯(cuò)的時(shí)候異常棧能告訴在代碼的哪一行,就是程序計(jì)數(shù)器的功能。棧幀保存對(duì)堆內(nèi)對(duì)象的引用。堆線程共享,存儲(chǔ)對(duì)象實(shí)例,就是回收這一部分。
JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)域
名詞解釋
程序計(jì)數(shù)器(Program Counter Register):線程私有,存儲(chǔ)每個(gè)線程的JVM指令,不存儲(chǔ)native方法內(nèi)容。方法報(bào)錯(cuò)的時(shí)候異常棧能告訴在代碼的哪一行,就是程序計(jì)數(shù)器的功能。
虛擬機(jī)棧(VM Stack):每個(gè)線程私有,存儲(chǔ)方法調(diào)用棧和線程局部基本類(lèi)型變量。棧幀保存對(duì)堆內(nèi)對(duì)象的引用。
堆(Heap):線程共享,存儲(chǔ)對(duì)象實(shí)例,GC就是回收這一部分。由于堆區(qū)域線程共享,對(duì)象在堆中分配需要加鎖,這個(gè)操作增大開(kāi)銷(xiāo),所以會(huì)先做逃逸分析,將線程本地小對(duì)象嘗試在TLAB(Thread Local Allocation Buffer)中分配,如果不能才去堆中的Eden分配。TLAB默認(rèn)是Eden的1%,大對(duì)象在TLAB放不下,就在Eden分配了,所以多個(gè)小對(duì)象可能比一個(gè)大對(duì)象分配要快。
運(yùn)行時(shí)常量池(Runtime Constant Pool):在方法區(qū)中分配,類(lèi)的常量信息,方法引用信息,字符串常量等。
堆內(nèi)結(jié)構(gòu)簡(jiǎn)單地說(shuō),新對(duì)象出生在Eden,如果Eden不夠了,觸發(fā)gc(Minor GC)把存活的對(duì)象搬到s0,下次gc又搬到s1,再下次又搬到s0,如此往復(fù),一個(gè)對(duì)象被搬到一定次數(shù)就是幾歲,達(dá)到這個(gè)閾值就進(jìn)入老年代。(默認(rèn)15歲,就是一個(gè)狗狗的壽命)老年代滿(mǎn)了也會(huì)gc(Major GC/Full GC)
GC算法Mark-Sweep 標(biāo)記清除算法
顧名思義,兩個(gè)階段,先標(biāo)記不被引用的對(duì)象,再清除掉,騰出內(nèi)存。就像把圍棋里被吃掉的棋子提出來(lái)。
缺點(diǎn):空間碎片多
Copying 復(fù)制算法
把空間等分兩塊,一塊滿(mǎn)了將所有活著的對(duì)象復(fù)制到另一個(gè)塊空間,再一次清理掉之前的空間。
優(yōu)點(diǎn):解決了碎片問(wèn)題
缺點(diǎn):可用內(nèi)存變低了
Mark-Compact 標(biāo)記整理算法
標(biāo)記之后,把存活的對(duì)象都移動(dòng)到內(nèi)存一端,把端邊界以外的內(nèi)存空間清理掉。
沒(méi)有碎片,也能充分利用內(nèi)存空間。老年代通常使用這種算法。
引用計(jì)數(shù)為空的對(duì)象:每個(gè)對(duì)象有引用計(jì)數(shù)器,有引用就+1,引用失效就-1,為0則不可能再被使用。
GC root引用鏈搜索不到的對(duì)象:以GC root的對(duì)象為起點(diǎn),沿它的引用搜索,引用鏈中搜索不到的對(duì)象也不會(huì)被使用。
參考文章:
https://www.cnblogs.com/zhouy...
https://www.cnblogs.com/wjtai...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/75149.html
摘要:執(zhí)行引擎作用執(zhí)行字節(jié)碼,或者執(zhí)行本地方法運(yùn)行時(shí)數(shù)據(jù)區(qū)其實(shí)就是指在運(yùn)行期間,其對(duì)內(nèi)存空間的劃分和分配。 雖是讀書(shū)筆記,但是如轉(zhuǎn)載請(qǐng)注明出處https://uestc-dpz.github.io..拒絕伸手復(fù)制黨 JVM Java 虛擬機(jī) Java 虛擬機(jī)(Java virtual machine,JVM)是運(yùn)行 Java 程序必不可少的機(jī)制。JVM實(shí)現(xiàn)了Java語(yǔ)言最重要的特征:即平臺(tái)...
摘要:原文鏈接這是專(zhuān)家系列文章的第二篇。運(yùn)行在本地虛擬機(jī)上的應(yīng)用的又稱(chēng)為,通常與相同。性能數(shù)據(jù)需要持續(xù)觀察,因此在運(yùn)行時(shí)需要定時(shí)輸出的監(jiān)控信息。新生代容量的統(tǒng)計(jì)信息。是提供的一個(gè)式的圖表監(jiān)控工具。 原文鏈接:http://www.cubrid.org/blog/dev-platform/how-to-monitor-java-garbage-collection/ 這是GC專(zhuān)家系列文章的第二...
摘要:這個(gè)算法看似不錯(cuò)而且簡(jiǎn)單,不過(guò)存在這一個(gè)致命傷當(dāng)兩個(gè)對(duì)象互相引用的時(shí)候,就永遠(yuǎn)不會(huì)被回收于是引用計(jì)數(shù)算法就永遠(yuǎn)回收不了這兩個(gè)對(duì)象,下面介紹另一種算法。 前言 ? 如果要問(wèn)Java與其他編程語(yǔ)言最大的不同是什么,我第一個(gè)想到的一定就是Java所運(yùn)行的JVM所自帶的自動(dòng)垃圾回收機(jī)制,以下是我學(xué)習(xí)JVM垃圾回收機(jī)制整理的筆記,希望能對(duì)讀者有一些幫助。 哪些內(nèi)存需要回收?what? ? ...
摘要:而使用虛擬機(jī)是實(shí)現(xiàn)這一特點(diǎn)的關(guān)鍵。每個(gè)字節(jié)碼指令都由一個(gè)字節(jié)的操作碼和附加的操作數(shù)組成。字節(jié)碼可以通過(guò)以下兩種方式轉(zhuǎn)換成合適的語(yǔ)言解釋器一條一條地讀取,解釋并執(zhí)行字節(jié)碼執(zhí)行,所以它可以很快地解釋字節(jié)碼,但是執(zhí)行起來(lái)會(huì)比較慢。 一、什么是JVM JVM是Java Virtual Machine(Java 虛擬機(jī))的縮寫(xiě),JVM是一種用于計(jì)算設(shè)備的規(guī)范,它是一個(gè)虛構(gòu)出來(lái)的計(jì)算機(jī),是通過(guò)在實(shí)...
摘要:在這種消耗很高的狀態(tài)下,應(yīng)用程序所有的線程都會(huì)掛起,暫停一切正常的工作,等待垃圾回收的完成。但是,因?yàn)榫€程切換和上下文轉(zhuǎn)換的消耗,會(huì)使得垃圾回收的總體成本上升,造成系統(tǒng)吞吐量的下降。 Java 垃圾回收(GC) 泛讀 文章地址: https://segmentfault.com/a/1190000008922319 0. 序言 帶著問(wèn)題去看待 垃圾回收(GC) 會(huì)比較好,一般來(lái)說(shuō)主要的...
閱讀 2444·2021-10-09 09:44
閱讀 3817·2021-09-22 15:43
閱讀 2934·2021-09-02 09:47
閱讀 2556·2021-08-12 13:29
閱讀 3879·2019-08-30 15:43
閱讀 1689·2019-08-30 13:06
閱讀 2195·2019-08-29 16:07
閱讀 2756·2019-08-29 15:23