1、JVM是什么?
1)Java Virtual Machine(Java虛擬機(jī))的縮寫;
2)實(shí)現(xiàn)跨平臺(tái)的最核心的部分;
3).class 文件會(huì)在 JVM 上執(zhí)行,JVM 會(huì)解釋給操作系統(tǒng)執(zhí)行;
4)有自己的指令集,解釋自己的指令集到 CPU 指令集和系統(tǒng)資源的調(diào)用;
5)JVM 只關(guān)注被編譯的 .class 文件,不關(guān)心 .java 源文件。
2、Java跨平臺(tái)運(yùn)行的原理是什么?
1).java 源文件要先編譯成與操作系統(tǒng)無關(guān)的 .class 字節(jié)碼文件,然后字節(jié)碼文件再通過 Java 虛擬機(jī)解釋成機(jī)器碼運(yùn)行;
2).class 字節(jié)碼文件面向虛擬機(jī),不面向任何具體操作系統(tǒng);
3)不同平臺(tái)的虛擬機(jī)是不同的,但它們給 JDK 提供了相同的接口;
4)Java 的跨平臺(tái)依賴于不同系統(tǒng)的 Java 虛擬機(jī)。
3、JVM 的主要組成部分?及其作用?

class loader( 類加載器):加載類文件到內(nèi)存。Class loader只管加載,只要符合文件結(jié)構(gòu)就加載,至于能否運(yùn)行,它不負(fù)責(zé),那是有Exectution Engine 負(fù)責(zé)的;
exection engine( 執(zhí)行引擎也叫解釋器):負(fù)責(zé)解釋命令,交由操作系統(tǒng)執(zhí)行;
native interface( 本地接口):本地接口的作用是融合不同的語言為java所用;
Runtime Data area( 運(yùn)行數(shù)據(jù)區(qū)):運(yùn)行數(shù)據(jù)區(qū)是jvm的重點(diǎn),我們所有所寫的程序都被加載到這里,之后才開始運(yùn)行;
stack(棧也叫棧內(nèi)存):是java程序的運(yùn)行區(qū),是在線程創(chuàng)建時(shí)創(chuàng)建,它的生命周期跟隨線程的生命周期,線程結(jié)束棧內(nèi)存釋放;對(duì)于棧來說不存在垃圾回收的問題,只要線程一結(jié)束,該棧就結(jié)束。棧中的數(shù)據(jù)以棧幀的格式存在,棧幀是一個(gè)內(nèi)存區(qū)塊,是一個(gè)數(shù)據(jù)集,是一個(gè)有關(guān)方法和運(yùn)行期數(shù)據(jù)的集合,當(dāng)一個(gè)方法A被調(diào)用時(shí)就產(chǎn)生了一個(gè)棧幀F(xiàn)1,并被壓入到棧中,A方法又調(diào)用了B方法,于是產(chǎn)生棧幀F(xiàn)2也被壓入棧,執(zhí)行完畢后,先彈出F2棧幀,再彈出F1棧幀,遵循“先進(jìn)后出”原則;
heap(堆內(nèi)存):一個(gè)JVM實(shí)例只存在一個(gè)堆內(nèi)存,堆內(nèi)存的大小是可以調(diào)節(jié)的。類的加載器讀取了類文件之后,需要把類、方法、常變量放到堆內(nèi)存中,以方便執(zhí)行器執(zhí)行,堆內(nèi)存分三部分:永久存儲(chǔ)(用于存放jdk自身攜帶的class,interface的元數(shù)據(jù),也就是說它存儲(chǔ)的是運(yùn)行環(huán)境必須的類信息,被裝載至此區(qū)域的數(shù)據(jù)是不會(huì)被垃圾回收掉的,只有關(guān)閉jvm釋放此區(qū)域所占用的內(nèi)存)區(qū)、新生區(qū)、老年代;
method area(方法區(qū)):是被所有線程共享,該區(qū)域保存的所有字段和字節(jié)方法碼以及一些特殊方法如構(gòu)造函數(shù),接口代碼也在此定義;
PC Register(程序計(jì)數(shù)器):每個(gè)線程都有一個(gè)程序計(jì)數(shù)器,就是一個(gè)指針,指向方法區(qū)中的方法字節(jié)碼,由執(zhí)行引擎讀取下一條指令。
4、JVM內(nèi)存管理是什么?
JVM在執(zhí)行Java程序的過程中,會(huì)把它管理的內(nèi)存劃分為幾個(gè)不同的數(shù)據(jù)區(qū)域,這些區(qū)域都有各自的用途、創(chuàng)建時(shí)間、銷毀時(shí)間。

