最近被 Android Studio 越來越卡的問題給繃住了,明明用得不多,大多數只是打開在背景放著,偶爾需要才過去做一些手動修改,**但是經常是要用的時候就發現這玩意變得超卡**,明明記憶體也沒吃滿,這就很奇怪了,乾脆把它的日誌丟給 AI 分析了一下,結果發現:
大概率是 Copilot 外掛和 JetBrains AI 外掛導致,雖然現在我很久沒用它們了。
首先從日誌可以發現,Copilot 和 JetBrains AI 都不是我用了才工作,而是兩個外掛自己就一直在工作,不過這兩個東西活躍的方式還不太一樣:
日誌可以顯示「它們一直在活動」,就算我沒怎麼去用它。
比如 Copilot,主要就有 3 類日誌:
最明顯的日誌就是這一類:
bash 体验AI代码助手 代码解读复制代码ActionUpdater - 468 ms to grab EDT for InspectionWidgetContentExclusionAction#presentation@EditorInspectionsToolbar (com.github.copilot.status.InspectionWidgetContentExclusionAction)
WARN - ActionUpdater - 3230 ms total to grab EDT 4 times to expand EditorMarkupModelImpl$StatusToolbarGroup#expandGroup@EditorInspectionsToolbar
WARN - ActionUpdater - 9817 ms total to grab EDT 5 times to expand ToolWindowHeader$2#expandGroup@ToolwindowTitle
這類記錄反覆出現,而且不是幾次,是大量重複,幾千次,這些呼叫很多次都要搶 EDT,也就是 UI 主執行緒,然後它一直在工作,也就直觀導致了「我沒幹什麼,但 IDE 還是越來越黏」的情況,從日誌上看:
com.github.copilot.status.InspectionWidgetContentExclusionAction 是 Copilot 在編輯器檢查工具列上的一個動作而且 freeze dump 裡主執行緒 AWT-EventQueue-0 也是提示卡在:
arduino 体验AI代码助手 代码解读复制代码com.intellij.openapi.actionSystem.impl.ActionUpdater
com.intellij.util.containers.FList.get
另外 Copilot 還有一個維護自己的語言服務程序,這也是導致卡頓的元兇之一,在 freeze dump 裡能看到:
arduino 体验AI代码助手 代码解读复制代码"BaseDataReader: output stream of copilot-language-server.exe" "BaseDataReader: error stream of copilot-language-server.exe" "copilot-language-server.exe"
另外就是 Copilot 維護檔案監聽器和專案級資源,在日誌裡還有這類內容:
bash 体验AI代码助手 代码解读复制代码com.github.copilot.mcp.service.McpFileListenerService$startWatchingConfigFile... com.github.copilot.copilotInstructions.service.CopilotInstructionsFileListenerService$startWatchingConfigFile...
在關閉專案時還有:
arduino 体验AI代码助手 代码解读复制代码ProjectCloseListener - Cleaning up session ID for closed project: ... File watcher stopped during disposal
也就是說它有專案級 session 生命週期管理,即使不用,但是專案開多了,就會有越多 session 監聽環境和專案狀態變化。
另外一個是 JetBrains AI 這邊,就算你不用,它也是一直在工作,最典型的是這些週期性檢查 quota/配額/refill 狀態:
sql 体验AI代码助手 代码解读复制代码QuotaManager2Impl - Updating quota refill state QuotaManager2Impl - Quota update requested QuotaManager2Impl - New quota state is: Available(...) QuotaManager2Impl - Quota info is ... trying to update it every 6 minutes
還有大量這種重複錯誤:
vbnet 体验AI代码助手 代码解读复制代码New quota refill state is: Error(exception=com.intellij.ml.llm.core.quota.ResultDoesNotMatchConditionException...)
這裡最關鍵的還不是錯誤本身,而是「它一直在重試」,從時間上看,很多記錄是按固定間隔不斷出現的:
另外外掛也會一直維護 AI 啟用、授權、帳號、設定狀態,在 freeze dump 裡能看到很多 com.intellij.ml.llm 的活躍協程和狀態物件,比如:
kotlin 体验AI代码助手 代码解读复制代码com.intellij.ml.llm.activation.state.impl.AiaActivationManagerImpl com.intellij.ml.llm.matterhorn.activation.state.junie.data.IdeLicenseStore com.intellij.ml.llm.matterhorn.activation.state.junie.data.JbaUserStore com.intellij.ml.llm.matterhorn.activation.state.junie.data.AieProvisionStore
還有:
体验AI代码助手 代码解读复制代码com.intellij.ml.llm.core.chat.services.AIAssistantServiceApplicationScope com.intellij.ml.llm.core.quota.QuotaManager2Impl
這說明 JetBrains AI 也不只是一個「打開聊天視窗才初始化」的存在,它也是應用程式層級就有常駐服務,而且這些執行緒很多顯示為 Active。
最誇張的一個日誌,.duration 檔案內容是 21781,也就是約 6 小時,日誌顯示就是卡在:
swift 体验AI代码助手 代码解读复制代码"AWT-EventQueue-0" prio=0 tid=0x0 nid=0x0 runnable
java.lang.Thread.State: RUNNABLE
at com.intellij.util.containers.FList.get(FList.java:37)
at com.intellij.util.containers.ContainerUtil$2.get(ContainerUtil.java:389)
at [email protected]/java.util.AbstractList$Itr.next(Unknown Source)
at com.intellij.openapi.actionSystem.Presentation.doFirePropertyChange(Presentation.java:556)
at com.intellij.openapi.actionSystem.Presentation.fireObjectPropertyChange(Presentation.java:551)
at com.intellij.openapi.actionSystem.Presentation.setIconSupplier(Presentation.java:320)
at com.intellij.openapi.actionSystem.Presentation.copyFrom(Presentation.java:618)
at com.intellij.openapi.actionSystem.Presentation.copyFrom(Presentation.java:593)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.applyPresentationChanges(ActionUpdater.kt:116)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.expandActionGroup$lambda$0(ActionUpdater.kt:253)
at com.intellij.openapi.actionSystem.impl.ActionUpdater$computeOnEdt$deferred$1.invokeSuspend$lambda$0(ActionUpdater.kt:453)
at com.intellij.openapi.application.ActionsKt.runReadAction$lambda$0(actions.kt:25)
at com.intellij.platform.locking.impl.NestedLocksThreadingSupport.runReadAction(NestedLocksThreadingSupport.kt:855)
at com.intellij.openapi.application.impl.ApplicationImpl.runReadAction(ApplicationImpl.java:1064)
at com.intellij.openapi.actionSystem.impl.ActionUpdater$computeOnEdt$deferred$1.invokeSuspend(ActionUpdater.kt:452)
所以很明顯是編輯器檢查欄/工具列刷新時,某些外掛動作也被一起計算,結果把主執行緒拖慢了,主執行緒長期卡在 UI action 更新鏈路裡,導致 Studio 凍結。
所以問題核心在於現在的 AI 外掛,它們靜默的情況下貌似也在持續工作,甚至不知不覺給你搞出 freeze,另外 Gemini 的我沒試,但是結論很明顯,卸載 JetBrains AI Chat 和 Copilot Plugin,因為現在都用 Copilot CLI 了,誰還在 Android Studio 裡用外掛。
自從刪了之後,明顯 Android Studio 表現好了不少,現在放了兩天也沒出現越放越卡的情況,所以如果你的 Android Studio 用起來特別卡,而且沒怎麼用,只是光放著就越放越卡,那麼可以嘗試把這些沒用的外掛都卸了,現在的 AI 情況,IDE 用來做 Review 和簡單調整也不需要它們了。