運(yùn)行時(shí)數(shù)據(jù)區(qū)
虛擬機(jī)棧
本地方法棧
方法區(qū)
虛擬機(jī)棧:線程私有遥皂。其實(shí)就是記錄方法的一個(gè)棧,每次方法執(zhí)行的時(shí)候就會(huì)往里面push一個(gè)棧幀滋尉。一個(gè)方法的生命歷程就是在虛擬機(jī)棧里面入棧到出戰(zhàn)的過(guò)程拧揽。每一個(gè)棧幀里面有方法的局部變量表和操作數(shù)棧休里,動(dòng)態(tài)鏈接富腊,以及方法出口坏逢。一般說(shuō)的棧內(nèi)存就是指的這一區(qū)域,或者是他局部變量表部分赘被,局部變量表里面存放的是各種基本類型是整,和對(duì)象的引用類型ref,值得一提的是局部變量表的長(zhǎng)度或者是大小是不會(huì)變得民假,運(yùn)行時(shí)不會(huì)改變贰盗,不知道是怎么確定這個(gè)大小的?阳欲??。關(guān)于stackoverflow的出現(xiàn)球化,每執(zhí)行一個(gè)方法就會(huì)push一個(gè)棧幀秽晚,當(dāng)寫出死循環(huán)后者是無(wú)窮無(wú)盡的遞歸的時(shí)候,一直push而不pop就會(huì)出現(xiàn)stack的大小不夠筒愚,就會(huì)出現(xiàn)stackoverflow這個(gè)異常赴蝇。如果虛擬機(jī)棧是可以動(dòng)態(tài)擴(kuò)展的,當(dāng)無(wú)法申請(qǐng)到內(nèi)存的時(shí)候就會(huì)出現(xiàn)oom異常巢掺。
本地方法棧:這區(qū)和虛擬機(jī)棧一樣句伶,不同是他只為native也就是本地方法服務(wù),也會(huì)出現(xiàn)兩種異常陆淀。有的虛擬機(jī)實(shí)現(xiàn)的時(shí)候會(huì)將兩個(gè)虛擬機(jī)棧合并到一起 hotspot考余。
方法區(qū):線程共有,里面存放了已經(jīng)被虛擬機(jī)加載的類信息轧苫,常量楚堤,靜態(tài)變量,以及即使編譯的代碼含懊。Non-heap,一般說(shuō)的永久代就是說(shuō)的這個(gè)身冬,但是不準(zhǔn)確,因?yàn)樵谥暗陌姹纠锩娑际怯糜谰么姆绞饺?shí)現(xiàn)的方法區(qū)岔乔。這里一般不會(huì)有垃圾收集酥筝,如果是垃圾收集,一般指的是常量池的收集和類型的卸載雏门,但是類型卸載的條件太苛刻了嘿歌。當(dāng)方法區(qū)無(wú)法申請(qǐng)內(nèi)存之后會(huì)oom。
heap:內(nèi)存模型里面最大的部分剿配。存放內(nèi)存的實(shí)例搅幅。里面會(huì)發(fā)生GC有FullGC和minorGC,是線程共有的呼胚,然后也會(huì)為線程分出私有的緩沖區(qū)茄唐,heap按代劃分則是新生代和老年代,新生代里面有eden fromSurviver ToSurviver等三個(gè)空間蝇更。當(dāng)內(nèi)存不夠的時(shí)候會(huì)發(fā)生oom沪编。
程序計(jì)數(shù)器:靠這個(gè)來(lái)指揮字節(jié)碼工作
運(yùn)行時(shí)常量池:他是方法區(qū)的部分,放置編譯的字面量和符號(hào)引用年扩。常量池具有動(dòng)態(tài)性蚁廓,不僅僅可以編譯的時(shí)候產(chǎn)生內(nèi)容運(yùn)行的 時(shí)候也可以將內(nèi)容放進(jìn)去。比如說(shuō)String的intern方法厨幻。當(dāng)常量池里面無(wú)法再申請(qǐng)內(nèi)存的時(shí)候會(huì)oom相嵌。
直接內(nèi)存:并不是運(yùn)行時(shí)內(nèi)存的一部分腿时,在jdk1.4里面加入了NIO,能夠在native方法里面直接分配堆外內(nèi)存饭宾。-Xmx過(guò)大導(dǎo)致jvm的內(nèi)存過(guò)高導(dǎo)致動(dòng)態(tài)拓展的時(shí)候會(huì)出現(xiàn)oom批糟。
heap
程序計(jì)數(shù)器
eden
Fs
F2
8:1:1
關(guān)于Intern方法,當(dāng)常量池里面有這個(gè)字符串的時(shí)候看铆,就返回這個(gè)字符串的引用徽鼎。
關(guān)于string 設(shè)計(jì)成不可變的原因:
1在編程的時(shí)候大部分時(shí)間都是在處理字符串,不可變相當(dāng)于是一種優(yōu)化弹惦。
2安全性的考慮可以防止字符串有意無(wú)意的篡改否淤。
3作為hash表里面的key應(yīng)該是不可變的。