1)程序計(jì)數(shù)器(Program Counter Register):當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器,字節(jié)碼解析器的工作是通過改變這個(gè)計(jì)數(shù)器的值,來選取下一條需要執(zhí)行的字節(jié)碼指令,分支、循環(huán)、跳轉(zhuǎn)、異常處理、線程恢復(fù)等基礎(chǔ)功能,都需要依賴這個(gè)計(jì)數(shù)器來完成;
2)Java 虛擬機(jī)棧(Java Virtual Machine Stacks):用于存儲(chǔ)局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口等信息;
3)本地方法棧(Native Method Stack):與虛擬機(jī)棧的作用是一樣的,只不過虛擬機(jī)棧是服務(wù)Java方法的,而本地方法棧是為虛擬機(jī)調(diào)用Native方法服務(wù)的;
4)Java 堆(Java Heap):Java虛擬機(jī)中內(nèi)存最大的一塊,是被所有線程共享的,幾乎所有的對(duì)象實(shí)例都在這里分配內(nèi)存;
5)方法區(qū)(Methed Area):用于存儲(chǔ)已被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時(shí)編譯后的代碼等數(shù)據(jù)。
5、怎么判斷對(duì)象是否可以被回收?
1)引用計(jì)數(shù)法
簡(jiǎn)單的說就是給對(duì)象添加一個(gè)計(jì)數(shù)器,每當(dāng)有一個(gè)地方引用它時(shí),計(jì)數(shù)器就加1;當(dāng)引用失效,計(jì)數(shù)器就減1;任何時(shí)刻計(jì)數(shù)器為0的對(duì)象,就是不可能再使用的。
優(yōu)點(diǎn):效率高,實(shí)現(xiàn)簡(jiǎn)單
缺點(diǎn):無法解決對(duì)象之間循環(huán)引用的問題
2)可達(dá)性算法
算法的基本思想是通過一系列的成為“GC Roots”的對(duì)象作為起點(diǎn),從這些起點(diǎn)開始向下搜索,搜索的路徑就成為引用鏈(Reference Chain),當(dāng)一個(gè)對(duì)象到GC Roots沒有任何的引用鏈相連的話,也就是該對(duì)象不可達(dá),則證明該對(duì)象是不可用的。

6、堆和棧的區(qū)別?
1)棧內(nèi)存儲(chǔ)程序中定義的變量(基本類型和引用類型),堆中存儲(chǔ)引用變量所引用的對(duì)象;
2)棧內(nèi)存的更新速度要快于堆內(nèi)存,因?yàn)榫植孔兞康纳芷诤芏蹋?/p>
3)棧內(nèi)存存放的變量生命周期一旦結(jié)束就會(huì)被釋放,而堆內(nèi)存存放的對(duì)象會(huì)被垃圾回收機(jī)制不定時(shí)的回收。
7、隊(duì)列和棧是什么?有什么區(qū)別?
隊(duì)列(Queue):是限定只能在表的一端進(jìn)行插入和在另一端進(jìn)行刪除操作的線性表;
棧(Stack):是限定只能在表的一端進(jìn)行插入和刪除操作的線性表。
1)規(guī)則不同
隊(duì)列:先進(jìn)先出(First In First Out)FIFO;
棧:先進(jìn)后出(First In Last Out )FILO。
2)插入和刪除操作的限定不同
隊(duì)列:只能在表的一端進(jìn)行插入,并在表的另一端進(jìn)行刪除;
棧:只能在表的一端插入和刪除。
3)遍歷數(shù)據(jù)速度不同
隊(duì)列:基于地址指針進(jìn)行遍歷,而且可以從頭部或者尾部進(jìn)行遍歷,但不能同時(shí)遍歷,無需開辟空間,因?yàn)樵诒闅v的過程中不影響數(shù)據(jù)結(jié)構(gòu),所以遍歷速度要快;
棧:只能從頂部取數(shù)據(jù),也就是說最先進(jìn)入棧底的,需要遍歷整個(gè)棧才能取出來,而且在遍歷數(shù)據(jù)的同時(shí)需要為數(shù)據(jù)開辟臨時(shí)空間,保持?jǐn)?shù)據(jù)在遍歷前的一致性。
8、類加載器的類別
1)BootstrapClassLoader(啟動(dòng)類加載器)
c++編寫,加載java核心庫 java.*,構(gòu)造ExtClassLoader和AppClassLoader。由于引導(dǎo)類加載器涉及到虛擬機(jī)本地實(shí)現(xiàn)細(xì)節(jié),開發(fā)者無法直接獲取到啟動(dòng)類加載器的引用,所以不允許直接通過引用進(jìn)行操作
2)ExtClassLoader (標(biāo)準(zhǔn)擴(kuò)展類加載器)
java編寫,加載擴(kuò)展庫,如classpath中的jre ,javax.*或者 java.ext.dir 指定位置中的類,開發(fā)者可以直接使用標(biāo)準(zhǔn)擴(kuò)展類加載器。
3)AppClassLoader(系統(tǒng)類加載器)
java編寫,加載程序所在的目錄,如user.dir所在的位置的class
4)CustomClassLoader(用戶自定義類加載器)
java編寫,用戶自定義的類加載器,可加載指定路徑的class文件
9、什么是雙親委派機(jī)制?作用是什么?
當(dāng)某個(gè)類加載器需要加載某個(gè).class文件時(shí),它首先把這個(gè)任務(wù)委托給他的上級(jí)類加載器,遞歸這個(gè)操作,如果上級(jí)的類加載器沒有加載,自己才會(huì)去加載這個(gè)類。

