版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
高頻javajvm面試題及答案Java內(nèi)存區(qū)域如何劃分?各部分的作用和可能的異常是什么?JVM內(nèi)存通常分為程序計(jì)數(shù)器、Java虛擬機(jī)棧、本地方法棧、堆、方法區(qū)(含運(yùn)行時(shí)常量池)五部分。程序計(jì)數(shù)器是當(dāng)前線(xiàn)程所執(zhí)行字節(jié)碼的行號(hào)指示器,線(xiàn)程私有,不會(huì)拋出內(nèi)存溢出異常。Java虛擬機(jī)棧存儲(chǔ)棧幀(局部變量表、操作數(shù)棧等),線(xiàn)程私有,若線(xiàn)程請(qǐng)求的棧深度超過(guò)允許值會(huì)拋StackOverflowError;若棧擴(kuò)展時(shí)無(wú)法申請(qǐng)內(nèi)存則拋OutOfMemoryError(OOM)。本地方法棧與虛擬機(jī)棧類(lèi)似,但服務(wù)于本地方法,HotSpot虛擬機(jī)將其與虛擬機(jī)棧合并。堆是JVM管理的最大內(nèi)存區(qū)域,所有對(duì)象實(shí)例和數(shù)組在此分配,線(xiàn)程共享,當(dāng)堆無(wú)法分配內(nèi)存且無(wú)法擴(kuò)展時(shí)拋OOM。方法區(qū)存儲(chǔ)類(lèi)信息、常量、靜態(tài)變量等,JDK7前稱(chēng)為永久代(基于堆),JDK8后改為元空間(基于本地內(nèi)存),當(dāng)類(lèi)信息過(guò)多無(wú)法分配時(shí)拋OOM(元空間默認(rèn)受本地內(nèi)存限制,OOM概率降低)。如何判斷對(duì)象是否存活?可達(dá)性分析的具體實(shí)現(xiàn)是怎樣的?判斷對(duì)象存活的主流方法是可達(dá)性分析(ReachabilityAnalysis)。該算法以“GCRoots”為起點(diǎn),通過(guò)引用鏈(ReferenceChain)遍歷,未被遍歷到的對(duì)象被標(biāo)記為可回收。GCRoots包括:虛擬機(jī)棧中局部變量表引用的對(duì)象、方法區(qū)中類(lèi)靜態(tài)屬性引用的對(duì)象、方法區(qū)中常量引用的對(duì)象、本地方法棧中JNI引用的對(duì)象。需注意,引用鏈斷裂不直接導(dǎo)致對(duì)象死亡,對(duì)象需經(jīng)歷兩次標(biāo)記:首次標(biāo)記為不可達(dá)后,若對(duì)象未重寫(xiě)finalize()或已執(zhí)行過(guò)finalize(),則直接回收;若重寫(xiě)且未執(zhí)行,對(duì)象會(huì)被放入F-Queue隊(duì)列,由低優(yōu)先級(jí)線(xiàn)程執(zhí)行finalize()(不保證執(zhí)行完畢),若在此過(guò)程中對(duì)象重新被引用(如關(guān)聯(lián)到GCRoots鏈),則標(biāo)記為存活,否則第二次標(biāo)記后回收。Java中四種引用類(lèi)型的區(qū)別和應(yīng)用場(chǎng)景是什么?強(qiáng)引用(StrongReference):最常見(jiàn)的引用類(lèi)型(如Objectobj=newObject()),只要存在強(qiáng)引用,對(duì)象不會(huì)被GC回收,即使內(nèi)存不足時(shí)JVM寧可拋OOM也不回收。軟引用(SoftReference):通過(guò)SoftReference類(lèi)實(shí)現(xiàn),當(dāng)內(nèi)存不足時(shí),軟引用關(guān)聯(lián)的對(duì)象會(huì)被回收,適用于緩存場(chǎng)景(如圖片緩存,內(nèi)存不足時(shí)釋放)。弱引用(WeakReference):通過(guò)WeakReference類(lèi)實(shí)現(xiàn),對(duì)象只能存活到下一次GC發(fā)生前,無(wú)論內(nèi)存是否足夠,GC時(shí)都會(huì)回收,適用于非必須的緩存(如ThreadLocal中的Entry使用弱引用避免內(nèi)存泄漏)。虛引用(PhantomReference):通過(guò)PhantomReference類(lèi)實(shí)現(xiàn),無(wú)法通過(guò)虛引用獲取對(duì)象實(shí)例,僅在對(duì)象被回收時(shí)收到一個(gè)通知(需配合ReferenceQueue使用),主要用于管理堆外內(nèi)存(如DirectByteBuffer通過(guò)虛引用觸發(fā)Cleaner回收直接內(nèi)存)。垃圾收集算法有哪些?各自的優(yōu)缺點(diǎn)和適用場(chǎng)景是什么?標(biāo)記-清除(Mark-Sweep):先標(biāo)記可回收對(duì)象,再統(tǒng)一清除。優(yōu)點(diǎn)是無(wú)需移動(dòng)對(duì)象,實(shí)現(xiàn)簡(jiǎn)單;缺點(diǎn)是會(huì)產(chǎn)生內(nèi)存碎片(若碎片過(guò)大無(wú)法分配連續(xù)內(nèi)存時(shí)觸發(fā)FullGC),適用于老年代(對(duì)象存活率高,復(fù)制算法效率低)。標(biāo)記-復(fù)制(Mark-Copy):將內(nèi)存分為大小相等的兩塊,每次只使用一塊,回收時(shí)將存活對(duì)象復(fù)制到另一塊,然后清空當(dāng)前塊。優(yōu)點(diǎn)是無(wú)內(nèi)存碎片,效率高;缺點(diǎn)是可用內(nèi)存減半,適用于年輕代(對(duì)象存活率低,復(fù)制成本小,如Eden區(qū)+兩個(gè)Survivor區(qū)采用8:1:1的分配策略,實(shí)際可用內(nèi)存為Eden+1個(gè)Survivor)。標(biāo)記-整理(Mark-Compact):標(biāo)記存活對(duì)象后,將其向內(nèi)存一端移動(dòng),然后清理邊界外的內(nèi)存。優(yōu)點(diǎn)是無(wú)碎片,內(nèi)存連續(xù);缺點(diǎn)是需移動(dòng)對(duì)象,效率低于復(fù)制算法,適用于老年代(對(duì)象存活率高,移動(dòng)次數(shù)相對(duì)較少)。常見(jiàn)的垃圾收集器有哪些?各自的特點(diǎn)和適用場(chǎng)景是什么?Serial收集器:?jiǎn)尉€(xiàn)程收集,年輕代采用復(fù)制算法,老年代采用標(biāo)記-整理。優(yōu)點(diǎn)是簡(jiǎn)單高效(無(wú)線(xiàn)程切換開(kāi)銷(xiāo)),適用于客戶(hù)端模式或單核環(huán)境。ParNew收集器:Serial的多線(xiàn)程版本,年輕代復(fù)制算法,與CMS配合使用(JDK9前CMS的唯一搭檔),適用于多核服務(wù)器環(huán)境。ParallelScavenge收集器:年輕代多線(xiàn)程復(fù)制算法,老年代ParallelOld(標(biāo)記-整理),目標(biāo)是控制吞吐量(吞吐量=運(yùn)行用戶(hù)代碼時(shí)間/(用戶(hù)代碼時(shí)間+GC時(shí)間)),適用于對(duì)吞吐量要求高的場(chǎng)景(如批量處理任務(wù))。CMS(ConcurrentMarkSweep)收集器:老年代標(biāo)記-清除算法,目標(biāo)是降低停頓時(shí)間,分為初始標(biāo)記(STW,標(biāo)記GCRoots直接關(guān)聯(lián)對(duì)象)、并發(fā)標(biāo)記(與用戶(hù)線(xiàn)程并發(fā),遍歷引用鏈)、重新標(biāo)記(STW,修正并發(fā)標(biāo)記期間變動(dòng)的對(duì)象)、并發(fā)清除(與用戶(hù)線(xiàn)程并發(fā))。優(yōu)點(diǎn)是低停頓;缺點(diǎn)是對(duì)CPU敏感(并發(fā)階段占用CPU資源)、無(wú)法處理浮動(dòng)垃圾(并發(fā)清除時(shí)新產(chǎn)生的垃圾需下次收集)、標(biāo)記-清除導(dǎo)致內(nèi)存碎片(可能觸發(fā)FullGC),適用于對(duì)響應(yīng)時(shí)間敏感的場(chǎng)景(如Web服務(wù)器)。G1(Garbage-First)收集器:JDK9默認(rèn)收集器,將堆劃分為多個(gè)大小相等的Region(動(dòng)態(tài)調(diào)整),部分Region作為Eden、Survivor、Old區(qū),還有Humongous區(qū)(存儲(chǔ)大對(duì)象,超過(guò)Region的50%)。采用標(biāo)記-整理+復(fù)制算法,通過(guò)維護(hù)每個(gè)Region的回收價(jià)值(回收空間/時(shí)間),優(yōu)先回收價(jià)值高的Region(Garbage-First)。支持停頓時(shí)間預(yù)測(cè)(-XX:MaxGCPauseMillis),適用于大內(nèi)存、低延遲場(chǎng)景(堆內(nèi)存8GB以上)。ZGC收集器:JDK11引入的低延遲收集器,基于Region劃分(動(dòng)態(tài)大?。?,使用顏色指針(ColorPointers,標(biāo)記對(duì)象地址的不同狀態(tài))和讀屏障(LoadBarrier,在讀取對(duì)象引用時(shí)修正指針),實(shí)現(xiàn)并發(fā)的標(biāo)記、轉(zhuǎn)移、重定位。停頓時(shí)間控制在10ms以?xún)?nèi),支持TB級(jí)堆內(nèi)存,適用于對(duì)延遲要求極高的場(chǎng)景(如金融交易系統(tǒng))。類(lèi)加載的過(guò)程分為哪幾個(gè)階段?各階段的具體任務(wù)是什么?類(lèi)加載過(guò)程包括加載、驗(yàn)證、準(zhǔn)備、解析、初始化五個(gè)階段。加載:通過(guò)類(lèi)加載器獲取類(lèi)的二進(jìn)制字節(jié)流(如.class文件、網(wǎng)絡(luò)、動(dòng)態(tài)提供),將字節(jié)流轉(zhuǎn)換為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu),在堆中提供Class對(duì)象作為訪(fǎng)問(wèn)入口。驗(yàn)證:確保字節(jié)流符合JVM規(guī)范,防止惡意代碼。包括文件格式驗(yàn)證(如魔數(shù)0xCAFEBABE)、元數(shù)據(jù)驗(yàn)證(語(yǔ)義檢查,如父類(lèi)是否合法)、字節(jié)碼驗(yàn)證(操作數(shù)棧類(lèi)型匹配)、符號(hào)引用驗(yàn)證(引用的類(lèi)、方法是否存在)。準(zhǔn)備:為類(lèi)變量(static修飾)分配內(nèi)存并設(shè)置初始值(如int的0,boolean的false),實(shí)例變量在此階段不處理(在對(duì)象實(shí)例化時(shí)分配)。若類(lèi)變量被final修飾且編譯時(shí)已確定值(如staticfinalintA=123),則準(zhǔn)備階段直接賦值為123(而非初始值0)。解析:將常量池中的符號(hào)引用替換為直接引用(內(nèi)存地址)。符號(hào)引用是一組符號(hào)描述目標(biāo)(如全類(lèi)名),直接引用是指向目標(biāo)的指針或句柄。解析可能發(fā)生在初始化之后(動(dòng)態(tài)綁定,如接口方法)。初始化:執(zhí)行類(lèi)構(gòu)造器<clinit>()方法(由編譯器自動(dòng)收集類(lèi)變量賦值和靜態(tài)代碼塊的順序提供)。<clinit>()是線(xiàn)程安全的,多個(gè)線(xiàn)程初始化同一類(lèi)時(shí)會(huì)加鎖,保證只執(zhí)行一次。初始化觸發(fā)條件包括:new對(duì)象、訪(fǎng)問(wèn)類(lèi)靜態(tài)變量/方法(final常量除外)、反射調(diào)用、主類(lèi)啟動(dòng)(包含main方法的類(lèi))。雙親委派模型的工作原理是什么?有什么優(yōu)勢(shì)?哪些場(chǎng)景會(huì)破壞該模型?雙親委派模型中,類(lèi)加載器收到類(lèi)加載請(qǐng)求時(shí),先委托給父類(lèi)加載器(非繼承關(guān)系,是組合關(guān)系),父類(lèi)加載器繼續(xù)向上委托,直到啟動(dòng)類(lèi)加載器(BootstrapClassLoader)。若父類(lèi)加載器無(wú)法加載(未找到.class文件),則由當(dāng)前類(lèi)加載器嘗試加載。優(yōu)勢(shì):①避免重復(fù)加載(同一類(lèi)由同一加載器加載);②保證安全(核心類(lèi)如java.lang.String由啟動(dòng)類(lèi)加載器加載,防止用戶(hù)自定義同名類(lèi)覆蓋)。破壞雙親委派的場(chǎng)景:①JDK1.2前無(wú)該模型,用戶(hù)自定義類(lèi)加載器需重寫(xiě)loadClass()方法;②線(xiàn)程上下文類(lèi)加載器(ThreadContextClassLoader),如JDBC驅(qū)動(dòng)(接口在rt.jar由啟動(dòng)類(lèi)加載器加載,實(shí)現(xiàn)類(lèi)由應(yīng)用類(lèi)加載器加載,需通過(guò)上下文類(lèi)加載器反向委托);③熱部署/熱替換(如OSGi,每個(gè)Bundle有獨(dú)立的類(lèi)加載器,可自定義類(lèi)加載邏輯);④動(dòng)態(tài)字節(jié)碼提供(如CGLIB、ASM動(dòng)態(tài)提供類(lèi),需繞過(guò)父類(lèi)加載器直接加載)。如何實(shí)現(xiàn)一個(gè)自定義類(lèi)加載器?需要注意哪些問(wèn)題?自定義類(lèi)加載器需繼承ClassLoader,重寫(xiě)findClass()方法(推薦,避免破壞雙親委派;若重寫(xiě)loadClass()需自行實(shí)現(xiàn)委派邏輯)。步驟:①讀取.class文件的字節(jié)流(如從網(wǎng)絡(luò)、加密文件讀?。虎谡{(diào)用defineClass()方法將字節(jié)流轉(zhuǎn)換為Class對(duì)象。注意事項(xiàng):①遵循雙親委派(除非明確需要破壞,如隔離加載);②處理類(lèi)的命名空間(同一類(lèi)加載器加載的類(lèi)才會(huì)被視為同一類(lèi)型);③處理字節(jié)碼加密(如加載前解密);④避免內(nèi)存泄漏(類(lèi)加載器持有類(lèi)的引用,若長(zhǎng)期存活可能導(dǎo)致類(lèi)無(wú)法卸載)。JVM中對(duì)象的創(chuàng)建過(guò)程是怎樣的?對(duì)象創(chuàng)建分為以下步驟:①類(lèi)加載檢查:當(dāng)遇到new指令時(shí),檢查常量池是否有該類(lèi)的符號(hào)引用,若未加載則執(zhí)行類(lèi)加載過(guò)程;②分配內(nèi)存:根據(jù)堆是否規(guī)整(由垃圾收集器是否使用壓縮決定),使用指針碰撞(規(guī)整時(shí),維護(hù)一個(gè)分界指針,分配時(shí)移動(dòng)指針)或空閑列表(不規(guī)整時(shí),維護(hù)可用內(nèi)存列表,查找足夠空間分配)。分配內(nèi)存時(shí)需考慮線(xiàn)程安全(CAS+失敗重試,或TLAB-線(xiàn)程本地分配緩沖區(qū),線(xiàn)程先在自己的TLAB分配,滿(mǎn)了再CAS分配);③初始化零值:為對(duì)象實(shí)例變量分配初始值(如int為0,對(duì)象引用為null);④設(shè)置對(duì)象頭:包括MarkWord(存儲(chǔ)哈希碼、GC分代年齡、鎖狀態(tài)等)、類(lèi)型指針(指向類(lèi)元數(shù)據(jù),確定對(duì)象類(lèi)型),若為數(shù)組還需記錄數(shù)組長(zhǎng)度;⑤執(zhí)行init方法:調(diào)用構(gòu)造函數(shù),完成實(shí)例變量的顯式賦值和構(gòu)造代碼塊的執(zhí)行。對(duì)象的內(nèi)存布局是怎樣的?對(duì)象在堆中的內(nèi)存分為三部分:①對(duì)象頭(Header):包含MarkWord(占8字節(jié)/64位,存儲(chǔ)運(yùn)行時(shí)數(shù)據(jù)如哈希碼(31位)、GC分代年齡(4位)、鎖狀態(tài)標(biāo)志(2位)、偏向線(xiàn)程ID(54位,偏向鎖時(shí))等)和類(lèi)型指針(KlassPointer,占4字節(jié)/32位或8字節(jié)/64位,開(kāi)啟指針壓縮時(shí)為4字節(jié),指向類(lèi)元數(shù)據(jù))。數(shù)組對(duì)象的對(duì)象頭還包括數(shù)組長(zhǎng)度(4字節(jié));②實(shí)例數(shù)據(jù)(InstanceData):存儲(chǔ)對(duì)象的字段數(shù)據(jù),包括父類(lèi)繼承的和子類(lèi)定義的,按類(lèi)型排列(long/double→int/short→char/byte→boolean→對(duì)象引用),相同寬度的字段會(huì)被緊湊排列;③對(duì)齊填充(Padding):JVM要求對(duì)象大小為8字節(jié)的整數(shù)倍,若前兩部分總大小不足則填充,保證內(nèi)存對(duì)齊(提高訪(fǎng)問(wèn)效率)。什么是指針壓縮?為什么需要指針壓縮?指針壓縮(PointerCompression)是JVM通過(guò)優(yōu)化對(duì)象指針存儲(chǔ)方式來(lái)減少內(nèi)存占用的技術(shù)(JDK6開(kāi)始支持,-XX:+UseCompressedOops,Oops=OrdinaryObjectPointers)。64位JVM中,對(duì)象指針默認(rèn)占8字節(jié),通過(guò)壓縮可將其變?yōu)?字節(jié)(支持堆內(nèi)存最大32GB,因4字節(jié)可表示4GB×8=32GB)。需要指針壓縮的原因:①減少內(nèi)存占用(對(duì)象頭從16字節(jié)→12字節(jié),數(shù)組對(duì)象頭從24字節(jié)→16字節(jié));②降低內(nèi)存帶寬消耗(指針更小,傳輸更快);③減少GC壓力(對(duì)象更小,堆中可容納更多對(duì)象,GC頻率降低)。注意:若堆內(nèi)存超過(guò)32GB,指針壓縮自動(dòng)失效(-XX:+UseCompressedOops無(wú)效),需使用-XX:+UseCompressedClassPointers單獨(dú)壓縮類(lèi)指針(默認(rèn)開(kāi)啟)。棧幀的結(jié)構(gòu)包括哪些部分?各部分的作用是什么?棧幀是虛擬機(jī)棧中支持方法調(diào)用和執(zhí)行的基本單位,每個(gè)方法調(diào)用對(duì)應(yīng)一個(gè)棧幀入棧,方法返回(正?;虍惓#r(shí)出棧。棧幀結(jié)構(gòu)包括:①局部變量表(LocalVariableTable):存儲(chǔ)方法參數(shù)和局部變量,以槽(Slot)為單位(32位類(lèi)型占1槽,64位類(lèi)型如long/double占2槽),索引從0開(kāi)始(0號(hào)槽為實(shí)例方法的this引用)。局部變量表的大小在編譯時(shí)確定(由max_locals屬性指定);②操作數(shù)棧(OperandStack):方法執(zhí)行時(shí)的計(jì)算區(qū)域,用于存儲(chǔ)操作數(shù)和中間結(jié)果(如算術(shù)運(yùn)算、對(duì)象調(diào)用)。操作數(shù)棧的深度編譯時(shí)確定(max_stack屬性),壓棧/出棧操作由字節(jié)碼指令完成(如iconst_1壓入int1,iadd彈出兩個(gè)int相加后壓入結(jié)果);③動(dòng)態(tài)鏈接(DynamicLinking):指向運(yùn)行時(shí)常量池中該棧幀所屬方法的符號(hào)引用,用于方法調(diào)用時(shí)的動(dòng)態(tài)解析(將符號(hào)引用轉(zhuǎn)換為直接引用);④方法返回地址(ReturnAddress):記錄方法正常返回后PC計(jì)數(shù)器的值(調(diào)用該方法的指令的下一條指令地址),或異常返回時(shí)的異常處理表信息(用于跳轉(zhuǎn)到異常處理代碼)。什么是直接內(nèi)存?為什么會(huì)發(fā)生直接內(nèi)存OOM?直接內(nèi)存(DirectMemory)不屬于JVM內(nèi)存區(qū)域,而是通過(guò)Native函數(shù)調(diào)用分配的堆外內(nèi)存(如NIO的ByteBuffer.allocateDirect())。直接內(nèi)存的分配和回收由Unsafe類(lèi)或Cleaner(虛引用觸發(fā))完成,不受JVM堆大小限制,但受本地內(nèi)存總量限制。發(fā)生直接內(nèi)存OOM的原因:①程序大量分配直接內(nèi)存且未及時(shí)回收(如忘記調(diào)用ByteBuffer的clean()方法,或Cleaner線(xiàn)程未及時(shí)執(zhí)行);②JVM堆內(nèi)存設(shè)置過(guò)大,導(dǎo)致本地內(nèi)存剩余不足(如-Xmx設(shè)置過(guò)大,本地內(nèi)存被JVM堆占用,直接內(nèi)存無(wú)法分配);③操作系統(tǒng)對(duì)進(jìn)程的內(nèi)存限制(如ulimit-v限制進(jìn)程總內(nèi)存)。直接內(nèi)存OOM的異常信息通常為“OutOfMemoryError:Directbuffermemory”。JIT編譯是什么?C1和C2編譯器有什么區(qū)別?JIT(Just-In-Time)編譯是JVM將熱點(diǎn)字節(jié)碼(頻繁執(zhí)行的方法或代碼塊)編譯為本地機(jī)器碼的技術(shù),以提高執(zhí)行效率。JVM通過(guò)計(jì)數(shù)器(方法調(diào)用次數(shù)、回邊次數(shù))識(shí)別熱點(diǎn)代碼,觸發(fā)JIT編譯。HotSpot虛擬機(jī)有C1(ClientCompiler)和C2(ServerCompiler)兩種編譯器,JDK7開(kāi)始支持分層編譯(-XX:+TieredCompilation,混合使用C1和C2)。C1:輕量級(jí)編譯器,編譯速度快,優(yōu)化策略較簡(jiǎn)單(如方法內(nèi)聯(lián)、去虛擬化、冗余消除),適用于對(duì)啟動(dòng)速度敏感的客戶(hù)端場(chǎng)景(如GUI程序)。C2:重量級(jí)編譯器,編譯速度慢,優(yōu)化更復(fù)雜(如全局優(yōu)化、循環(huán)展開(kāi)、分支預(yù)測(cè)、內(nèi)聯(lián)擴(kuò)展),提供的機(jī)器碼執(zhí)行效率更高,適用于長(zhǎng)期運(yùn)行的服務(wù)器場(chǎng)景(如Web應(yīng)用)。分層編譯中,熱點(diǎn)代碼先由C1編譯(快速獲得性能提升),若熱度持續(xù)增加則由C2重新編譯(獲得更高性能)。如何分析GC日志?關(guān)鍵指標(biāo)有哪些?GC日志記錄了GC的時(shí)間、類(lèi)型、停頓時(shí)間、內(nèi)存變化等信息,分析步驟:①確定GC類(lèi)型(年輕代GC/MinorGC,老年代GC/MajorGC,F(xiàn)ullGC);②查看停頓時(shí)間(STW時(shí)間),關(guān)注是否超過(guò)業(yè)務(wù)容忍范圍(如要求響應(yīng)時(shí)間<100ms,GC停頓需<50ms);③分析內(nèi)存變化(年輕代Eden區(qū)、Survivor區(qū),老年代的使用量和回收量),判斷是否存在內(nèi)存泄漏(老年代持續(xù)增長(zhǎng))或?qū)ο筮^(guò)早晉升(Survivor區(qū)未填滿(mǎn)但對(duì)象進(jìn)入老年代);④計(jì)算吞吐量(用戶(hù)代碼執(zhí)行時(shí)間/(用戶(hù)時(shí)間+GC時(shí)間)),評(píng)估是否滿(mǎn)足性能要求。關(guān)鍵指標(biāo):①GC頻率(單位時(shí)間內(nèi)GC次數(shù));②GC耗時(shí)(每次GC的停頓時(shí)間);③內(nèi)存占用(各代的使用峰值);④晉升率(年輕代存活對(duì)象進(jìn)入老年代的比例);⑤分配速率(單位時(shí)間內(nèi)年輕代分配的內(nèi)存量)。例如,日志“[GC(AllocationFailure)[PSYoungGen:5120K->512K(7680K)]5120K->4608K(12288K),0.0012345secs]”表示MinorGC(PSYoungGen),因Eden區(qū)分配失敗觸發(fā),年輕代從5120K回收至512K(總空間7680K),堆總使用從5120K降至4608K(總堆12288K),耗時(shí)約1.2ms。JVM調(diào)優(yōu)的常用參數(shù)有哪些?如何根據(jù)業(yè)務(wù)場(chǎng)景選擇?常用參數(shù)包括:內(nèi)存大?。?Xms(堆初始大小)、-Xmx(堆最大大?。?、-Xmn(年輕代大小,或-XX:NewRatio=老年代/年輕代比例);年輕代配置:-XX:SurvivorRatio=Eden/Survivor比例(默認(rèn)8,即Eden:Survivor1:Survivor2=8:1:1)、-XX:MaxTenuringThreshold=對(duì)象晉升老年代的最大年齡(默認(rèn)15,CMS默認(rèn)6);方法區(qū):-XX:MetaspaceSize(元空間初始觸發(fā)GC的大小)、-XX:MaxMetaspaceSize(元空間最大大小,默認(rèn)無(wú)限制);垃圾收集器:-XX:+UseSerialGC(Serial+SerialOld)、-XX:+UseParallelGC(ParallelScavenge+ParallelOld)、-XX:+UseConcMarkSweepGC(ParNew+CMS+SerialOld)、-XX:+UseG1GC(G1);停頓控制:-XX:MaxGCPauseMillis(G1目標(biāo)停頓時(shí)間,默認(rèn)200ms)、-XX:GCTimeRatio(吞吐量比率,默認(rèn)99,即GC時(shí)間占1%);調(diào)試:-XX:+PrintGCDetails(打印GC詳情)、-XX:+HeapDumpOnOutOfMemoryError(OOM時(shí)提供堆轉(zhuǎn)儲(chǔ)文件)、-Xloggc:path(指定GC日志路徑)。根據(jù)業(yè)務(wù)場(chǎng)景選擇:①高吞吐量場(chǎng)景(如批量計(jì)算):選擇ParallelScavenge+ParallelOld,設(shè)置較大的堆和-XX:GCTimeRatio;②低延遲場(chǎng)景(如Web服務(wù)):選擇G1或ZGC,設(shè)置-XX:MaxGCPauseMillis=50ms,調(diào)整年輕代大小避免頻繁MinorGC;③內(nèi)存有限場(chǎng)景(如嵌入式系統(tǒng)):選擇Serial收集器,減少內(nèi)存占用;④大內(nèi)存場(chǎng)景(>16GB):選擇G1或ZGC,利用分區(qū)和并發(fā)收集降低停頓。如何排查OOM異常?常見(jiàn)原因和解決方法是什么?排查步驟:①獲取OOM時(shí)的堆轉(zhuǎn)儲(chǔ)文件(通過(guò)-XX:+HeapDumpOnOutOfMemoryError或jmap-dump:format=b,file=heap.bin<pid>);②使用工具分析(如EclipseMAT、JProfiler、VisualVM),查看大對(duì)象列表(Histogram)、對(duì)象引用鏈(DominatorTree);③結(jié)合GC日志,判斷是內(nèi)存泄漏(對(duì)象無(wú)法被回收)還是內(nèi)存溢出(對(duì)象確實(shí)需要這么多內(nèi)存)。常見(jiàn)原因及解決:①內(nèi)存泄漏:對(duì)象被長(zhǎng)生命周期的容器引用(如靜態(tài)Map未清理),解決方法是檢查引用鏈,使用弱引用或及時(shí)移除不再使用的對(duì)象;②大對(duì)象分配:一次性分配過(guò)多內(nèi)存(如大數(shù)組、大集合),解決方法是拆分對(duì)象、優(yōu)化數(shù)據(jù)結(jié)構(gòu)(如用數(shù)組代替List)、增加堆內(nèi)存(-Xmx);③線(xiàn)程過(guò)多:每個(gè)線(xiàn)程的??臻g(-Xss)導(dǎo)致總內(nèi)存超過(guò)限制,解決方法是減少線(xiàn)程數(shù)或降低棧大?。虎茉臻g不足:加載過(guò)多類(lèi)(如動(dòng)態(tài)代理、OSGi),解決方法是設(shè)置-XX:MaxMetaspaceSize=512m,或檢查是否重復(fù)加載類(lèi);⑤直接內(nèi)存不足:NIO程序未釋放DirectByteBuffer,解決方法是調(diào)用clean()方法或限制直接內(nèi)存大?。?XX:MaxDirectMemorySize=512m)。CMS收集器的“ConcurrentModeFailure”是如何發(fā)生的?如何避免?“ConcurrentModeFailure”指CMS在并發(fā)標(biāo)記階段,老年代剩余空間不足以容納年輕代晉升的對(duì)象,導(dǎo)致CMS無(wú)法繼續(xù)并發(fā)收集,臨時(shí)啟用SerialOld收集器進(jìn)行STW的FullGC,嚴(yán)重影響性能。發(fā)生原因:①老年代空間不足(晉升的對(duì)象大小超過(guò)老年代剩余空間);②并發(fā)標(biāo)記階段用戶(hù)線(xiàn)程分配對(duì)象過(guò)快(浮動(dòng)垃圾增加,老年代空間被快速占用);③CMS的觸發(fā)閾值設(shè)置過(guò)低(-XX:CMSInitiatingOccupancyFraction,默認(rèn)68%,即老年代使用68%時(shí)觸發(fā)CMS)。避免方法:①增大老年代空間(-Xmx或-XX:New
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 司機(jī)禮儀考試試題及答案
- 成都雙流輔警面試題庫(kù)及答案
- 行測(cè)常識(shí)判斷真題參考答案
- 靈壽縣公共基礎(chǔ)輔警考試筆試題庫(kù)及答案
- 臨床護(hù)理帶教試題及答案
- 煤礦職工安全知識(shí)競(jìng)賽試題含答案
- UI設(shè)計(jì)師面試題集錦與答案
- 教師能力水平測(cè)試題湖北及答案
- 醫(yī)院職能崗考試題及答案
- 20263D模型師校招試題及答案
- 2026屆高考語(yǔ)文專(zhuān)題復(fù)習(xí)-哲理詩(shī)
- (二調(diào))武漢市2025屆高中畢業(yè)生二月調(diào)研考試 生物試卷(含標(biāo)準(zhǔn)答案)
- 2024-2025學(xué)年天津市和平區(qū)高三上學(xué)期1月期末英語(yǔ)試題(解析版)
- 管理人員應(yīng)懂財(cái)務(wù)知識(shí)
- ISO9001-2015質(zhì)量管理體系版標(biāo)準(zhǔn)
- 翻建房屋四鄰協(xié)議書(shū)范本
- 打樁承包合同
- 輸煤棧橋彩鋼板更換施工方案
- 農(nóng)田水利施工安全事故應(yīng)急預(yù)案
- 某電廠(chǎng)380v開(kāi)關(guān)柜改造電氣施工方案
- 江西省景德鎮(zhèn)市2024-2025學(xué)年七年級(jí)上學(xué)期期中地理試卷(含答案)
評(píng)論
0/150
提交評(píng)論