2025年高頻阿里jvm面試題及答案_第1頁
2025年高頻阿里jvm面試題及答案_第2頁
2025年高頻阿里jvm面試題及答案_第3頁
2025年高頻阿里jvm面試題及答案_第4頁
2025年高頻阿里jvm面試題及答案_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

2025年高頻阿里jvm面試題及答案Java內(nèi)存區(qū)域中堆和棧的核心區(qū)別是什么?實際生產(chǎn)中如何通過日志快速定位堆溢出問題?堆是JVM管理的最大一塊內(nèi)存區(qū)域,所有對象實例和數(shù)組在此分配,屬于線程共享區(qū)域,主要用于存儲對象的實例數(shù)據(jù)和對象頭信息。棧包括虛擬機棧和本地方法棧,虛擬機棧為Java方法服務(wù),每個方法執(zhí)行時創(chuàng)建棧幀(存儲局部變量表、操作數(shù)棧、動態(tài)鏈接、方法出口等),屬于線程私有;本地方法棧為本地方法服務(wù),HotSpot中二者合并實現(xiàn)。核心區(qū)別體現(xiàn)在:線程共享性(堆共享/棧私有)、存儲內(nèi)容(堆存對象/棧存棧幀)、生命周期(堆隨JVM進程存在/棧隨線程存在)、異常類型(堆可能OOM/??赡躍OE或OOM)。生產(chǎn)中定位堆溢出:首先通過-XX:+HeapDumpOnOutOfMemoryError參數(shù)配置JVM在OOM時自動提供堆轉(zhuǎn)儲文件(.hprof),結(jié)合-XX:HeapDumpPath指定存儲路徑。然后使用EclipseMAT或JProfiler分析堆dump,重點關(guān)注Histogram視圖(類實例數(shù)量)、DominatorTree(對象占用內(nèi)存占比),查找是否存在大量未被回收的對象實例(如緩存未設(shè)置過期策略、集合類未正確釋放引用)。同時檢查GC日志(通過-XX:+PrintGCDetails-Xloggc:gc.log開啟),觀察FullGC頻率和老年代使用率,若老年代持續(xù)接近閾值且FullGC后無明顯釋放,可確認對象無法被回收導(dǎo)致堆溢出。JDK8及以上版本元空間(Metaspace)與永久代(PermGen)的本質(zhì)差異是什么?元空間溢出的典型原因有哪些?永久代是JDK7及之前的方法區(qū)實現(xiàn),物理上屬于堆的一部分(受-XX:MaxPermSize限制),存儲類元數(shù)據(jù)、常量池、靜態(tài)變量等。元空間是JDK8后方法區(qū)的實現(xiàn),物理上使用本地內(nèi)存(不受堆大小限制,默認僅受系統(tǒng)內(nèi)存限制),存儲類元數(shù)據(jù)(Klass、Method、Field等)、運行時常量池(移至堆)、靜態(tài)變量(移至堆)。本質(zhì)差異:1.內(nèi)存來源:永久代來自JVM堆,元空間來自本地內(nèi)存;2.內(nèi)存限制:永久代受MaxPermSize限制易溢出,元空間默認無固定上限(可通過-XX:MaxMetaspaceSize限制);3.垃圾回收:永久代GC需掃描堆,元空間GC直接回收不再使用的類元數(shù)據(jù)(依賴類加載器的可達性)。元空間溢出的典型原因:1.動態(tài)類加載(如Spring動態(tài)代理、OSGi模塊化、大量JSP編譯提供類)未及時卸載;2.第三方庫(如CGLIB、反射API)頻繁提供類導(dǎo)致元空間占用激增;3.MaxMetaspaceSize設(shè)置過?。ㄈ缟a(chǎn)環(huán)境誤設(shè)為256M,而實際需要更大空間);4.類加載器泄漏(如Web容器中未正確銷毀的ClassLoader未被GC回收,導(dǎo)致其加載的類元數(shù)據(jù)無法釋放)。G1收集器相比CMS的核心改進有哪些?生產(chǎn)環(huán)境中如何通過參數(shù)優(yōu)化G1的停頓時間?G1(Garbage-First)是面向服務(wù)器端的低延遲收集器,目標是在大內(nèi)存(4GB-64GB)場景下實現(xiàn)高吞吐量與可預(yù)測的停頓時間。相比CMS(ConcurrentMarkSweep)的改進:1.內(nèi)存劃分:CMS基于分代(年輕代/老年代),G1將堆劃分為多個大小相等的Region(通常2MB-32MB),每個Region動態(tài)屬于Eden、Survivor、Old或Humongous(存儲大于Region50%的大對象);2.回收策略:CMS優(yōu)先收集老年代,G1基于“停頓預(yù)測模型”,每次收集選擇收益最大(回收內(nèi)存最多)的Region集合(CSet),優(yōu)先處理垃圾占比高的Region(Garbage-First);3.并發(fā)標記:CMS采用“標記-清除”易產(chǎn)生碎片,G1在標記后對存活對象進行復(fù)制(類似復(fù)制算法),減少內(nèi)存碎片;4.大對象處理:CMS中大于老年代剩余空間的對象直接觸發(fā)FullGC,G1通過HumongousRegion存儲大對象(若超過單個Region,使用連續(xù)多個HumongousRegion),避免大對象分配對GC的影響。生產(chǎn)環(huán)境優(yōu)化G1停頓時間的參數(shù):1.-XX:MaxGCPauseMillis=200(默認200ms,設(shè)置目標停頓時間,G1會調(diào)整Region數(shù)量和回收次數(shù));2.-XX:G1HeapRegionSize(設(shè)置Region大小,通常為堆大小的1/2048,如堆8GB則設(shè)為4MB);3.-XX:G1MixedGCCountTarget=8(限制每次混合回收中OldRegion的數(shù)量,避免單次回收過多導(dǎo)致停頓延長);4.-XX:InitiatingHeapOccupancyPercent=45(默認45%,當(dāng)老年代占用率達此閾值時觸發(fā)并發(fā)標記,避免老年代填滿后觸發(fā)FullGC);5.-XX:G1ReservePercent=10(保留內(nèi)存占比,防止晉升失敗導(dǎo)致的FullGC,大內(nèi)存場景可適當(dāng)調(diào)大)。如何通過可達性分析判斷對象是否存活?GCRoots包含哪些關(guān)鍵類型?弱引用在緩存設(shè)計中的實際應(yīng)用場景是什么?可達性分析通過從GCRoots出發(fā),遍歷所有可達的對象(引用鏈),未被遍歷到的對象標記為可回收。GCRoots包括:1.虛擬機棧(棧幀中的局部變量表)中引用的對象(如方法參數(shù)、局部變量);2.方法區(qū)中類靜態(tài)屬性引用的對象(如static變量);3.方法區(qū)中常量引用的對象(如String常量池中的引用);4.本地方法棧中JNI(本地方法)引用的對象;5.所有被同步鎖(synchronized)持有的對象;6.JVM內(nèi)部的引用(如基本數(shù)據(jù)類型的Class對象、系統(tǒng)類加載器等)。弱引用(WeakReference)在緩存設(shè)計中用于實現(xiàn)內(nèi)存敏感的緩存,當(dāng)內(nèi)存不足時緩存對象可被GC回收,避免OOM。例如:1.圖片緩存:移動應(yīng)用中加載大量圖片,使用WeakHashMap存儲圖片緩存(鍵為圖片URL,值為WeakReference<Bitmap>),當(dāng)內(nèi)存緊張時未被強引用的Bitmap會被回收;2.工具類緩存:如Spring的AbstractCachingConfiguration中,對緩存的Bean使用弱引用,避免緩存持有對象導(dǎo)致無法GC;3.動態(tài)代理緩存:某些框架對代理對象的緩存使用弱引用,防止代理對象無法被卸載時導(dǎo)致的內(nèi)存泄漏。需注意弱引用對象在下次GC時即會被回收(無論內(nèi)存是否足夠),因此需結(jié)合ReferenceQueue監(jiān)控被回收的對象,及時清理緩存中的無效條目。ZGC相比G1在并發(fā)標記和內(nèi)存回收上的核心技術(shù)突破是什么?適用于哪些業(yè)務(wù)場景?ZGC是JDK11引入的可擴展低延遲收集器,目標是在任意堆大?。?MB-16TB)下實現(xiàn)停頓時間不超過10ms。核心技術(shù)突破:1.顏色指針(ColoredPointers):將64位指針的高4位用于存儲標記信息(Marked0、Marked1、Remapped、Finalizable),無需在對象頭中存儲標記位,減少內(nèi)存占用并支持并發(fā)標記;2.讀屏障(LoadBarrier):在訪問對象引用時(如obj.field)插入屏障,根據(jù)顏色指針的狀態(tài)動態(tài)調(diào)整引用(如重映射階段更新指針指向新地址),實現(xiàn)并發(fā)的內(nèi)存重分配(Relocation);3.并發(fā)處理:標記、轉(zhuǎn)移(Relocate)、重映射(Remap)均與用戶線程并發(fā)執(zhí)行,僅初始標記和最終標記需要STW(停頓時間與根集合大小相關(guān),與堆大小無關(guān));4.內(nèi)存布局:使用分頁(Page)管理內(nèi)存(小頁2MB、中頁32MB、大頁256MB),支持更細粒度的內(nèi)存回收。ZGC適用于以下場景:1.大內(nèi)存場景(如堆大小16GB-16TB),如分布式數(shù)據(jù)庫(Redis、TiDB)、實時數(shù)據(jù)處理(Flink、Spark);2.低延遲要求的業(yè)務(wù)(如金融交易系統(tǒng)、高頻API服務(wù)),需保證響應(yīng)時間穩(wěn)定在毫秒級;3.對象生命周期復(fù)雜的應(yīng)用(如長時間運行的服務(wù),對象頻繁創(chuàng)建和晉升),ZGC的并發(fā)處理避免了G1在大堆下可能出現(xiàn)的長時間停頓;4.云原生場景(如K8s容器化應(yīng)用),需動態(tài)調(diào)整內(nèi)存大小,ZGC對堆大小變化的適應(yīng)性更強。類加載的雙親委派模型具體流程是什么?Tomcat是如何打破這一模型實現(xiàn)Web應(yīng)用隔離的?雙親委派模型流程:當(dāng)類加載器(ClassLoader)需要加載類時,首先委托給父類加載器(非繼承關(guān)系,而是組合的“父”引用)加載,父類加載器繼續(xù)向上委托,直到啟動類加載器(BootstrapClassLoader)。若父類加載器無法加載(未找到.class文件),則當(dāng)前類加載器嘗試自己加載。核心原則是“先父后己”,確保類的唯一性(同一類由最高層能加載的類加載器加載)。Tomcat打破雙親委派以支持Web應(yīng)用隔離(不同Web應(yīng)用使用不同類加載器,避免類版本沖突),具體實現(xiàn):1.自定義類加載器:每個Web應(yīng)用使用WebappClassLoader,其父類加載器為CommonClassLoader(共享Tomcat通用類);2.打破順序:WebappClassLoader優(yōu)先加載自己目錄(WEB-INF/classes、WEB-INF/lib)下的類,若未找到再委托父類加載器加載(即“先己后父”);3.隔離機制:不同WebappClassLoader加載的類相互不可見(即使類名相同),避免多個應(yīng)用使用同一類的不同版本時的沖突(如應(yīng)用A用Spring5,應(yīng)用B用Spring4);4.共享類加載:Tomcat的CommonClassLoader、CatalinaClassLoader(Tomcat內(nèi)部類)、SharedClassLoader(應(yīng)用共享類)按層級加載,確保Tomcat核心類和應(yīng)用共享類被正確加載。例如,當(dāng)WebappClassLoader加載User類時,首先檢查自己的緩存,若不存在則在WEB-INF/classes中查找,找到則加載;若未找到再委托父類加載器(CommonClassLoader)加載,避免應(yīng)用覆蓋Tomcat核心類。如何通過JVM參數(shù)組合實現(xiàn)“高吞吐量”與“低延遲”的平衡?生產(chǎn)中如何根據(jù)業(yè)務(wù)類型選擇策略?高吞吐量(Throughput)關(guān)注單位時間內(nèi)完成的任務(wù)量,適合批處理、數(shù)據(jù)計算等對響應(yīng)時間不敏感的業(yè)務(wù);低延遲(LowLatency)關(guān)注單次操作的響應(yīng)時間,適合在線交易、API服務(wù)等對延遲敏感的業(yè)務(wù)。參數(shù)組合平衡需考慮:高吞吐量策略:1.增大堆內(nèi)存(-Xms=-Xmx,避免動態(tài)擴容的開銷);2.選擇吞吐量優(yōu)先的收集器(-XX:+UseParallelGC或-XX:+UseParallelOldGC);3.調(diào)整新生代比例(-XX:NewRatio=2,新生代占1/3,老年代占2/3,減少對象晉升到老年代的頻率);4.設(shè)置最大GC時間占比(-XX:GCTimeRatio=99,GC時間占1%,用戶時間占99%)。低延遲策略:1.選擇G1或ZGC(-XX:+UseG1GC或-XX:+UseZGC);2.設(shè)置目標停頓時間(-XX:MaxGCPauseMillis=50);3.調(diào)整Region大小(G1中-XX:G1HeapRegionSize=4M,平衡Region數(shù)量和大對象處理);4.增大新生代內(nèi)存(-XX:G1NewSizePercent=30,-XX:G1MaxNewSizePercent=50,減少MinorGC頻率);5.開啟并發(fā)標記(ZGC默認并發(fā),G1通過-XX:InitiatingHeapOccupancyPercent=35提前觸發(fā)標記,避免老年代填滿)。生產(chǎn)選擇策略:1.批處理/ETL任務(wù):優(yōu)先高吞吐量,使用Parallel收集器,增大堆內(nèi)存,減少GC次數(shù);2.電商秒殺/支付系統(tǒng):優(yōu)先低延遲,使用G1或ZGC,設(shè)置MaxGCPauseMillis=50-100ms,確保單次請求響應(yīng)時間;3.大數(shù)據(jù)計算(如Spark作業(yè)):混合策略,堆內(nèi)存分配需足夠大(避免頻繁GC),同時設(shè)置合理的GCTimeRatio(如19,GC時間占5%);4.微服務(wù)架構(gòu)(如SpringCloud):各服務(wù)獨立配置,API網(wǎng)關(guān)/前端服務(wù)用低延遲策略,后臺計算服務(wù)用高吞吐量策略。OOM錯誤“Javaheapspace”和“Metaspace”的具體排查步驟有何不同?如何通過Arthas定位堆中的大對象?“Javaheapspace”排查步驟:1.確認堆內(nèi)存是否不足(-Xmx設(shè)置是否過?。?,通過jstat-gcpid1000查看Eden、Old區(qū)使用率及GC次數(shù);2.提供堆dump(jmap-dump:format=b,file=heap.hprofpid或-XX:+HeapDumpOnOutOfMemoryError),用MAT分析Histogram(類實例數(shù))和DominatorTree(對象占用內(nèi)存),查找大對象(如ArrayList存儲大量未釋放的元素)或內(nèi)存泄漏(如靜態(tài)集合未清理);3.檢查代碼邏輯,是否存在循環(huán)中未正確釋放對象、緩存未設(shè)置過期策略(如GuavaCache未設(shè)置expireAfterWrite)等問題?!癕etaspace”排查步驟:1.確認元空間內(nèi)存限制(-XX:MaxMetaspaceSize是否過?。ㄟ^jstat-gcmetacapacitypid查看元空間已用/可用空間;2.提供類加載信息(jcmdpidGC.class_histogram>class.txt),統(tǒng)計各ClassLoader加載的類數(shù)量,查找是否有ClassLoader未被回收(如Web容器中未銷毀的WebappClassLoader);3.檢查動態(tài)類加載代碼(如CGLIB提供代理類、反射調(diào)用提供類),是否存在無限提供類的情況(如循環(huán)中動態(tài)提供類);4.使用Arthas的ognl命令(ognl'@java.lang.ClassLoader@getSystemClassLoader().getLoadedClasses().length')查看已加載類數(shù)量,確認是否異常增長。通過Arthas定位堆中大對象:1.啟動Arthas連接目標進程(arthas-boot.jar);2.使用heapdump命令提供堆dump(heapdump--file/tmp/heap.hprof);3.使用ognl命令遍歷對象(如ognl'list=newjava.util.ArrayList();@java.lang.Thread@currentThread().getStackTrace().each{list.add(it)};list');4.使用dashboard查看實時內(nèi)存占用,觀察哪個類的實例數(shù)異常;5.使用trace命令跟蹤對象創(chuàng)建路徑(tracecom.example.service.UserServicecreateUser'params[0]'),定位大對象的提供位置。JVM中對象的內(nèi)存布局由哪幾部分組成?對象頭(ObjectHeader)包含哪些關(guān)鍵信息?對象內(nèi)存布局分為三部分:對象頭(Header)、實例數(shù)據(jù)(InstanceData)、對齊填充(Padding)。對象頭包含:1.MarkWord(標記字):占32位(32位JVM)或64位(64位JVM),存儲對象運行時數(shù)據(jù)(哈希碼、GC分代年齡、鎖狀態(tài)標志、線程持有的鎖、偏向線程ID、偏向時間戳等)。例如,64位JVM的MarkWord結(jié)構(gòu):25位哈希碼(未計算時為0)+4位分代年齡(最大15,超過則晉升老年代)+1位偏向鎖標志(0非偏向/1偏向)+2位鎖狀態(tài)標志(00輕量級鎖/01無鎖或偏向鎖/10重量級鎖/11GC標記);2.類型指針(KlassPointer):指向?qū)ο蟮念愒獢?shù)據(jù)(Klass對象),JVM通過此指針確定對象類型。64位JVM中若開啟指針壓縮(-XX:+UseCompressedOops,默認開啟),類型指針占32位(壓縮為4字節(jié)),否則占64位;3.數(shù)組長度(僅數(shù)組對象有):若對象是數(shù)組,對象頭還包含數(shù)組長度(占32位),用于區(qū)分普通對象和數(shù)組對象。實例數(shù)據(jù)存儲對象的字段信息(包括父類繼承的字段),按類型(基本類型、引用類型)排列,順序受JVM優(yōu)化(如相同類型字段合并)和@Contended注解(防止偽共享)影響。對齊填充非必須,JVM要求對象起始地址為8字節(jié)的倍數(shù),若對象頭+實例數(shù)據(jù)不足8字節(jié)的倍數(shù),通過填充補全(如總大小12字節(jié)則填充4字節(jié)至16字節(jié))。CMS收集器的“ConcurrentModeFailure”是如何產(chǎn)生的?生產(chǎn)中如何避免該問題?“ConcurrentModeFailure”指CMS在并發(fā)標記階段,老年代空間不足,無法容納新生代晉升的對象或新分配的大對象,導(dǎo)致CMS退化為SerialOld收集器(單線程標記-整理),引發(fā)長時間STW。產(chǎn)生原因:1.并發(fā)標記期間,新生代對象大量晉升到老年代(MinorGC后存活對象超過老年代剩余空間);2.老年代空間碎片過多(CMS采用標記-清除算法),無法分配連續(xù)內(nèi)存給大對象;3.InitiatingHeapOccupancyPercent(IHOP)設(shè)置過大(默認68%),導(dǎo)致并發(fā)標記啟動過晚,老年代在標記完成前已被填滿。避免措施:1.調(diào)整IHOP(-XX:InitiatingHeapOccupancyPercent=70,根據(jù)實際情況降低,如50%,提前啟動并發(fā)標記);2.增大老年代內(nèi)存(-Xmx或-XX:NewRatio=3,減少新生代比例,降低晉升到老年代的對象量);3.開啟增量式并發(fā)收集(-XX:+CMSIncrementalMode,適用于單核CPU,減少并發(fā)階段對CPU的占用,但現(xiàn)代多核CPU不推薦);4.減少大對象分配(優(yōu)化代碼,避免一次性分配大量內(nèi)存,或使用池化技術(shù)復(fù)用對象);5.定期觸發(fā)FullGC(通過-XX:+UseCMSCompactAtFullCollection-XX:CMSFullGCsBeforeCompaction=3,每3次FullGC后進行一次內(nèi)存整理,減少碎片);6.監(jiān)控老年代使用率(通過jstat-gcoldpid1000),若發(fā)現(xiàn)老年代增長過快,調(diào)整GC參數(shù)或優(yōu)化對象生命周期。TLAB(ThreadLocalAllocationBuffer)的作用是什么?多線程環(huán)境下如何優(yōu)化TLAB分配效率?TLAB是線程私有的內(nèi)存分配區(qū)域(屬于Eden區(qū)),每個線程在Eden區(qū)預(yù)先分配一塊小內(nèi)存(默認Eden的1%),線程本地對象直接在此分配,避免多線程競爭Eden區(qū)的全局分配指針(CAS操作),提高分配效率。作用:1.減少內(nèi)存分配的線程競爭(CAS操作的開銷);2.提升緩存利用率(線程本地對象集中存儲,提高CPU緩存命中率);3.降低GC掃描壓力(TLAB內(nèi)對象屬于同一線程,存活狀態(tài)更一致)。多線程優(yōu)化TLAB效率的方法:1.調(diào)整TLAB大?。?XX:TLABSize設(shè)置初始大小,-XX:ResizeTLAB動態(tài)調(diào)整,默認開啟),過小會導(dǎo)致頻繁refill(TLAB空間不足時從Eden區(qū)重新分配),過大會浪費內(nèi)存;2.增大Eden區(qū)內(nèi)存(-Xmn或-XX:NewSize),增加TLAB總空間,減少refill次數(shù);3.減少大對象分配(大對象直接進入老年代,不使用TLAB),避免TLAB被大對象擠占;4.控制線程數(shù)量(過多線程會導(dǎo)致TLAB總占用Eden區(qū)比例過高,剩余空間不足,觸發(fā)頻繁MinorGC);5.開啟TLAB浪費空間限制(-XX:TLABWasteTargetPercent=1,默認1%,限制單個TLAB的浪費空間比例,避免內(nèi)存碎片)。類初始化的觸發(fā)條件有哪些?“static{}”靜態(tài)代碼塊和“instance{}”實例代碼塊的執(zhí)行順序是怎樣的?類初始化(執(zhí)行<clinit>()方法)的觸發(fā)條件(主動引用):1.首次創(chuàng)建類的實例(new、反射、克隆、反序列化);2.調(diào)用類的靜態(tài)方法(invokestatic字節(jié)碼指令);3.訪問類的靜態(tài)變量(getstatic字節(jié)碼指令)或?qū)ζ滟x值(putstatic),除非靜態(tài)變量被final修飾且編譯期已知值(此時視為常量,存入調(diào)用類的常量池);4.反射調(diào)用類的方法(如Class.forName("com.example.Class"));5.初始化子類時,若父類未初始化,先初始化父類;6.JVM啟動時執(zhí)行的主類(包含main方法的類)。靜態(tài)代碼塊(static{})和實例代碼塊(instance{})的執(zhí)行順序:1.類加載的初始化階段執(zhí)行static{},按定義順序執(zhí)行,僅執(zhí)行一次(類首次初始化時);2.創(chuàng)建對象時,執(zhí)行實例代碼塊(instance{}),按定義順序執(zhí)行,每次創(chuàng)建對象時執(zhí)行(在構(gòu)造方法之前);3.繼承場景下:父類static{}→子類static{}→父類instance{}→父類構(gòu)造方法→子類instance{}→子類構(gòu)造方法。例如:classParent{static{System.out.println("Parentstatic");}{System.out.println("Parentinstance");}publicParent(){System.out.println("Parentconstructor");}}classChildextendsParent{static{System.out.println("Childstatic");}{System.out.println("Childinstance");}publicChild(){System.out.println("Childconstructor");}}//首次創(chuàng)建Child實例時輸出順序://Parentstatic→Childstatic→Parentinstance→Parentconstructor→Childinstance→ChildconstructorG1收集器的MixedGC與YoungGC的區(qū)別是什么?如何通過日志判斷MixedGC是否觸發(fā)?YoungGC(年輕代收集):僅收集Eden和Survivor區(qū),使用復(fù)制算法,將存活對象復(fù)制到新的Survivor區(qū)或晉升到老年代。觸發(fā)條件是Eden區(qū)填滿,JVM啟動YoungGC。MixedGC(混合收集):收集年輕代的Eden、Survivor區(qū),以及部分老年代的Region。觸發(fā)條件是并發(fā)標記階段完成后,老年代占用率超過InitiatingHeapOccupancyPercent(默認45%),G1計劃執(zhí)行MixedGC,選擇垃圾占比最高的老年代Region(CSet中的OldRegion)進行回收。MixedGC的目標是在保證停頓時間的前提下,逐步回收老年代的垃圾,避免FullGC。通過日志判斷MixedGC:1.日志中出現(xiàn)“G1MixedGC”關(guān)鍵字;2.收集的Region包含Eden、Survivor和Old類型(如“GC(123)PauseMixed(G1MixedGC)285.0ms”);3.日志中會顯示回收的Region數(shù)量(如“Eden:2048.0M(2048.0M)->0.0B(2048.0M)Survivors:256.0M->512.0MHeap:8192.0M(8192.0M)->6000.0M(8192.0M)”),其中Heap的減少量包含老年代Region的回收;4.并發(fā)標記階段的日志(如“GC(120)ConcurrentMarkCycle”)后緊跟MixedGC日志,說明MixedGC由并發(fā)標記觸發(fā)。JVM中如何實現(xiàn)“StopTheWorld”?安全點(Safepoint)和安全區(qū)域(SafeRegion)的作用是什么?STW指JVM暫停所有用戶線程,僅允許GC線程執(zhí)行。實現(xiàn)方式:JVM向所有線程發(fā)送中斷信號,用戶線程執(zhí)行到安全點時主動掛起(如方法調(diào)用、循環(huán)跳轉(zhuǎn)、異常跳轉(zhuǎn)等指令位置),未運行的線程(如阻塞在IO的線程)進入安全區(qū)域后掛起。安全點是用戶線程可以暫停的位置(JVM預(yù)先選定的指令點),確保在這些位置線程的狀態(tài)是確定的(如棧幀、寄存器狀態(tài)可被GC掃描)。常見安全點包括:1.方法返回前(return指令);2.方法調(diào)用后(in

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論