總結(jié)一些容易被遺忘的基礎(chǔ)知識,適合有一定Java基礎(chǔ)的技術(shù)人員閱讀。有些內(nèi)容可能對初學(xué)者來說比較困難,希望能幫助大家輕松應(yīng)對面試官的基本技術(shù)問題,提高編碼效率。 JVM基礎(chǔ)1、內(nèi)存模型(1)程序計(jì)數(shù)器:線程私有、CPU調(diào)度的基本單位,用于保證線程切換(多線程環(huán)境下程序可連續(xù)執(zhí)行); (2)棧(服務(wù)Java法虛擬機(jī)棧,服務(wù)Native法本地方法棧):線程私有,局部變量/引用,棧深(SOF)/無法申請內(nèi)存(OOM); (3)堆(Java代碼可及的Java堆和JVM本身使用的方法區(qū)):線程共享、對象分配和回收主要區(qū)域、OOM; 2、垃圾回收機(jī)制。(1)Stop-the-World。 JVM因執(zhí)行GC而停止執(zhí)行應(yīng)用程序稱為Stop-the-world,這種情況發(fā)生在任何GC算法中。當(dāng)Stop-the-world發(fā)生時,除了GC所需的線程外,所有線程都處于等待狀態(tài),直到GC任務(wù)完成。事實(shí)上,GC優(yōu)化往往是指減少Stop-the-world的發(fā)生時間,使系統(tǒng)具有高吞吐量、低停頓的特點(diǎn)。 (2)回收J(rèn)AVA堆。 Java對象的回收主要考慮以下兩個問題:哪些對象可以回收,如何回收(哪些回收算法和垃圾回收器)。 ?、倥袛鄬ο笫欠窨梢曰厥眨阂糜?jì)數(shù)法數(shù)法(相互引用)、可達(dá)性算法(對象引用鏈?zhǔn)欠窨蛇_(dá),GCRoots) ②垃圾回收算法:標(biāo)記清除算法(內(nèi)存碎片)、復(fù)制算法(垃圾回收頻繁、對象存活率低的新一代)、標(biāo)記整理算法(垃圾回收不頻繁、對象存活率高的老年人)、分代收集算法。 ?、劾厥掌鳎捍惺占?新生代、老年代)、并行收集器(新生代、老年代)、并行清除收集器(并發(fā)、新生代、追求高吞吐量)、CMS收集器(并發(fā)、老年、標(biāo)記-清除算法、追求低停頓)、G1垃圾收集器(整堆,追求低停頓) 附: GCRoots一般包括虛擬機(jī)棧中引用的對象、本地方法棧中引用的對象、方法區(qū)中類靜態(tài)屬性引用的對象、方法區(qū)中常引用的對象。 附: GCRoots一般包括虛擬機(jī)棧中引用的對象、本地方法棧中引用的對象、方法區(qū)中類靜態(tài)屬性引用的對象、方法區(qū)中常引用的對象。 分代收集算法的基本思想是:不同對象的生命周期(生存條件)不同,不同生命周期的對象位于堆中的不同區(qū)域。因此,采用不同的策略回收堆內(nèi)存的不同區(qū)域可以提高JVM的執(zhí)行效率。MinorGC的發(fā)生頻率很高,不一定等到Eden區(qū)域滿了才觸發(fā);MajorGC在老年人滿時觸發(fā),回收年輕人和老年人。 (3)方法區(qū)回收。 ?、倩厥粘A砍?。 ?、谛遁d類型:這類的所有實(shí)例都被回收,這類Classloader被回收,對這類Class對象沒有引用。 3、OOM/SOF。(1)OOMforHeap:內(nèi)存泄露(GCRoots的引用鏈,對象的生命周期超出預(yù)期)或內(nèi)存溢出(調(diào)整JVM參數(shù)-X、-Xmx等。 (2)OOMforStack:一般不會出現(xiàn)在單線程序中;在多線程環(huán)境下,無法申請足夠的內(nèi)存來創(chuàng)建線程。 SOFforStack:程序是否有深度遞歸。 (4)OOMforPerm:使用Spring等框架時,往往會動態(tài)生成大量類別,導(dǎo)致永久代不足,導(dǎo)致OutOfmemoryError:PermgenSpace異常(調(diào)大-XX:MaxPermSize) |
|