Java当中jvm运行时区域新生代、老年代、永久代和Garbage Collection垃圾回收机制【杭州多测师】【杭州多测师_王sir】...
?1、本地方法棧和程序計(jì)數(shù)器 ==》偏底層一般不會(huì)接觸到
2、方法區(qū) ==》對(duì)應(yīng)為永久代
3、虛擬機(jī)棧(stack) ==》對(duì)應(yīng)為棧
4、堆(heap) ==》對(duì)應(yīng)里面有新生代+老年代
stack(棧內(nèi)存?)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? heap(堆內(nèi)存)? ? ? ? ? ? ? ? 永久代
5、棧內(nèi)存
1)線程私有
2)生命周期和線程相同
3)主要存放內(nèi)容
4)基本數(shù)據(jù)類型(int,char,float,double…)
5)對(duì)象的引用,指向了對(duì)象在堆內(nèi)存中起始地址 ==》Object object = new Object(); ==》object就是對(duì)象的引用
6)通過(guò)-Xss參數(shù)配置? ==》假設(shè)只給棧內(nèi)存分配了100MB、一個(gè)線程假設(shè)只分配1MB那么最多只能啟動(dòng)100個(gè)線程、棧內(nèi)存一般比堆內(nèi)存要小的多 ==》一般分配為1024KB
6、堆內(nèi)存示意圖
堆內(nèi)存示意圖的解釋:【超級(jí)重點(diǎn)】1)首先一個(gè)對(duì)象被創(chuàng)建的時(shí)候先進(jìn)入到新生代里面新生代首先會(huì)進(jìn)入到Eden區(qū)域(伊甸園)里面,Eden里面存了很多的對(duì)象,那么創(chuàng)建object對(duì)象的時(shí)候可能會(huì)創(chuàng)建成千上萬(wàn)次、那么隨著創(chuàng)建的次數(shù)越多Eden區(qū)會(huì)滿、那么滿了怎么辦呢??2)這個(gè)時(shí)候新生代會(huì)做一次掃描,掃描Eden區(qū)和S1,把里面有用的對(duì)象進(jìn)行標(biāo)記,然后把Eden和S1里面有用的對(duì)象全部復(fù)制放進(jìn)S0里面,那么沒(méi)用的對(duì)象就會(huì)被全部清空,S0接著運(yùn)行,過(guò)一段時(shí)間Eden又滿了,那么新生代再次掃描Eden和S0,對(duì)有用的對(duì)象進(jìn)行復(fù)制然后放進(jìn)S1區(qū)域里面,然后把Eden和S0進(jìn)行清空,如此循環(huán)S0和S1輪流會(huì)有一個(gè)保持為空,survivor區(qū)就叫做存活區(qū)域有點(diǎn)像倉(cāng)庫(kù)的概念。3)要是在掃描的時(shí)候發(fā)現(xiàn)有用的對(duì)象很多,要是空的S0或者S1裝不下怎么辦??==》這個(gè)時(shí)候放不下就會(huì)進(jìn)行升級(jí)往老年代內(nèi)存里面進(jìn)行存放,老年代的內(nèi)存一般都是比較大的4)那假如老年代滿了怎么辦呢?就會(huì)進(jìn)行對(duì)新生代和老年代的全掃描進(jìn)行全局的垃圾回收,掃描之后保留有用的對(duì)象,大部分沒(méi)用的對(duì)象其實(shí)在新生代就被垃圾回收了,根本上就進(jìn)入不到老年代里面,真正能進(jìn)入到S0或者S1區(qū)域的對(duì)象其實(shí)很少,因?yàn)橐粋€(gè)對(duì)象的存活周期非常的短,Eden:S0:S1的空間比例為8:1:15)那么什么時(shí)候會(huì)進(jìn)入到老年代內(nèi)存里面呢?有3種情況可能【重點(diǎn)】1)當(dāng)新生代內(nèi)存不夠的時(shí)候2)當(dāng)某個(gè)對(duì)象在新生代發(fā)生GC垃圾回收達(dá)到15次之后,任然還是有效的,每存活一次年齡加1,年齡為15的時(shí)候那么就可以存放到老年代內(nèi)存里面了3)如果一個(gè)對(duì)象剛創(chuàng)建的時(shí)候特別大,比如大于5MB,因?yàn)樾律旧聿?MB,這種就直接進(jìn)入到老年代
堆內(nèi)存?=?年輕代+老年代
年輕代?=?Eden+Survivor
Survivor?=?From?Space(s0)+To?Space(s1)
7、堆內(nèi)存
1)堆內(nèi)存是Jvm中空間最大的區(qū)域 ==》如果總的內(nèi)存為2GB那么堆內(nèi)存至少為1024MB要占上1/2
2)所有線程共享堆
3)所有的數(shù)組以及內(nèi)存對(duì)象的實(shí)例都在此區(qū)域分配
4)堆內(nèi)存大小通過(guò)參數(shù)進(jìn)行配置
-Xmx:最大堆內(nèi)存
-Xms:最小堆內(nèi)存
5)堆內(nèi)存構(gòu)成
–?新生代:包括三塊區(qū)域,eden、from?survivor(s0)、to?survivor(s1)
–?老年代:old?gen
Object?o?=?new?Object()
其中,o存放在棧內(nèi)存中,new?Object()存放在堆內(nèi)存中,變量o是Object對(duì)象的引用,o上存放了Object對(duì)象占用內(nèi)存的起始地址
8、永久代
永久代也叫(Method?Area)
各線程共享,主方法區(qū)要存放類信息、常量、靜態(tài)變量
如:public?static?int?a?=?10
垃圾回收行為比較少見(jiàn)
年輕代?=?Eden+Survivor
Survivor?=?From?Space(s0)?+?To?Space(s1)
年輕代?=?Eden+From?Space+To?Space
堆內(nèi)存?=?年輕代+老年代
堆內(nèi)存=Eden+From?Space+To?Space+老年代
9、Java8的新變化
Java8從Jvm中移除了PermGen,使用Metaspace(元空間)來(lái)代替永久代
Metaspace不存在Jvm中,而是存在本地內(nèi)存中配置元空間初始值和最大值參數(shù):
-XX:MetaspaceSize=64m
-XX:MaxMetaspaceSize=64m10、YoungGC和FullGC的概念(GC指的是垃圾回收?Garbage?Collection)
新生代引發(fā)的GC叫YoungGC
老年代引發(fā)的GC叫FullGC
FullGC會(huì)引起整個(gè)Jvm的用戶線程暫停,待垃圾回收完畢后,才繼續(xù)運(yùn)行
11、永久代的垃圾回收
永久代回收"性價(jià)比"比較低
主要回收
1)廢棄的常量
2)無(wú)用的類
3)類的所有實(shí)例都已經(jīng)被回收
4)加載該類的ClassLoader已經(jīng)被回收
5)該類的Class對(duì)象沒(méi)有在任何地方被引用12、堆垃圾回收算法
1)標(biāo)記-清除算法??==》分為“標(biāo)記”和“清除”兩個(gè)階段,標(biāo)記完成后,統(tǒng)一回收,缺點(diǎn)是:效率,標(biāo)記和清除過(guò)程效率都不高,空間,標(biāo)記清除后會(huì)產(chǎn)生大量不連續(xù)的內(nèi)存碎片
2)復(fù)制算法?==》內(nèi)存分為相等的兩塊,當(dāng)一塊內(nèi)存用完,將存活對(duì)象復(fù)制到另外一塊中,原內(nèi)存一次性清理掉,復(fù)制時(shí)按照順序分配內(nèi)存,無(wú)內(nèi)存碎片問(wèn)題,新生代使用此算法?缺點(diǎn)是:將內(nèi)存分為兩半,利用率低
3)標(biāo)記-壓縮算法?==》先對(duì)存活對(duì)象進(jìn)行標(biāo)記,讓所有存活對(duì)象向一邊移動(dòng),清理掉存活對(duì)象邊界外的所有內(nèi)存,老年代使用此算法
4)分代收集算法?==》當(dāng)代的商業(yè)虛擬機(jī)都采用“分代收集”,根據(jù)對(duì)象的存活周期的不同將內(nèi)存劃分成幾塊,一般Java堆分為新生代和老年代,新生代采用復(fù)制算法,老年代采用標(biāo)記-壓縮算法
垃圾收集器是內(nèi)存回收算法的具體實(shí)現(xiàn)
沒(méi)有完美的收集器
Jvm不同的區(qū)域可以采用不同的垃圾收集器組合,主要有:
–Serial收集器(串行)
–ParNew收集器(并行)
–CMS收集器(并發(fā))
–G1(時(shí)間優(yōu)先)?==》G1全稱是Garbage?First?Garbage?Collector,在jdk1.7u4中開(kāi)始支持。Java9中默認(rèn)的垃圾收集器,G1的設(shè)計(jì)原則就是簡(jiǎn)化性能優(yōu)化的復(fù)雜性
目前CMS收集器和G1收集器用的是最多的==》性能測(cè)試jvm垃圾收集器G1和 CMS 的區(qū)別【杭州多測(cè)師】【杭州多測(cè)師_王sir】
13、內(nèi)存溢出
1)堆內(nèi)存溢出
堆內(nèi)存中存在大量對(duì)象,這些對(duì)象都有被引用,當(dāng)所有對(duì)象占用空間達(dá)到堆內(nèi)存的最大值,?就會(huì)出現(xiàn)內(nèi)存溢出OutOfMemory:Java?heap?space
2)永久代溢出
類的一些信息,如類名、訪問(wèn)修飾符、字段描述、方法描述等,所占空間大于永久代最大值,就會(huì)出現(xiàn)OutOfMemoryError:PermGen?space14、內(nèi)存溢出的檢測(cè)方法
Jdk/bin目錄下有很多檢測(cè)工具
圖形界面:
–Jconsole
–Jvisualvm
命令行工具
–Jstat?–gcutil?pid?1000?100
–Jmap?–histo?pid?|?head?-20
–Jmap?–heap?pid?FullGC頻率:建議單次FullGC時(shí)間<200ms
垃圾回收和CPU使用率
?內(nèi)存泄露和TPS
15、jvm常用的參數(shù)
-Xms2048m,初始堆大小,建議<物理內(nèi)存的1/4,默認(rèn)值為物理內(nèi)存的1/64
-Xmx2048m,最大堆大小,建議與-Xms保持一致,默認(rèn)值為物理內(nèi)存的1/4
-Xmn512m,新生代大小,建議不超過(guò)堆內(nèi)存的1/2
-Xss256k,線程堆棧大小,建議256k
-XX:PermSize=256m,永久代初始值,默認(rèn)值為物理內(nèi)存的1/64
-XX:MaxPermSize=256m,永久代最大值,默認(rèn)值為物理內(nèi)存的1/4
-XX:SurvivorRatio=8:年輕帶中Eden區(qū)和Survivor區(qū)的比例,默認(rèn)為8:1,即Eden(8),?From?Space(1),ToSpace(1)
-XX:+UseConcMarkSweepGC:開(kāi)啟CMS垃圾回收器
總結(jié)
以上是生活随笔為你收集整理的Java当中jvm运行时区域新生代、老年代、永久代和Garbage Collection垃圾回收机制【杭州多测师】【杭州多测师_王sir】...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql ngram 中文_MySQL
- 下一篇: java美元兑换,(Java实现) 美元