1.靜態(tài)內(nèi)存分配和回收
? ? 靜態(tài)內(nèi)存空間是在Java棧上分配的(編譯時(shí)就確定的),當(dāng)這個(gè)方法結(jié)束的時(shí)候,對(duì)應(yīng)的棧幀也就取消,且靜態(tài)內(nèi)存空間也就回收了(針對(duì)棧幀而言)硫朦。
2.動(dòng)態(tài)內(nèi)存分配和回收
? ? JAVA中對(duì)象的內(nèi)存空間是動(dòng)態(tài)分配的,所謂的動(dòng)態(tài)分配就是在程序執(zhí)行時(shí)才知道要分配的存儲(chǔ)空間大小背镇,而不是在編譯時(shí)就能夠確定的咬展。
? ? 針對(duì)堆中對(duì)象什么時(shí)候不被使用,又如何來(lái)回收它們瞒斩,這正是JVM的一個(gè)很重要的組件-----垃圾回收器要解決的問(wèn)題破婆。
垃圾檢測(cè)的算法:
? ? 1.引用計(jì)數(shù)算法
????2.可達(dá)性分析法
垃圾回收算法:
1.基于分代的垃圾回收算法
? ? ? ? 該算法設(shè)計(jì)思路:把對(duì)象按照壽命長(zhǎng)短來(lái)分組,分為年輕代和年老代胸囱,新創(chuàng)建的對(duì)象分在年輕代祷舀,如果對(duì)象經(jīng)過(guò)幾次回收之后依然存活,那么再把這個(gè)對(duì)象劃分到年老代烹笔。年老代的收集頻率不像年輕代那么頻繁裳扯,這樣就減少了每次垃圾收集需要掃描的對(duì)象個(gè)數(shù),從而提高了垃圾回收的效率谤职。
? ? 這種思路是把堆劃分成了若干個(gè)子堆饰豺,每個(gè)子堆都對(duì)應(yīng)一個(gè)年齡代。
? ? ? ? ? ? 分別是:? ? (1)新生代(Young區(qū))其中Young區(qū)又分為Eden區(qū)和兩個(gè)Survivor區(qū)允蜈。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(2)老年區(qū)(Old區(qū))
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(3)永久區(qū)(Perm區(qū))
? ? Young區(qū)又分為Eden區(qū)和兩個(gè)survivor區(qū)冤吨,其中所有新創(chuàng)建的對(duì)象都在Eden區(qū),當(dāng)Eden區(qū)滿了之后會(huì)觸發(fā)minor GC將Eden區(qū)仍然存活的對(duì)象復(fù)制到其中一個(gè)Survivor區(qū)中饶套,另外一個(gè)Survivor區(qū)中的存活對(duì)象也復(fù)制到這個(gè)Survivor中漩蟆,以始終保證有一個(gè)Survivor區(qū)是空的。如果Survivor區(qū)也滿了凤跑,GC收集器會(huì)將這些對(duì)象直接存放到Old區(qū)爆安。如果在Survivor區(qū)中的對(duì)象足夠老叛复,也會(huì)被直接放到Old區(qū)仔引。最終OLD區(qū)也滿了的時(shí)候,就會(huì)出發(fā)Full GC,直接回收整個(gè)堆內(nèi)存褐奥。
Perm區(qū)存放的是Class對(duì)象和ClassLoader咖耘。如果Perm區(qū)滿了,同樣觸發(fā)Full GC撬码。
SUN官方建議:Young區(qū)大小為整個(gè)堆大小的1/4
Young中的Survivor一般為整個(gè)堆大小的1/8
總結(jié):當(dāng)OLD區(qū)滿了的時(shí)候和永久區(qū)滿了的時(shí)候就會(huì)觸發(fā)FULL GC.
2.標(biāo)記-清除算法:
標(biāo)記過(guò)程:引用計(jì)數(shù)法儿倒,可達(dá)性分析
CMS收集器就采用此算法,缺點(diǎn)是會(huì)產(chǎn)生大量的不連續(xù)的內(nèi)存碎片,不利于后續(xù)裝入大對(duì)象的操作夫否。
3.復(fù)制算法:
? ? 把容量分成相同兩個(gè)部分彻犁,每次使用其中一塊,當(dāng)其中一塊用完了凰慈,復(fù)制對(duì)象到另一塊上面去」保現(xiàn)在的虛擬機(jī)大多使用這個(gè)方法來(lái)手機(jī)新生代中的對(duì)象,到survivor區(qū)中微谓。
4.標(biāo)記-整理算法
? ? 標(biāo)記過(guò)程:引用計(jì)數(shù)和可達(dá)性分析
? ? 整理算法不是對(duì)可回收對(duì)象進(jìn)行清理森篷,而是把對(duì)象都向一端移動(dòng),然后直接清理掉端邊界以外的內(nèi)存豺型。
4.Hotspot提供了6個(gè)垃圾收集器:
1.Serial 收集器(Client模式下默認(rèn)):
? ? 是單線程的新生代垃圾收集器
? ? 新生代采用復(fù)制算法暫停所有用戶線程仲智。
? ? 老年代采用標(biāo)記-整理算法暫停所有用戶進(jìn)程。
2. ParNew 收集器
? ? 是上面Serial收集器的多線程版本姻氨,在單CPU下表現(xiàn)不如Serical 收集器
3.Paralllel Scavenge 收集器
? ? 和ParNew類似钓辆,目的是達(dá)到可控制的吞吐量,可以指定吞吐量大小時(shí)間
4.Serical Old收集器
? ? Serial Old是Serial收集器的在老年代的版本肴焊,同樣是單線程
5. Parallel OLD 收集器
? ? 同樣是Parlllel Scavenge收集器的老年代版本
6. CMS (Concurrent Mark Sweep)收集器
? ? CMS收集器是一種獲取最短回收停頓時(shí)間為目標(biāo)的收集器岩馍。
? ? 基于 標(biāo)記-清除 算法實(shí)現(xiàn)
Eden(新生代中的一部分):對(duì)象優(yōu)先在Eden中分配,當(dāng)Eden沒(méi)有足夠空間進(jìn)行分配的時(shí)候抖韩,虛擬機(jī)將發(fā)起一次MinorGC.
老年代:大對(duì)象直接進(jìn)入老年代蛀恩,長(zhǎng)期存活的對(duì)象將進(jìn)入老年代。
Minor GC:一般當(dāng)新對(duì)象生成茂浮,并且在Eden申請(qǐng)空間失敗時(shí)双谆,觸發(fā)。將清除Eden區(qū)的非存活對(duì)象席揽,并把存貨對(duì)象移動(dòng)到Survivor顽馋,然后整理兩個(gè)Survivor區(qū)。該方式不會(huì)影響到老年代幌羞,此外寸谜,該GC推薦使用速度快,效率高的算法属桦,使Eden區(qū)盡快空閑出來(lái)熊痴。
Full GC:對(duì)整個(gè)堆進(jìn)行整理,包括Young聂宾、Tenured和Perm果善,因此為了提高系統(tǒng)性能,需要減少FullGC的次數(shù)系谐。發(fā)生FullGC的場(chǎng)景有:年老代寫滿巾陕,持久代被寫滿和System.gc()被顯示調(diào)用,上一次GC后Heap各域分配策略動(dòng)態(tài)變化。
? ??