化入門:一次大型項(xiàng)目卡頓問(wèn)題的排查與修復(fù)記錄)
IntelliJ IDEA 性能優(yōu)化入門一次大型項(xiàng)目卡頓問(wèn)題的排查與修復(fù)記錄【免費(fèi)下載鏈接】IntelliJ-IDEA-TutorialIntelliJ IDEA 簡(jiǎn)體中文專題教程項(xiàng)目地址: https://gitcode.com/gh_mirrors/in/IntelliJ-IDEA-TutorialIntelliJ IDEA 性能優(yōu)化這個(gè)課題往往是項(xiàng)目變大之后才被重視的。平時(shí)寫幾百行的小項(xiàng)目IDE 的反應(yīng)速度差別不大一旦代碼量上到幾十萬(wàn)行輸入卡頓、查找轉(zhuǎn)圈、編譯緩慢這些毛病就會(huì)一個(gè)個(gè)冒出來(lái)。這篇文章不打算列十條技巧而是完整還原一次真實(shí)的排查過(guò)程按照先診斷、再對(duì)癥、最后預(yù)防的順序展開。文中的每一步都有明確的操作動(dòng)作和參數(shù)參考不需要改業(yè)務(wù)代碼也不用安裝額外插件照著做就能看到變化。一、動(dòng)手之前先看清楚癥狀出在哪先說(shuō)一個(gè)普遍的現(xiàn)象老項(xiàng)目、大倉(cāng)庫(kù)打開 IntelliJ IDEA 之后明顯感覺手跟不上腦。我遇到的具體表現(xiàn)是——輸入代碼時(shí)提示要頓一下才出來(lái)全局搜索要轉(zhuǎn)好幾圈點(diǎn)一次構(gòu)建要等很久偶爾右下角還會(huì)彈內(nèi)存不足的提示。如果你也有類似的經(jīng)歷大概率跑不出下面兩類原因。一類屬于病根在積累緩存和索引年久失修。IntelliJ IDEA 是靠索引來(lái)加速查找、代碼提示和跳轉(zhuǎn)的索引文件一多、一亂這些操作就會(huì)明顯變慢索引損壞時(shí)更夸張可能出現(xiàn)項(xiàng)目打不開、代碼提示錯(cuò)亂、主題設(shè)置被還原成默認(rèn)這些莫名其妙的現(xiàn)象。另一類屬于供應(yīng)不足IDE 默認(rèn)給 JVM 分配的內(nèi)存是按一般項(xiàng)目估的遇到大項(xiàng)目?jī)?nèi)存頻繁告急系統(tǒng)就要反復(fù)做垃圾回收界面于是跟著一頓一頓的。所以在動(dòng)手之前先花兩分鐘做兩個(gè)觀察第一看看狀態(tài)欄右下角有沒有顯示內(nèi)存占用數(shù)字沒顯示的話怎么打開第五節(jié)會(huì)講第二留意卡頓主要發(fā)生在輸入代碼時(shí)、查找時(shí)還是編譯時(shí)。不同時(shí)機(jī)對(duì)應(yīng)不同的處理方向這一步能讓后面的調(diào)整有的放矢。二、先做最安全的一步清理緩存與索引先講機(jī)制再給方法。IntelliJ IDEA 首次打開項(xiàng)目時(shí)會(huì)為所有文件建立索引文件越多建索引的時(shí)間越長(zhǎng)期間代碼基本處于只能看不能編譯的狀態(tài)。正常情況下索引會(huì)持續(xù)幫你加速但斷電、強(qiáng)制關(guān)機(jī)、異常退出這類意外可能讓索引和緩存文件損壞。損壞之后的表現(xiàn)五花八門前面提到的怪問(wèn)題大部分都是這個(gè)原因。對(duì)應(yīng)的處理方式很直接點(diǎn)擊菜單欄File → Invalidate Caches / Restart...在彈出的對(duì)話框里選擇Invalidate and Restart。IDE 會(huì)清空緩存和索引并自動(dòng)重啟重啟后重新為項(xiàng)目建索引。這是處理異常現(xiàn)象最常用、也最干凈的手段。不過(guò)有一個(gè)地方容易被忽略這一步會(huì)連同 Local History本地歷史記錄一起清掉。如果你的項(xiàng)目還沒有納入版本控制又需要追溯文件的改動(dòng)歷史建議先把本地的 LocalHistory 目錄備份出來(lái)再執(zhí)行清理。 緩存到底占了多少空間值得親眼看一下。緩存文件默認(rèn)存放在system目錄下Windows 上通常在用戶目錄的.IntelliJIdea文件夾里Mac 的路徑略有不同。下面這張圖是我機(jī)器上一個(gè)小項(xiàng)目的真實(shí)情況項(xiàng)目本身很小索引和緩存卻輕輕松松占了近兩百兆。如果系統(tǒng)盤空間緊張可以把整個(gè)system目錄遷移到其他分區(qū)或定期清理。但要注意清理本身是治標(biāo)頻繁清理反而是浪費(fèi)——每次清完都要重建索引那段時(shí)間反而比原來(lái)更慢。三、接著補(bǔ)內(nèi)存給 IDE 和編譯器各自喂飽為什么調(diào)整內(nèi)存參數(shù)能解決問(wèn)題IntelliJ IDEA 本身跑在 JVM 上堆空間設(shè)得太小項(xiàng)目一膨脹就頻繁觸發(fā)垃圾回收最直觀的表現(xiàn)就是打字都跟不上這和手機(jī)內(nèi)存不足自動(dòng)殺后臺(tái)是同一個(gè)道理。先調(diào) IDE 本體。新版 IntelliJ IDEA 推薦用菜單Help → Edit Custom VM Options打開配置文件舊版本是在安裝目錄里改idea64.exe.vmoptions。核心是兩個(gè)參數(shù)-Xms是啟動(dòng)時(shí)預(yù)留的初始堆-Xmx是允許用到的最大堆。給一個(gè)可以直接套用的參考區(qū)間按電腦物理內(nèi)存來(lái)選物理內(nèi)存 4~8G-Xms256m-Xmx1024m到1280m物理內(nèi)存 8~16G-Xms512m到1024m-Xmx2048m物理內(nèi)存 16G 以上-Xmx可以放寬到3072m左右 記住一條總原則Xmx最好不要超過(guò)物理內(nèi)存的三分之一要給操作系統(tǒng)和其他程序留夠余地調(diào)得過(guò)大反而適得其反。另外 32 位系統(tǒng)本身內(nèi)存就小、上限低保持默認(rèn)不動(dòng)即可。IDE 本體之外編譯還跑在一個(gè)獨(dú)立的進(jìn)程里用的是另一套內(nèi)存參數(shù)。進(jìn)入Settings → Build, Execution, Deployment → Compiler兩個(gè)關(guān)鍵項(xiàng)Build process heap size控制編譯進(jìn)程的堆大小項(xiàng)目大就適當(dāng)調(diào)大Shared build process VM options里可以手動(dòng)寫-Xms和-Xmx自定義。同一個(gè)頁(yè)面里還有一項(xiàng)Clear output directory on rebuild建議保持勾選重建時(shí)先清空舊輸出目錄避免新舊產(chǎn)物混在一起引發(fā)一些說(shuō)不清道不明的編譯報(bào)錯(cuò)。四、給索引瘦身讓 IDE 只盯該盯的文件索引不是越多越好。每對(duì)一個(gè)目錄建索引都要花時(shí)間和內(nèi)存而項(xiàng)目里真正需要完整索引的只有源代碼。那些每次構(gòu)建都會(huì)變、體積又大的目錄——比如target、build、out、node_modules——屬于典型的建了索引反而吃虧。操作起來(lái)很簡(jiǎn)單在項(xiàng)目視圖里選中這類目錄右鍵 →Mark Directory as → Excluded把它標(biāo)記為排除。被排除的目錄不會(huì)被建索引、不做代碼提示相當(dāng)于從 IDE 的視野里下線了等哪天需要看里面的內(nèi)容再取消排除就行。編譯層面也有類似的思路。如果某個(gè)包暫時(shí)編譯不過(guò)而你又不急著改它可以在編譯器設(shè)置里把它加入排除編譯列表讓項(xiàng)目整體先能跑起來(lái)集中精力處理手頭真正要緊的問(wèn)題。下圖標(biāo)注的位置就是添加排除目錄/文件的地方。另外有兩個(gè)順手就能做的事一是編輯大文件時(shí)如果代碼檢查和高亮明顯拖慢輸入可以臨時(shí)把檢查級(jí)別調(diào)低Settings → Editor → Inspections改完再調(diào)回來(lái)二是別把打開的 Tab 太多、窗口擁擠也歸到性能問(wèn)題上那是使用習(xí)慣問(wèn)題和性能優(yōu)化是兩碼事。五、把優(yōu)化固定成習(xí)慣防止問(wèn)題卷土重來(lái)前三步解決的是已經(jīng)慢了的問(wèn)題這一節(jié)解決的是以后還慢不慢的問(wèn)題靠的是幾個(gè)小習(xí)慣。第一打開內(nèi)存指示器。在Settings → Appearance Behavior → Appearance里勾選Show memory indicator狀態(tài)欄右下角就會(huì)出現(xiàn)實(shí)時(shí)的內(nèi)存數(shù)字。平時(shí)掃一眼就知道水位異常飆升時(shí)鼠標(biāo)點(diǎn)一下這個(gè)數(shù)字還能手動(dòng)觸發(fā)一次垃圾回收很實(shí)用。 第二建立一個(gè)輕量的檢查節(jié)奏??梢远ㄔ诿總€(gè)月月初花五分鐘做一次例行體檢內(nèi)存占用是不是長(zhǎng)期貼著上限、啟動(dòng)和編譯時(shí)間有沒有悄悄變長(zhǎng)、最近有沒有發(fā)生過(guò)異常關(guān)機(jī)。第三明確什么時(shí)候才該清緩存。只在出現(xiàn)異?,F(xiàn)象時(shí)用第二節(jié)的方法清理平時(shí)不要為了保持干凈而頻繁清——重建索引的成本比緩存文件本身占的空間大得多。下面這張動(dòng)圖演示的就是內(nèi)存指示器的開啟位置和手動(dòng)回收的操作。收尾三個(gè)常見誤區(qū)以及下一步可以做什么最后把最容易踩的三個(gè)坑說(shuō)清楚避免優(yōu)化變成幫倒忙。誤區(qū)一內(nèi)存參數(shù)越大越好。堆設(shè)得過(guò)大垃圾回收的停頓反而更長(zhǎng)還會(huì)擠壓系統(tǒng)和瀏覽器等其他程序。正確做法是夠用即可并留出富余回到第三節(jié)的總原則去選。誤區(qū)二一卡就清緩存。清理要重建索引代價(jià)不低只應(yīng)在確認(rèn)緩存或索引異常時(shí)使用。日??D優(yōu)先檢查內(nèi)存和索引范圍而不是動(dòng)不動(dòng)就全清重啟。誤區(qū)三把整個(gè)項(xiàng)目根目錄都交給 IDE 索引。生成目錄、第三方依賴庫(kù)該排除就排除讓索引集中火力在源代碼上。接下來(lái)可以做的有兩件事一是如果你和我一樣系統(tǒng)盤吃緊去研究一下把緩存目錄整體遷移到其他分區(qū)的方法一勞永逸二是如果你的項(xiàng)目慢在構(gòu)建本身比如 Maven 拉依賴、打包耗時(shí)長(zhǎng)那是另一個(gè)話題重點(diǎn)要看構(gòu)建工具自身的配置比如線程數(shù)和本地倉(cāng)庫(kù)路徑本文不再展開。一句話行動(dòng)建議挑一個(gè)不那么趕工的時(shí)間段先做第二節(jié)的緩存清理一周后如果問(wèn)題復(fù)發(fā)再依次檢查第三節(jié)的內(nèi)存參數(shù)和第四節(jié)的索引范圍。這三步走完絕大多數(shù)大型項(xiàng)目卡頓都能有明顯改觀。【免費(fèi)下載鏈接】IntelliJ-IDEA-TutorialIntelliJ IDEA 簡(jiǎn)體中文專題教程項(xiàng)目地址: https://gitcode.com/gh_mirrors/in/IntelliJ-IDEA-Tutorial創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考