2025年高頻java開(kāi)發(fā)面試題及答案_第1頁(yè)
2025年高頻java開(kāi)發(fā)面試題及答案_第2頁(yè)
2025年高頻java開(kāi)發(fā)面試題及答案_第3頁(yè)
2025年高頻java開(kāi)發(fā)面試題及答案_第4頁(yè)
2025年高頻java開(kāi)發(fā)面試題及答案_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

2025年高頻java開(kāi)發(fā)面試題及答案1.如何理解Java21中的虛擬線(xiàn)程(VirtualThreads)?它解決了什么問(wèn)題?虛擬線(xiàn)程是JDK21引入的輕量級(jí)線(xiàn)程實(shí)現(xiàn),由JVM管理而非操作系統(tǒng)內(nèi)核,其創(chuàng)建和調(diào)度成本遠(yuǎn)低于平臺(tái)線(xiàn)程(OS線(xiàn)程)。傳統(tǒng)平臺(tái)線(xiàn)程與OS線(xiàn)程一一綁定,受限于內(nèi)核資源,高并發(fā)場(chǎng)景下(如萬(wàn)級(jí)連接)容易出現(xiàn)線(xiàn)程耗盡問(wèn)題。虛擬線(xiàn)程通過(guò)M:N調(diào)度模型(多個(gè)虛擬線(xiàn)程映射到少量平臺(tái)線(xiàn)程),將阻塞操作轉(zhuǎn)換為非阻塞的協(xié)程式掛起,釋放平臺(tái)線(xiàn)程去執(zhí)行其他任務(wù),顯著提升并發(fā)性能。典型應(yīng)用場(chǎng)景是處理大量IO密集型任務(wù)(如HTTP服務(wù)端處理請(qǐng)求),無(wú)需手動(dòng)管理線(xiàn)程池大小,開(kāi)發(fā)者可像編寫(xiě)同步代碼一樣獲得異步性能。需注意虛擬線(xiàn)程不適合CPU密集型任務(wù),因無(wú)法利用多核并行優(yōu)勢(shì)。2.簡(jiǎn)述HashMap在JDK1.8中的優(yōu)化點(diǎn)及底層結(jié)構(gòu)?JDK1.8對(duì)HashMap的優(yōu)化主要體現(xiàn)在三方面:①數(shù)據(jù)結(jié)構(gòu)從“數(shù)組+鏈表”升級(jí)為“數(shù)組+鏈表+紅黑樹(shù)”,當(dāng)鏈表長(zhǎng)度≥8且數(shù)組長(zhǎng)度≥64時(shí),鏈表轉(zhuǎn)換為紅黑樹(shù)(查詢(xún)時(shí)間復(fù)雜度從O(n)降至O(logn));當(dāng)紅黑樹(shù)節(jié)點(diǎn)數(shù)≤6時(shí)回退為鏈表,避免頻繁轉(zhuǎn)換。②哈希計(jì)算優(yōu)化:key的hashCode()高16位與低16位異或((h=key.hashCode())^(h>>>16)),減少高位信息丟失,降低哈希沖突概率。③擴(kuò)容時(shí)節(jié)點(diǎn)遷移方式優(yōu)化:JDK1.7采用頭插法(多線(xiàn)程下可能導(dǎo)致循環(huán)鏈表),JDK1.8改用尾插法,且通過(guò)判斷hash&oldCap是否為0,將節(jié)點(diǎn)分為原位置和原位置+oldCap兩部分,避免重新計(jì)算哈希。當(dāng)前HashMap默認(rèn)初始容量16,負(fù)載因子0.75(空間與時(shí)間的權(quán)衡值),最大容量2^30。3.對(duì)比synchronized與ReentrantLock的異同,實(shí)際開(kāi)發(fā)中如何選擇?相同點(diǎn):均為可重入鎖,用于解決多線(xiàn)程同步問(wèn)題。不同點(diǎn):①實(shí)現(xiàn)層面:synchronized是JVM關(guān)鍵字,依賴(lài)Monitor對(duì)象實(shí)現(xiàn);ReentrantLock是JUC包下的類(lèi),基于AQS(AbstractQueuedSynchronizer)實(shí)現(xiàn)。②鎖特性:synchronized隱式加解鎖(作用域結(jié)束自動(dòng)釋放),支持非公平鎖;ReentrantLock需手動(dòng)lock()/unlock(),支持公平鎖與非公平鎖(默認(rèn)非公平)、可中斷鎖(lockInterruptibly())、超時(shí)獲取鎖(tryLock(long,TimeUnit))、條件變量(Condition)。③性能:早期版本synchronized因重量鎖優(yōu)化差,性能低于ReentrantLock;JDK1.6后引入偏向鎖、輕量級(jí)鎖、自旋鎖等優(yōu)化,兩者性能接近。選擇建議:簡(jiǎn)單同步場(chǎng)景(如方法/代碼塊加鎖)優(yōu)先用synchronized(代碼簡(jiǎn)潔,避免忘記解鎖);需要可中斷、超時(shí)、公平鎖或多個(gè)條件變量時(shí)選ReentrantLock(如生產(chǎn)者-消費(fèi)者模型中精準(zhǔn)喚醒特定線(xiàn)程)。4.解釋Spring循環(huán)依賴(lài)的解決機(jī)制,三級(jí)緩存具體存儲(chǔ)什么?Spring通過(guò)三級(jí)緩存解決單例Bean的循環(huán)依賴(lài)(僅支持setter注入或字段注入,構(gòu)造器注入無(wú)法解決)。三級(jí)緩存定義如下:一級(jí)緩存(singletonObjects):存儲(chǔ)已初始化完成的單例Bean(成品)。二級(jí)緩存(earlySingletonObjects):存儲(chǔ)已實(shí)例化但未初始化完成的Bean(半成品,用于解決AOP代理問(wèn)題)。三級(jí)緩存(singletonFactories):存儲(chǔ)ObjectFactory工廠(chǎng),用于提供早期Bean引用(解決代理對(duì)象提前暴露問(wèn)題)。解決流程:假設(shè)A依賴(lài)B,B依賴(lài)A。①創(chuàng)建A時(shí),實(shí)例化A(調(diào)用構(gòu)造器),將A的ObjectFactory(lambda表達(dá)式:()->getEarlyBeanReference(beanName,mbd,bean))放入三級(jí)緩存;②A注入B時(shí)觸發(fā)B的創(chuàng)建,B實(shí)例化后將自身ObjectFactory放入三級(jí)緩存;③B注入A時(shí),從三級(jí)緩存獲取A的ObjectFactory,提供早期A的引用(若A需要代理則在此步驟提供代理對(duì)象),將早期A放入二級(jí)緩存并移除三級(jí)緩存的工廠(chǎng);④B完成初始化后放入一級(jí)緩存,移除二、三級(jí)緩存中的B;⑤A獲取到B的實(shí)例后完成初始化,放入一級(jí)緩存,移除二、三級(jí)緩存中的A。三級(jí)緩存的核心作用是延遲提供代理對(duì)象(僅在需要時(shí)通過(guò)工廠(chǎng)創(chuàng)建),避免未初始化完成的Bean提前提供代理導(dǎo)致?tīng)顟B(tài)不一致。5.說(shuō)明MySQL覆蓋索引的概念及優(yōu)化原理,如何判斷查詢(xún)是否使用了覆蓋索引?覆蓋索引指查詢(xún)所需的所有字段都包含在索引中,無(wú)需回表查詢(xún)主鍵對(duì)應(yīng)的行數(shù)據(jù)。例如,若有索引(name,age),當(dāng)查詢(xún)“SELECTname,ageFROMuserWHEREname='張三'”時(shí),索引已包含所有查詢(xún)字段,直接通過(guò)索引樹(shù)獲取結(jié)果,避免回表(通過(guò)主鍵索引查找數(shù)據(jù)行)。優(yōu)化原理:減少I(mǎi)O次數(shù)(無(wú)需訪(fǎng)問(wèn)數(shù)據(jù)頁(yè)),提升查詢(xún)速度。判斷方法:執(zhí)行EXPLAIN命令,查看Extra列是否出現(xiàn)“Usingindex”。若出現(xiàn)則表示使用了覆蓋索引。需注意,覆蓋索引的字段順序需符合最左匹配原則(如索引(a,b,c)支持a、a+b、a+b+c的查詢(xún)),且不能包含TEXT/BLOB等大字段(因索引存儲(chǔ)長(zhǎng)度限制)。6.簡(jiǎn)述Redis分布式鎖的實(shí)現(xiàn)要點(diǎn),如何解決鎖過(guò)期與業(yè)務(wù)執(zhí)行超時(shí)的矛盾?Redis分布式鎖的核心是通過(guò)SET命令的原子性(SETkeyvalueNXPXmilliseconds)實(shí)現(xiàn)。要點(diǎn)包括:①鎖值需設(shè)置為唯一隨機(jī)值(如UUID),避免誤釋放其他客戶(hù)端的鎖(釋放時(shí)檢查鎖值是否匹配,使用Lua腳本保證原子性);②鎖過(guò)期時(shí)間需合理設(shè)置(一般略大于業(yè)務(wù)最大執(zhí)行時(shí)間);③可結(jié)合RedLock算法(多實(shí)例Redis)提升可靠性(多數(shù)節(jié)點(diǎn)加鎖成功則認(rèn)為加鎖成功)。鎖過(guò)期與業(yè)務(wù)超時(shí)的矛盾解決:①采用“看門(mén)狗(Watchdog)”機(jī)制(如Redisson的實(shí)現(xiàn)),通過(guò)后臺(tái)線(xiàn)程定期(默認(rèn)每1/3過(guò)期時(shí)間)延長(zhǎng)鎖的過(guò)期時(shí)間(續(xù)約),直到業(yè)務(wù)執(zhí)行完成;②對(duì)于無(wú)法預(yù)估執(zhí)行時(shí)間的任務(wù),可將任務(wù)拆分為多個(gè)短任務(wù),減少單次鎖持有時(shí)間;③記錄鎖的過(guò)期時(shí)間,業(yè)務(wù)執(zhí)行時(shí)檢查鎖是否已過(guò)期,若過(guò)期則終止操作并返回失敗。7.對(duì)比G1與ZGC垃圾收集器的特點(diǎn),各自適用場(chǎng)景是什么?G1(Garbage-First)是JDK7引入的分代收集器,ZGC是JDK11引入的并發(fā)收集器,兩者均目標(biāo)實(shí)現(xiàn)低停頓(≤10ms)。G1特點(diǎn):①堆內(nèi)存劃分為多個(gè)大小相等的Region(默認(rèn)2MB-32MB),部分Region作為Eden、Survivor、Old區(qū),還有HumongousRegion存儲(chǔ)大對(duì)象(>50%Region大?。虎诓捎脴?biāo)記-復(fù)制算法,優(yōu)先收集回收價(jià)值高的Region(Garbage-First);③停頓時(shí)間可預(yù)測(cè)(通過(guò)-XX:MaxGCPauseMillis設(shè)置目標(biāo)停頓時(shí)間)。ZGC特點(diǎn):①基于染色指針(ColorPointers,64位指針的高4位存儲(chǔ)標(biāo)記信息)和讀屏障(LoadBarrier)實(shí)現(xiàn)并發(fā)標(biāo)記、轉(zhuǎn)移,幾乎無(wú)STW(只有初始標(biāo)記和最終標(biāo)記的短暫停頓);②堆內(nèi)存不劃分Region(邏輯上分為Small、Medium、Large),支持TB級(jí)堆內(nèi)存(理論支持4TB-16EB);③采用內(nèi)存多重映射技術(shù)(MappedMemory),實(shí)現(xiàn)對(duì)象地址的透明重定位。適用場(chǎng)景:G1適合堆內(nèi)存中等(幾十GB)、需要可預(yù)測(cè)停頓的場(chǎng)景(如傳統(tǒng)企業(yè)應(yīng)用);ZGC適合大內(nèi)存(百GB級(jí)以上)、低延遲要求高的場(chǎng)景(如大數(shù)據(jù)、實(shí)時(shí)交易系統(tǒng))。8.如何設(shè)計(jì)一個(gè)高并發(fā)的接口?需要考慮哪些方面?高并發(fā)接口設(shè)計(jì)需從以下維度優(yōu)化:①限流:通過(guò)Sentinel、Hystrix或Nginx限制請(qǐng)求速率(如QPS限制),防止服務(wù)過(guò)載。常用算法有令牌桶(允許突發(fā)流量)、漏桶(平滑限流)。②降級(jí):當(dāng)系統(tǒng)壓力大時(shí),關(guān)閉非核心功能(如接口返回緩存的默認(rèn)值),保證核心業(yè)務(wù)可用??赏ㄟ^(guò)配置中心動(dòng)態(tài)調(diào)整降級(jí)策略。③緩存:對(duì)讀多寫(xiě)少的數(shù)據(jù),使用Redis、本地緩存(Caffeine)緩存結(jié)果,減少數(shù)據(jù)庫(kù)壓力。注意緩存一致性(如通過(guò)MQ通知緩存更新,或設(shè)置合理的過(guò)期時(shí)間)。④異步:將非實(shí)時(shí)操作(如日志記錄、消息通知)通過(guò)MQ(Kafka、RocketMQ)異步處理,解耦業(yè)務(wù)流程,提升接口吞吐量。⑤分庫(kù)分表:當(dāng)單庫(kù)單表數(shù)據(jù)量過(guò)大時(shí),按業(yè)務(wù)規(guī)則(如用戶(hù)ID取模、時(shí)間范圍)水平拆分?jǐn)?shù)據(jù)庫(kù),減少單庫(kù)壓力。⑥連接池優(yōu)化:調(diào)整數(shù)據(jù)庫(kù)連接池(HikariCP)、HTTP連接池(OkHttp)的最大連接數(shù)、超時(shí)時(shí)間,避免資源耗盡。⑦無(wú)狀態(tài):接口設(shè)計(jì)為無(wú)狀態(tài)(通過(guò)JWT或Redis存儲(chǔ)Session),方便橫向擴(kuò)展(增加服務(wù)器實(shí)例)。⑧監(jiān)控:通過(guò)Prometheus+Grafana監(jiān)控QPS、響應(yīng)時(shí)間、錯(cuò)誤率,及時(shí)發(fā)現(xiàn)性能瓶頸(如慢SQL、GC頻繁)。9.解釋Java中的類(lèi)加載機(jī)制,雙親委派模型的作用及破壞場(chǎng)景?類(lèi)加載機(jī)制指JVM通過(guò)類(lèi)加載器(ClassLoader)將.class文件加載到內(nèi)存提供Class對(duì)象的過(guò)程,分為加載、驗(yàn)證、準(zhǔn)備、解析、初始化五個(gè)階段。其中加載階段由類(lèi)加載器完成,Java采用雙親委派模型(ParentsDelegationModel):?jiǎn)?dòng)類(lèi)加載器(BootstrapClassLoader):加載JRE/lib下的核心類(lèi)(如java.lang.)。擴(kuò)展類(lèi)加載器(ExtensionClassLoader):加載JRE/lib/ext下的擴(kuò)展類(lèi)。應(yīng)用類(lèi)加載器(ApplicationClassLoader):加載用戶(hù)類(lèi)路徑(classpath)下的類(lèi)。自定義類(lèi)加載器(CustomClassLoader):用戶(hù)自定義實(shí)現(xiàn)(如熱部署、OSGi)。雙親委派的工作流程:類(lèi)加載器收到加載請(qǐng)求后,先委托給父類(lèi)加載器(非繼承關(guān)系,是組合關(guān)系),直到啟動(dòng)類(lèi)加載器;若父類(lèi)無(wú)法加載(未找到.class文件),則由當(dāng)前類(lèi)加載器自己加載。作用:①避免類(lèi)重復(fù)加載(同一類(lèi)由同一加載器加載);②保證核心類(lèi)的安全性(防止用戶(hù)自定義java.lang.String覆蓋標(biāo)準(zhǔn)庫(kù))。破壞場(chǎng)景:①熱部署(如Tomcat的WebappClassLoader):每個(gè)Web應(yīng)用使用獨(dú)立的類(lèi)加載器,允許同一類(lèi)的不同版本共存;②接口與實(shí)現(xiàn)分離(如JDBC):?jiǎn)?dòng)類(lèi)加載器加載java.sql.Driver接口,但具體實(shí)現(xiàn)(如com.mysql.cj.jdbc.Driver)由應(yīng)用類(lèi)加載器加載,需通過(guò)線(xiàn)程上下文類(lèi)加載器(ThreadContextClassLoader)打破委派;③OSGi模塊化:支持類(lèi)的動(dòng)態(tài)加載與卸載,每個(gè)模塊有獨(dú)立的類(lèi)空間。10.簡(jiǎn)述分布式事務(wù)的SeataAT模式實(shí)現(xiàn)原理,與TCC模式的區(qū)別?Seata(SimpleExtensibleAutonomousTransactionArchitecture)是阿里巴巴開(kāi)源的分布式事務(wù)解決方案,AT模式(AutomaticTransaction)基于XA思想但非強(qiáng)依賴(lài)數(shù)據(jù)庫(kù)XA協(xié)議。AT模式原理:①預(yù)處理階段(分支事務(wù)執(zhí)行前):Seata客戶(hù)端(TM)開(kāi)啟全局事務(wù),提供XID;分支事務(wù)(RM)執(zhí)行SQL時(shí),Seata攔截器記錄數(shù)據(jù)的前像(BeforeImage,執(zhí)行前的狀態(tài))和后像(AfterImage,執(zhí)行后的狀態(tài)),并將前像、后像、XID、業(yè)務(wù)SQL等信息存入undo_log表。②提交階段(全局事務(wù)提交):TM通知所有RM提交分支事務(wù),RM刪除undo_log表中的記錄(無(wú)需實(shí)際提交數(shù)據(jù)庫(kù)事務(wù),因分支事務(wù)已本地提交)。③回滾階段(全局事務(wù)回滾):TM通知所有RM回滾分支事務(wù),RM根據(jù)undo_log中的前像恢復(fù)數(shù)據(jù)(通過(guò)反向SQL覆蓋后像)。與TCC模式(Try-Confirm-Cancel)的區(qū)別:侵入性:AT模式無(wú)需業(yè)務(wù)代碼改造(通過(guò)代理數(shù)據(jù)源自動(dòng)攔截SQL),TCC需手動(dòng)實(shí)現(xiàn)Try(資源檢查與預(yù)留)、Confirm(提交預(yù)留資源)、Cancel(釋放預(yù)留資源)三個(gè)方法。隔離性:AT模式通過(guò)undo_log實(shí)現(xiàn)“寫(xiě)隔離”(其他事務(wù)讀取時(shí)通過(guò)行鎖或全局鎖保證),TCC通過(guò)Try階段的資源預(yù)留實(shí)現(xiàn)“業(yè)務(wù)隔離”。性能:AT模式適合低并發(fā)、短事務(wù)(如電商下單);TCC適合高并發(fā)、長(zhǎng)事務(wù)(如庫(kù)存扣減、賬戶(hù)轉(zhuǎn)賬),但需業(yè)務(wù)層面設(shè)計(jì)資源預(yù)留邏輯。11.如何優(yōu)化SpringBoot應(yīng)用的啟動(dòng)時(shí)間?列舉至少5種方法?①減少自動(dòng)配置類(lèi)加載:通過(guò)spring.autoconfigure.exclude排除不需要的自動(dòng)配置類(lèi)(如不需要數(shù)據(jù)庫(kù)則排除DataSourceAutoConfiguration)。②使用分層編譯(TieredCompilation):JVM參數(shù)-XX:+TieredCompilation開(kāi)啟分層編譯,加速類(lèi)加載后的字節(jié)碼編譯。③優(yōu)化依賴(lài):移除冗余依賴(lài)(通過(guò)mvndependency:analyze查看未使用的依賴(lài)),使用spring-boot-starter-精簡(jiǎn)依賴(lài)傳遞。④啟用類(lèi)數(shù)據(jù)共享(ClassDataSharing,CDS):通過(guò)java-Xshare:dump提供共享類(lèi)數(shù)據(jù)文件(如app-cds.jsa),啟動(dòng)時(shí)通過(guò)-XX:SharedArchiveFile=app-cds.jsa加載,減少類(lèi)加載時(shí)間。⑤延遲初始化Bean:通過(guò)@Lazy注解標(biāo)記非核心Bean,使其在首次使用時(shí)再初始化(需注意循環(huán)依賴(lài)問(wèn)題)。⑥使用SpringBoot3+:基于GraalVM支持原生編譯(native-image),提供可執(zhí)行文件,啟動(dòng)時(shí)間從秒級(jí)降至毫秒級(jí)(如spring-boot:build-image插件)。⑦優(yōu)化配置文件:將大配置文件拆分為多個(gè)小文件(通過(guò)files.include引入),或使用外部配置中心(如Nacos)減少本地加載時(shí)間。12.解釋Java中的內(nèi)存模型(JMM),如何解決可見(jiàn)性與有序性問(wèn)題?JMM(JavaMemoryModel)是一組規(guī)范,定義了多線(xiàn)程間共享變量的訪(fǎng)問(wèn)規(guī)則,解決可見(jiàn)性、有序性和原子性問(wèn)題。JMM規(guī)定:每個(gè)線(xiàn)程有獨(dú)立的工作內(nèi)存(緩存、寄存器),共享變量存儲(chǔ)在主內(nèi)存中,線(xiàn)程對(duì)變量的操作需先從主內(nèi)存拷貝到工作內(nèi)存,修改后再同步回主內(nèi)存??梢?jiàn)性問(wèn)題:線(xiàn)程A修改共享變量后,線(xiàn)程B未及時(shí)看到最新值。解決方式:①使用volatile關(guān)鍵字(保證變量修改后立即刷新到主內(nèi)存,其他線(xiàn)程讀取時(shí)從主內(nèi)存獲?。?;②使用synchronized或Lock(加鎖時(shí)清空工作內(nèi)存,解鎖時(shí)同步到主內(nèi)存);③使用AtomicXXX原子類(lèi)(基于CAS實(shí)現(xiàn)可見(jiàn)性)。有序性問(wèn)題:編譯器或CPU為優(yōu)化性能對(duì)指令重排序,導(dǎo)致多線(xiàn)程下邏輯錯(cuò)誤。解決方式:①volatile關(guān)鍵字(通過(guò)內(nèi)存屏障禁止指令重排序);②synchronized(同一鎖的代碼塊內(nèi)指令有序執(zhí)行);③使用happens-before原則(如鎖的釋放先于獲取、volatile寫(xiě)先于讀)。原子性問(wèn)題:JMM僅保證基本數(shù)據(jù)類(lèi)型的讀取和賦值(非long/double)是原子的,復(fù)合操作(如i++)需通過(guò)synchronized、Lock或AtomicXXX保證。13.對(duì)比ArrayList與LinkedList的底層結(jié)構(gòu)及適用場(chǎng)景?ArrayList底層是動(dòng)態(tài)擴(kuò)容的Object數(shù)組(默認(rèn)初始容量10,擴(kuò)容時(shí)新容量=舊容量×1.5),支持O(1)時(shí)間隨機(jī)訪(fǎng)問(wèn)(通過(guò)索引定位),但插入/刪除元素(非末尾)需移動(dòng)后續(xù)元素,時(shí)間復(fù)雜度O(n)。LinkedList底層是雙向鏈表(每個(gè)節(jié)點(diǎn)包含prev、next指針和數(shù)據(jù)),插入/刪除元素(已知節(jié)點(diǎn)位置)只需修改前后節(jié)點(diǎn)指針,時(shí)間復(fù)雜度O(1)(但需先遍歷找到位置,實(shí)際為O(n)),隨機(jī)訪(fǎng)問(wèn)需遍歷鏈表,時(shí)間復(fù)雜度O(n)。適用場(chǎng)景:ArrayList適合頻繁讀取、少量增刪的場(chǎng)景(如數(shù)據(jù)展示列表);LinkedList適合頻繁增刪(尤其是首尾操作)、少量讀取的場(chǎng)景(如隊(duì)列、棧的實(shí)現(xiàn),Java中Deque的默認(rèn)實(shí)現(xiàn)是LinkedList)。注意:Java16引入了Vector的優(yōu)化版ArrayList(更輕量),而LinkedList因內(nèi)存開(kāi)銷(xiāo)大(每個(gè)節(jié)點(diǎn)多兩個(gè)指針),實(shí)際開(kāi)發(fā)中更推薦使用ArrayDeque替代LinkedList作為隊(duì)列。14.簡(jiǎn)述TCP三次握手與四次揮手的過(guò)程,TIME_WAIT狀態(tài)的作用?三次握手(建立連接):①客戶(hù)端發(fā)送SYN=1,seq=x(初始序列號(hào)),進(jìn)入SYN_SENT狀態(tài)。②服務(wù)器收到后發(fā)送SYN=1,ACK=1,ack=x+1,seq=y,進(jìn)入SYN_RCVD狀態(tài)。③客戶(hù)端發(fā)送ACK=1,ack=y+1,seq=x+1,進(jìn)入ESTABLISHED狀態(tài);服務(wù)器收到后進(jìn)入ESTABLISHED狀態(tài)。四次揮手(關(guān)閉連接):①客戶(hù)端發(fā)送FIN=1,seq=u,進(jìn)入FIN_WAIT_1狀態(tài)。②服務(wù)器收到后發(fā)送ACK=1,ack=u+1,seq=v,進(jìn)入CLOSE_WAIT狀態(tài);客戶(hù)端收到后進(jìn)入FIN_WAIT_2狀態(tài)。③服務(wù)器發(fā)送FIN=1,ACK=1,ack=u+1,seq=w,進(jìn)入LAST_ACK狀態(tài)。④客戶(hù)端發(fā)送ACK=1,ack=w+1,seq=u+1,進(jìn)入TIME_WAIT狀態(tài);服務(wù)器收到后進(jìn)入CLOSED狀態(tài);客戶(hù)端等待2MSL(最大報(bào)文段生存時(shí)間,通常2分鐘)后進(jìn)入CLOSED狀態(tài)。TIME_WAIT狀態(tài)的作用:①防止最后一次ACK丟失,服務(wù)器重發(fā)FIN時(shí)客戶(hù)端可重新發(fā)送ACK;②讓本連接的報(bào)文段在網(wǎng)絡(luò)中自然消失,避免后續(xù)新連接收到舊連接的殘留報(bào)文(端口復(fù)用可能導(dǎo)致)。15.如何排查Java應(yīng)用的CPU使用率過(guò)高問(wèn)題?排查步驟:①定位進(jìn)程:通過(guò)top命令找到CPU占用率高的Java進(jìn)程PID。②定位線(xiàn)程:通過(guò)top-HpPID查看進(jìn)程內(nèi)線(xiàn)程的CPU占用情況,記錄高CPU線(xiàn)程的TID(十六進(jìn)制表示)。③提供線(xiàn)程快照:通過(guò)jstackPID>thread.log提供線(xiàn)程dump文件,搜索TID對(duì)應(yīng)的十六進(jìn)制值(如TID=1234→0x4D2),查看線(xiàn)程狀態(tài)(RUNNABLE、BLOCKED等)及對(duì)應(yīng)堆棧。④分析原因:若線(xiàn)程狀態(tài)為RUNNABLE且堆棧指向業(yè)務(wù)代碼(如循環(huán)計(jì)算),可能是死循環(huán)或算法復(fù)雜度高(如O(n2)的排序)。若線(xiàn)程狀態(tài)為BLOCKED且等待鎖(waitingtolock<0x1234>),可能是鎖競(jìng)爭(zhēng)激烈(如synchronized同步塊過(guò)長(zhǎng))。若線(xiàn)程狀態(tài)為WAITING或TIMED_WAITING(如parking、sleeping),可能是線(xiàn)程池配置不合理(如核心線(xiàn)程數(shù)過(guò)多)或阻塞操作(如IO等待)。⑤輔助工具:使用Arthas(jad反編譯、trace追蹤方法調(diào)用耗時(shí))、JProfiler(可視化分析CPU熱點(diǎn))進(jìn)一步定位問(wèn)題代碼。⑥優(yōu)化措施:修復(fù)死循環(huán)、優(yōu)化算法(如用哈希表替代線(xiàn)性查找)、縮短鎖持有時(shí)間(如拆分同步塊)、調(diào)整線(xiàn)程池參數(shù)(如減少核心線(xiàn)程數(shù))。16.解釋MyBatis的一級(jí)緩存與二級(jí)緩存,如何避免緩存臟數(shù)據(jù)?一級(jí)緩存(本地緩存):基于SqlSession,同一SqlSession內(nèi)執(zhí)行相同查詢(xún)(相同SQL、參數(shù)、環(huán)境)時(shí),直接從緩存返回結(jié)果,無(wú)需訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)。一級(jí)緩存默認(rèn)開(kāi)啟,不可關(guān)閉(但可通過(guò)flushCache=true強(qiáng)制清空)。二級(jí)緩存(全局緩存):基于Mappernamespace,多個(gè)SqlSession共享(需配置<cache/>標(biāo)簽)。二級(jí)緩存需開(kāi)啟全局配置(mybatis.configuration.cache-enabled=true),且被緩存的對(duì)象需實(shí)現(xiàn)Serializable接口。緩存臟數(shù)據(jù)問(wèn)題:當(dāng)數(shù)據(jù)被修改(INSERT/UPDATE/DELETE)時(shí),緩存未及時(shí)失效,導(dǎo)致后續(xù)查詢(xún)返回舊數(shù)據(jù)。避免措施:①一級(jí)緩存:因作用域?yàn)镾qlSession,關(guān)閉SqlSession或執(zhí)行更新操作會(huì)自動(dòng)清空緩存,臟數(shù)據(jù)問(wèn)題較少。②二級(jí)緩存:配置緩存過(guò)期時(shí)間(如<cacheeviction="LRU"flushInterval="60000"/>,LRU策略+1分鐘刷新)。對(duì)敏感數(shù)據(jù)(如賬戶(hù)余額)關(guān)閉二級(jí)緩存(<select...useCache="false"/>)。使用第三方緩存(如Redis)替代MyBatis二級(jí)緩存,利用其過(guò)期策略和集群特性提升一致性。在更新操作后手動(dòng)清空相關(guān)緩存(通過(guò)@CacheEvict注解,若使用SpringBoot+MyBatis-Plus)。17.簡(jiǎn)述Kafka的分區(qū)(Partition)與副本(Replica)機(jī)制,如何保證消息可靠性?Kafka主題(Topic)劃分為多個(gè)分區(qū)(Partition),每個(gè)分區(qū)是一個(gè)有序的、不可變的消息日志(Append-Only),消息按offset順序存儲(chǔ)。分區(qū)分布在不同Broker上,實(shí)現(xiàn)負(fù)載均衡和水平擴(kuò)展。每個(gè)分區(qū)有多個(gè)副本(Replica,默認(rèn)3個(gè)),分為L(zhǎng)eader(負(fù)責(zé)讀寫(xiě))和Follower(同步Leader數(shù)據(jù))。Follower通過(guò)拉?。‵etch)請(qǐng)求同步Leader的消息,保持與Leader的ISR(In-SyncReplicas,同步副本集合)。當(dāng)Leader故障時(shí),從ISR中選舉新Leader(通過(guò)ZooKeeper或KRaft模式)。消息可靠性保證:①生產(chǎn)者端:通過(guò)acks參數(shù)控制確認(rèn)機(jī)制(acks=0不等待確認(rèn);acks=1等待Leader確認(rèn);acks=all等待所有ISR副本確認(rèn))。acks=all時(shí),若ISR中所有副本都確認(rèn)消息,即使Leader故障,新Leader仍有該消息,保證不丟失。②消費(fèi)者端:通過(guò)mit=false手動(dòng)提交offset(commitSync()或commitAsync()),避免消息未處理完成時(shí)offset被提交,導(dǎo)致重復(fù)消費(fèi)或丟失。③Broker端:配置min.insync.replicas(最小同步副本數(shù),默認(rèn)1),當(dāng)ISR大小小于該值時(shí),生產(chǎn)者發(fā)送acks=all的消息會(huì)失敗,避免數(shù)據(jù)寫(xiě)入少數(shù)副本導(dǎo)致丟失。④持久化:消息默認(rèn)保留7天(log.retention.hours=168),或按大小/條數(shù)刪除(log.retention.bytes、log.retention.count),保證歷史消息可追溯。18.如何設(shè)計(jì)一個(gè)線(xiàn)程安全的單例模式?列舉常見(jiàn)實(shí)現(xiàn)方式及優(yōu)缺點(diǎn)?單例模式需保證全局僅一個(gè)實(shí)例,且線(xiàn)程安全。常見(jiàn)實(shí)現(xiàn)方式:①餓漢式(靜態(tài)變量):```javapublicclassSingleton{privatestaticfinalSingletonINSTANCE=newSingleton();privateSingleton(){}publicstaticSingletongetInstance(){returnINSTANCE;}}```優(yōu)點(diǎn):線(xiàn)程安全(類(lèi)加載時(shí)初始化,JVM保證線(xiàn)程安全);缺點(diǎn):無(wú)法延遲加載(即使未使用也會(huì)創(chuàng)建實(shí)例)。②懶漢式(synchronized方法):```javapublicclassSingleton{privatestaticSingletonINSTANCE;privateSingleton(){}publicstaticsynchronizedSingletongetInstance(){if(INSTANCE==null){INSTANCE=newSingleton();}returnINSTANCE;}}```優(yōu)點(diǎn):延遲加載;缺點(diǎn):同步方法效率低(每次獲取實(shí)例都加鎖)。③雙重檢查鎖定(DCL,Double-CheckedLocking):```javapublicclassSingleton{privatestaticvolatileSingletonINSTANCE;//volatile禁止指令重排序privateSingleton(){}publicstaticSingletongetInstance(){if(INSTANCE==null){//第一次檢查(無(wú)鎖)synchronized(Singleton.class){if(INSTANCE==null){//第二次檢查(加鎖后)INSTANCE=newSingleton();//分三步:分配內(nèi)存、初始化對(duì)象、引用指向內(nèi)存}}}returnINSTANCE;}}```優(yōu)點(diǎn):延遲加載、線(xiàn)程安全、效率高;缺點(diǎn):需使用volatile修飾INSTANCE(避免JVM指令重排序?qū)е缕渌€(xiàn)程獲取到未初始化的實(shí)例)。④靜態(tài)內(nèi)部類(lèi):```javapublicclassSingleton{privateSingleton(){}privatestaticclassHolder{staticfinalSingletonINSTANCE=newSingleton();}publicstaticSingletongetInstance(){returnHolder.INSTANCE;}}```優(yōu)點(diǎn):線(xiàn)程安全(類(lèi)加載時(shí)Holder類(lèi)初始化,JVM保證線(xiàn)程安全)、延遲加載(調(diào)用getInstance()時(shí)才加載Holder類(lèi));缺點(diǎn):無(wú)法防止反射或反序列化攻擊(通過(guò)反射調(diào)用私有構(gòu)造器,或反序列化提供新實(shí)例)。推薦使用靜態(tài)內(nèi)部類(lèi)或DCL(JDK1.5+,volatile語(yǔ)義修復(fù)后),若需防止反射攻擊,可在構(gòu)造器中添加實(shí)例存在檢查(thrownewIllegalStateException())。19.簡(jiǎn)述Netty的Reactor線(xiàn)程模

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論