Android Studio 放著沒怎麼用,怎麼也會越來越卡?

最近被 Android Studio 越來越卡的問題給繃住了,明明用得不多,大多數只是打開在背景放著,偶爾需要才過去做一些手動修改,**但是經常是要用的時候就發現這玩意變得超卡**,明明記憶體也沒吃滿,這就很奇怪了,乾脆把它的日誌丟給 AI 分析了一下,結果發現:

大概率是 Copilot 外掛和 JetBrains AI 外掛導致,雖然現在我很久沒用它們了

首先從日誌可以發現,Copilot 和 JetBrains AI 都不是我用了才工作,而是兩個外掛自己就一直在工作,不過這兩個東西活躍的方式還不太一樣:

  • 就算沒任務,Copilot 也像是在不斷參與編輯器 UI 狀態刷新、維護語言服務和檔案監聽
  • JetBrains AI 是在持續做額度、啟用狀態、帳號/授權、設定拉取這類背景任務

日誌可以顯示「它們一直在活動」,就算我沒怎麼去用它。

比如 Copilot,主要就有 3 類日誌:

  1. 檢查欄/狀態列刷新

最明顯的日誌就是這一類:

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 在編輯器檢查工具列上的一個動作
  • ActionUpdater 在刷新工具列按鈕、狀態項時,會去呼叫它
  • 也就是可以這麼理解,就算你沒主動用 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...) 

這裡最關鍵的還不是錯誤本身,而是「它一直在重試」,從時間上看,很多記錄是按固定間隔不斷出現的:

  • 09:45:31
  • 09:46:03
  • 09:46:35
  • 09:47:07
  • 09:47:39
  • 09:48:11

另外外掛也會一直維護 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 和簡單調整也不需要它們了。


原文出處:https://juejin.cn/post/7639631116610519082


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝16   💬11   ❤️1
543
🥈
alicec
📝1   ❤️2
77
🥉
我愛JS
💬2  
7
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
📢 贊助商廣告 · 我要刊登