作用:
1)防止重復(fù)加載同一個(gè).class。通過委托去向上面問一問,加載過了,就不用再加載一遍。保證數(shù)據(jù)安全;
2)保證核心.class不能被篡改。通過委托方式,不會(huì)去篡改核心.class,即使篡改也不會(huì)去加載,即使加載也不會(huì)是同一個(gè).class對(duì)象了。不同的加載器加載同一個(gè).class也不是同一個(gè)Class對(duì)象。這樣保證了Class執(zhí)行安全。
10、類加載的執(zhí)行過程?
類加載的過程主要分為加載、鏈接(驗(yàn)證、準(zhǔn)備、解析)、初始化三部分;

加載:通過類的全限定名獲取到類的二進(jìn)制流,然后加載到JVM中;
重點(diǎn):
1)字節(jié)碼來源。一般的加載來源包括從本地路徑下編譯生成的.class文件,從jar包中的.class文件,從遠(yuǎn)程網(wǎng)絡(luò),以及動(dòng)態(tài)代理實(shí)時(shí)編譯;
2)類加載器。一般包括啟動(dòng)類加載器,擴(kuò)展類加載器,應(yīng)用類加載器,以及用戶的自定義類加載器。
驗(yàn)證:確保Class文件的字節(jié)流中包含的信息符合虛擬機(jī)的要求,并且不會(huì)危害虛擬機(jī)的安全;
1)包括對(duì)于文件格式的驗(yàn)證,比如常量中是否有不被支持的常量?文件中是否有不規(guī)范的或者附加的其他信息;
2)對(duì)于元數(shù)據(jù)的驗(yàn)證,比如該類是否繼承了被final修飾的類?類中的字段,方法是否與父類沖突?是否出現(xiàn)了不合理的重載;
3)對(duì)于字節(jié)碼的驗(yàn)證,保證程序語義的合理性,比如要保證類型轉(zhuǎn)換的合理性;
4)對(duì)于符號(hào)引用的驗(yàn)證,比如校驗(yàn)符號(hào)引用中通過全限定名是否能夠找到對(duì)應(yīng)的類?校驗(yàn)符號(hào)引用中的訪問性(private,public等)是否可被當(dāng)前類訪問。
準(zhǔn)備:為類變量(注意,不是實(shí)例變量)分配內(nèi)存空間,并設(shè)置初始值;
重點(diǎn):
1)8種基本類型的初值,默認(rèn)為0;引用類型的初值則為null;
2)常量的初值即為代碼中設(shè)置的值,final static tmp = 1, 那么該階段tmp的初值就是1。
解析:虛擬機(jī)常量池的符號(hào)引用替換為直接引用過程,比如調(diào)用方法hello(),這個(gè)方法的地址是123,那么hello就是符號(hào)引用,123就是直接引用。
重點(diǎn):
1)符號(hào)引用。即一個(gè)字符串,但是這個(gè)字符串給出了一些能夠唯一性識(shí)別一個(gè)方法,一個(gè)變量,一個(gè)類的相關(guān)信息;
2)直接引用??梢岳斫鉃橐粋€(gè)內(nèi)存地址,或者一個(gè)偏移量。比如類方法,類變量的直接引用是指向方法區(qū)的指針;而實(shí)例方法,實(shí)例變量的直接引用則是從實(shí)例的頭指針開始算起到這個(gè)實(shí)例變量位置的偏移量;
3)在解析階段,虛擬機(jī)會(huì)把所有的類名,方法名,字段名這些符號(hào)引用替換為具體的內(nèi)存地址或偏移量,也就是直接引用。
初始化:根據(jù)用戶指定的代碼初始化字段和其它資源,執(zhí)行static塊;
重點(diǎn):
1)只對(duì)static修飾的變量或語句進(jìn)行初始化;
2)如果初始化一個(gè)類的時(shí)候,其父類尚未初始化,則優(yōu)先初始化其父類;
3)如果同時(shí)包含多個(gè)靜態(tài)變量和靜態(tài)代碼塊,則按照自上而下的順序依次執(zhí)行。
11、什么是Java的垃圾回收機(jī)制?
垃圾回收機(jī)制,簡(jiǎn)稱GC。
1)Java 語言不需要程序員直接控制內(nèi)存回收,由 JVM 在后臺(tái)自動(dòng)回收不再使用的內(nèi)存;
2)提高編程效率;
3)保護(hù)程序的完整性;
4)JVM 需要跟蹤程序中有用的對(duì)象,確定哪些是無用的,影響性能。
特點(diǎn)
1)回收 JVM 堆內(nèi)存里的對(duì)象空間,不負(fù)責(zé)回收棧內(nèi)存數(shù)據(jù);
2)無法處理一些操作系統(tǒng)資源的釋放,如數(shù)據(jù)庫連接、輸入流輸出流、Socket 連接;
3)垃圾回收發(fā)生具有不可預(yù)知性,程序無法精確控制垃圾回收機(jī)制執(zhí)行;
4)可以將對(duì)象的引用變量設(shè)置為 null,垃圾回收機(jī)制可以在下次執(zhí)行時(shí)回收該對(duì)象;
5)JVM 有多種垃圾回收 實(shí)現(xiàn)算法,表現(xiàn)各異;
6)垃圾回收機(jī)制回收任何對(duì)象之前,會(huì)先調(diào)用對(duì)象的 finalize() 方法;
7)可以通過 System.gc() 或 Runtime.getRuntime().gc() 通知系統(tǒng)進(jìn)行垃圾回收,會(huì)有一些效果,但系統(tǒng)是否進(jìn)行垃圾回收依然不確定;
8)不要主動(dòng)調(diào)用對(duì)象的 finalize() 方法,應(yīng)該交給垃圾回收機(jī)制調(diào)用。
12、Java中都有哪些引用類型?
1)強(qiáng)引用:當(dāng)我們使用new創(chuàng)建對(duì)象時(shí),被創(chuàng)建的對(duì)象就是強(qiáng)引用,如Object object = new Object(),其中的object就是一個(gè)強(qiáng)引用了。如果一個(gè)對(duì)象具有強(qiáng)引用,JVM就不會(huì)去GC它,JVM寧可會(huì)報(bào)OOM來終止程序,也不回收該對(duì)象。
2)軟引用: 如果一個(gè)對(duì)象只具備軟引用,如果內(nèi)存空間足夠,那么JVM就不會(huì)GC它,如果內(nèi)存空間不足了,就會(huì)GC該對(duì)象。
3)弱引用: 如果一個(gè)對(duì)象只具有弱引用,只要JVM的GC線程檢測(cè)到了,就會(huì)立即回收。弱引用的生命周期要比軟引用短很多。不過,如果垃圾回收器是一個(gè)優(yōu)先級(jí)很低的線程,也不一定會(huì)很快就會(huì)釋放掉軟引用的內(nèi)存。
4)虛引用:如果一個(gè)對(duì)象只具有虛引用,那么它就和沒有任何引用一樣,隨時(shí)會(huì)被JVM當(dāng)作垃圾進(jìn)行GC。
13、jvm有哪些垃圾回收算法?
常用的垃圾回收算法有如下四種:標(biāo)記-清除算法、復(fù)制算法、標(biāo)記-整理算法和分代收集算法。
標(biāo)記-清除算法
標(biāo)記清除分為兩個(gè)過程,即標(biāo)記階段和清除階段。首先從根Root出發(fā)將可以達(dá)到的對(duì)象進(jìn)行標(biāo)記,遍歷堆將未標(biāo)記的對(duì)象進(jìn)行刪除。
缺點(diǎn):①標(biāo)記清除效率不高,需要遍歷整個(gè)堆空間,②會(huì)產(chǎn)生碎片化空間,清除后產(chǎn)生不連續(xù)的地址空間,當(dāng)程序在以后的運(yùn)行過程中需要分配較大對(duì)象時(shí),如果無法找到足夠的連續(xù)內(nèi)存而不得不提前觸發(fā)另一次垃圾收集動(dòng)作。清除時(shí)會(huì)暫停程序的進(jìn)行,等待標(biāo)記清除結(jié)束后才會(huì)恢復(fù)應(yīng)用程序的運(yùn)行,這也是Stop-The-World這個(gè)單詞的來歷。該算法一般應(yīng)用于老年代,因?yàn)槔夏甏膶?duì)象生命周期比較長。
復(fù)制算法
復(fù)制算法將可用內(nèi)存按容量劃分為大小相等的兩塊,每次只使用一塊內(nèi)存,當(dāng)這塊內(nèi)存用完后,會(huì)將還存活的對(duì)象(這個(gè)地方我有點(diǎn)不理解,就是將還存活的對(duì)象復(fù)制到另一塊內(nèi)存,是不是也用到了標(biāo)記呢?標(biāo)記那些還存活的對(duì)象,然后復(fù)制的時(shí)候,遍歷堆內(nèi)存,將標(biāo)記的對(duì)象復(fù)制到另一塊內(nèi)存中,不過我查了相關(guān)的資料,發(fā)現(xiàn)沒有標(biāo)記這一過程,標(biāo)記-清除算法的標(biāo)記過程是為清除做準(zhǔn)備的,需要獲取的內(nèi)容是哪些對(duì)象是沒有用的,可達(dá)性分析過程中找到的都是需要可達(dá)的對(duì)象,也就是不可回收的對(duì)象,不是需要回收的對(duì)象,所以需要為有用的對(duì)象作標(biāo)記,在清除的時(shí)候清除沒有標(biāo)記的對(duì)象,然后再將標(biāo)記的對(duì)象去除標(biāo)記,好準(zhǔn)備下一次GC;但是復(fù)制算法需要獲取的是哪些對(duì)象是有用的,也就是說可達(dá)性分析的過程中已經(jīng)完成了篩選,分析過程中就可以將這一部分對(duì)象復(fù)制到另一半內(nèi)存中,然后把原來的一半內(nèi)存完全清除就可以了,沒有標(biāo)記的必要。)復(fù)制到另一塊等大的內(nèi)存中,最后再把已使用過的內(nèi)存空間清理掉。這樣每次都只會(huì)對(duì)半個(gè)內(nèi)存回收,分配時(shí)不需要考慮內(nèi)存空間碎片等問題。缺點(diǎn):但這樣的代價(jià)就是犧牲了一半的內(nèi)存,成本太高。
這種算法適用于處理新生代 ,在Java JVM中新生代不需要按照1:1的比例來分配,而是分為一塊較大的Eden(伊甸園區(qū)) 和 兩塊Survivor(存活區(qū)S0,S1)區(qū)域(S0,S1一個(gè)是from,另一個(gè)是to,但他們不是固定的,他們會(huì)隨著Minor GC發(fā)生變化),每次使用Eden和其中一塊的Survivor區(qū)域,當(dāng)進(jìn)行垃圾回收時(shí),會(huì)將Eden和使用過的Survivor中存活的對(duì)象復(fù)制到另一塊沒使用過的Survivor區(qū)域中。HotSpot默認(rèn)Eden 和 兩塊Survivor比例為8:1:1,這樣相對(duì)1:1浪費(fèi)一半的內(nèi)存來說,JVM只浪費(fèi)了10%的堆內(nèi)存。
標(biāo)記-整理算法
這個(gè)算法分為三部分:一是標(biāo)記出所有需要被回收的對(duì)象;二是把所有存活的對(duì)象都向一端移動(dòng);三是把所有存活對(duì)象邊界以外的內(nèi)存空間都回收掉。
標(biāo)記-整理算法解決了復(fù)制算法復(fù)制效率低、空間利用率低的問題,同時(shí)也解決了內(nèi)存碎片的問題。
分代收集算法
根據(jù)對(duì)象生存周期的不同將內(nèi)存空間劃分為不同的塊,然后對(duì)不同的塊使用不同的回收算法。一般把Java堆分為新生代和老年代,新生代中對(duì)象的存活周期短,只有少量存活的對(duì)象,所以可以使用復(fù)制算法,而老年代中對(duì)象存活時(shí)間長,而且對(duì)象比較多,所以可以采用標(biāo)記-清除和標(biāo)記-整理算法。
14、jvm有哪些垃圾回收器?
新生代收集器:
1)Serial
2)ParNew
3)Parallel Scavenge
老年代收集器:
1)Serial Old
2)CMS
3)Parallel Old
堆內(nèi)存垃圾收集器:
1)G1
15、既然有GC機(jī)制,為什么還會(huì)有內(nèi)存泄露的情況發(fā)生?
理論上 Java 因?yàn)橛欣厥諜C(jī)制(GC)不會(huì)存在內(nèi)存泄露問題(這也是 Java 被廣泛使用于服務(wù)器端編程的一 個(gè)重要原因)。然而在實(shí)際開發(fā)中,可能會(huì)存在無用但可達(dá)的對(duì)象,這些對(duì)象不能被 GC 回收,因此也會(huì)導(dǎo)致內(nèi)存泄露的情況發(fā)生。
例如 hibernate 的 Session(一級(jí)緩存)中的對(duì)象屬于持久態(tài),垃圾回收器是不會(huì)回收這些對(duì)象的,然而這些對(duì)象中 可能存在無用的垃圾對(duì)象,如果不及時(shí)關(guān)閉(close)或清空(flush)一級(jí)緩存就可能導(dǎo)致內(nèi)存泄露。
16、jvm有哪些調(diào)優(yōu)工具?

17、常用的 jvm 調(diào)優(yōu)的參數(shù)都有哪些?

18、介紹一下 CMS 垃圾回收器?
CMS 是英文 Concurrent Mark-Sweep 的簡(jiǎn)稱,是以犧牲吞吐量為代價(jià)來獲得最短回收停頓時(shí)間的垃圾回收器。對(duì)于要求服務(wù)器響應(yīng)速度的應(yīng)用上,這種垃圾回收器非常適合。在啟動(dòng)JVM 的參數(shù)加上“-XX:+UseConcMarkSweepGC”來指定使用 CMS 垃圾回收器。
CMS 使用的是標(biāo)記-清除的算法實(shí)現(xiàn)的,所以在 gc 的時(shí)候回產(chǎn)生大量的內(nèi)存碎片,當(dāng)剩余內(nèi)存不能滿足程序運(yùn)行要求時(shí),系統(tǒng)將會(huì)出現(xiàn) Concurrent Mode Failure,臨時(shí) CMS 會(huì)采用Serial Old 回收器進(jìn)行垃圾清除,此時(shí)的性能將會(huì)被降低。
19、簡(jiǎn)述分代垃圾回收器是怎么工作的?
分代回收器有兩個(gè)分區(qū):老生代和新生代,新生代默認(rèn)的空間占比總空間的 1/3,老生代的默認(rèn)占比是 2/3。
新生代使用的是復(fù)制算法,新生代里有 3 個(gè)分區(qū):Eden、To Survivor、From Survivor,它們的默認(rèn)占比是8:1:1,它的執(zhí)行流程如下:
把 Eden + From Survivor 存活的對(duì)象放入 To Survivor 區(qū);清空 Eden 和 From Survivor 分區(qū);From Survivor 和 To Survivor 分區(qū)交換,F(xiàn)rom Survivor 變 To Survivor,To Survivor 變 From Survivor。
每次在 From Survivor 到 To Survivor 移動(dòng)時(shí)都存活的對(duì)象,年齡就 +1,當(dāng)年齡到達(dá) 15(默認(rèn)配置是 15)時(shí),升級(jí)為老生代。大對(duì)象也會(huì)直接進(jìn)入老生代。老生代當(dāng)空間占用到達(dá)某個(gè)值之后就會(huì)觸發(fā)全局垃圾收回,一般使用標(biāo)記整理的執(zhí)行算法。以上這些循環(huán)往復(fù)就構(gòu)成了整個(gè)分代垃圾回收的整體執(zhí)行流程。
未完待續(xù)