手機越用越慢不是記憶體不夠:Android 的 TRIM 與 UFS 壽命怎麼看
換句話說,這些工具讓你「看到」記憶體變多,卻讓手機「實際」變慢。這也是為什麼每次清理完當下很順,過幾小時又打回原形——因為你並沒有解決任何根本問題。
1.3 真正拖慢手機的五個因素
以維修與實測經驗來看,Android 手機在使用 12~24 個月後出現的「慢性變慢」,通常由以下五個因素疊加造成。注意,只有最後一項與 RAM 有關。
因素
典型症狀
影響程度
儲存空間接近滿載(>90%)
全域卡頓、相機存檔慢、App 更新失敗
極高
UFS 垃圾回收與寫入放大惡化
隨機讀寫延遲上升、開啟 App 變慢
背景服務、喚醒鎖與同步風暴
待機耗電、發熱、滑動掉幀
電池老化導致電壓不穩與降頻
電量低時效能懸崖式下降
中高
RAM 不足導致後台重啟
切換 App 要重讀、多工失效
這張表的重點是:前兩項都與儲存晶片有關,而且它們會互相惡化。空間越滿,垃圾回收越沒效率;垃圾回收越沒效率,寫入放大越嚴重,控制器就越忙,延遲就越高。這就是「越用越慢」的技術本質。
二、NAND Flash、UFS 與寫入壽命的物理極限
要談 TRIM 與壽命,得先理解手機裡的儲存晶片是什麼東西。它不是硬碟,沒有旋轉盤,也沒有磁頭;它是一塊由數十億個浮閘晶胞組成的快閃記憶體。
2.1 從 NAND 顆粒講起:P/E Cycle 與抹除的代價
NAND Flash 的寫入方式很特別:它只能「整塊抹除、分頁寫入」。讀取與寫入的單位是 Page(常見 4KB~16KB),但抹除的單位是 Block(常見 2MB~8MB,內含數百個 Page)。這代表一件關鍵的事:你沒辦法只改一個 Page,必須把整個 Block 搬出來、改好、再寫回去。
每次 Block 被完整抹除再寫入,稱為一次 P/E Cycle(Program/Erase Cycle)。NAND 晶胞的絕緣層會隨每次抹寫而累積損耗,超過額定次數後就會出現位元錯誤甚至壞塊。目前手機主流使用 TLC(Triple-Level Cell,每晶胞存 3 bit),消費級 TLC 的 P/E 額定值大約落在 1,000~3,000 次之間,視製程與 3D 堆疊層數而定。
聽起來很少?換算一下:一顆 256GB 的 TLC UFS,理論總寫入量約為 256GB × 2,000 次 ÷ 寫入放大倍率。若寫入放大控制在 3 倍,就是約 170TB 的寫入壽命。以每天寫入 20GB 計算,可以撐超過 20 年。所以對絕大多數使用者來說,「把 UFS 寫壞」不是現實風險;真正的問題是「在還沒寫壞之前,效能就先垮了」。
2.2 UFS 是什麼?和 eMMC、和電腦 SSD 的差異
UFS(Universal Flash Storage)是手機目前主流的儲存介面標準。它與舊世代的 eMMC 最大差別在於「全雙工」與「多通道」:eMMC 是半雙工、單通道,讀寫不能同時進行;UFS 採用 MIPI M-PHY 序列介面,支援命令佇列(Command Queue),可以同時排入多個讀寫請求並平行處理。
與電腦 SSD 相比,UFS 的架構其實非常相似:同樣有 FTL(Flash Translation Layer)、同樣需要 GC、同樣有 DRAM 快取(或 HMB/HPB)。差別在於手機的控制器資源更緊、功耗限制更嚴,而且手機的使用模式是「長時間待機、短時間大量寫入」,這讓垃圾回收的時機變得非常關鍵。
2.3 FTL、抹除區塊與 GC:讓手機「越用越慢」的機械核心
你在手機裡看到的「檔案」是邏輯位址(LBA),但 NAND 上實際存放的位置是實體位址(PBA)。負責把兩者對應起來的,就是 FTL。當你覆寫一個檔案時,FTL 不會去改舊位置的資料,而是把新資料寫到另一個乾淨的 Page,然後把舊 Page 標記為「無效」。這個技巧叫 Copy-on-Write,是延長壽命的關鍵。
問題來了:無效的 Page 會越積越多,散落在各個 Block 裡。當控制器需要新的空間時,就必須啟動垃圾回收——挑一個「無效 Page 比例最高」的 Block,把裡面還有用的 Page 複製到別處,再整塊抹除。這個過程會產生額外的寫入,也就是寫入放大(Write Amplification, WAF)。
WAF 的計算方式是:NAND 實際寫入量 ÷ 主機(手機)請求寫入量。理想值是 1.0,實務上手機在正常使用下大約 2~4。但當儲存空間使用率超過 90% 時,控制器能挪用的乾淨 Block 變少,GC 只能被迫更頻繁地搬移資料,WAF 可能飆到 6 甚至 10 以上。這正是「手機快滿了就會變慢」的技術解釋。
2.4 Over-Provisioning 與「剩餘空間就是效能」
SSD 與 UFS 都會保留一塊使用者看不到的空間,稱為 Over-Provisioning(OP),用來做為 GC 的緩衝區。但手機的 OP 比例通常比電腦 SSD 保守(因為要賣容量),所以使用者可見的剩餘空間就變得格外重要。
實務建議:永遠保留 15%~20% 的可用空間。以 128GB 機型計算,至少留 20GB;256GB 機型至少留 35GB。低於這個水位,系統就會開始感受到明顯的寫入延遲,而這種延遲在隨機讀寫(例如開啟 App、載入資料庫)時最容易被使用者感知。
三、TRIM 的全貌:Android 怎麼告訴快閃記憶體「這一格空了」
理解了 GC 與寫入放大,就可以進入本文的核心:TRIM。這個指令的存在意義,說穿了就是「幫控制器省掉一次不必要的搬移」。
3.1 沒有 TRIM 的世界:寫入放大與效能雪崩
當你在系統中刪除一個檔案,作業系統做的事情只是「把檔案系統表格中的那一筆記錄標記為可用」,資料本身還留在 NAND 上。對 FTL 來說,那些 Page 仍然是「有效資料」——因為它不知道檔案已經被刪了。
於是災難發生:當 GC 要回收某個 Block 時,它會把這些「其實已經被刪除」的 Page 也一起搬移到新位置,白白浪費一次寫入。這不僅拖慢效能,還浪費壽命。長期下來,控制器會越來越難找到乾淨的 Block,延遲就會上升。
TRIM 的作用,就是讓檔案系統在刪除檔案後,主動告訴儲存控制器:「這些邏輯位址的資料已經無效了,你可以直接丟掉。」控制器收到後,會把對應的 Page 標記為無效,GC 時就不必搬移它們。
3.2 TRIM、DISCARD、UNMAP、FITRIM 的差別
這幾個名詞經常被混用,但它們其實分屬不同層次:
TRIM:ATA 指令集中的術語,源自 SATA SSD。
discard)即時觸發,也可由使用者主動執行。換句話說,TRIM 是「指令」,DISCARD 是「動作」,FITRIM 是「批次介面」。你手上的 Android 手機,做的就是定期執行 FITRIM,把整塊 /data 分區的無效區塊一次通報給 UFS 控制器。
3.3 Android 的 fstrim 是怎麼被排程的
Android 從 4.3 開始支援 fstrim,並在後續版本中把它納入「閒置維護(Idle Maintenance)」機制。運作邏輯大致如下:
系統偵測裝置是否處於「充電中 + 螢幕關閉 + 長時間閒置」的狀態。
工作內容包含 fstrim,對 /data 與其他可捨棄分區執行 FITRIM ioctl。
執行週期預設約為每 24 小時一次,但各家 OEM 可能調整。
這個設計很聰明:它把耗時且會產生寫入的維護工作,安排在手機最不可能被使用的時段。但也因此,如果你的充電習慣很差(例如永遠在低電量才充、或睡前不插電),fstrim 可能很久才跑一次,垃圾回收就會累積。
3.4 為什麼你的手機 TRIM 可能從沒跑過
這是實務上最常被忽略的環節。以下幾種情況,都可能讓 fstrim 長期無法執行:
所以「我的手機有 TRIM 功能」跟「我的手機真的跑過 TRIM」是兩件事。要確認,就得實際去查紀錄——下一節會教你怎麼做。
3.5 ext4 與 F2FS 的差異
Android 早期採用 ext4,2016 年後 Pixel 系列開始導入 F2FS(Flash-Friendly File System)。F2FS 是專門為 NAND 設計的檔案系統,內建了更積極的 GC 與 discard 策略,理論上對快閃記憶體更友善。
但這也帶來一個副作用:不同機器、不同檔案系統、不同 OEM 客製化,會讓 fstrim 的實際行為差異很大。有些機型會顯示 fstrim 紀錄,有些則是透過 F2FS 的背景 GC 默默完成。這也是為什麼我們不能只看「有沒有跑 fstrim」來判斷健康度,而必須搭配 UFS 本身的健康描述元。
四、實戰:在手機上查 TRIM 紀錄與 UFS 健康度
以下操作需要一台電腦與 ADB 環境。若你還沒有,可在電腦安裝 Android SDK Platform-Tools,手機開啟「開發人員選項 → USB 偵錯」後連接即可。
4.1 前置準備:ADB 環境與基本確認
連接手機後,先在終端機輸入 adb devices,確認裝置已正確列出。接著我們可以先看整體的儲存裝置掛載狀況:
adb shell df -h /data
adb shell ls -l /dev/block/by-name
你會在 /dev/block 下看到以 sda、sdb 命名的裝置節點——這正是 UFS 走 SCSI 架構的證據。Android 的 UFS 通常被辨識為 SCSI 磁碟,因此健康資訊會出現在 scsi_device 的路徑底下。
4.2 查詢 TRIM 執行紀錄
Android 提供了 dumpsys diskstats 這個診斷指令,會列出儲存空間的統計與最近的 fstrim 紀錄。指令如下:
adb shell dumpsys diskstats
輸出中會包含類似以下的段落(實際格式依 Android 版本略有差異):
Last fstrim:
time: 2024-xx-xx xx:xx:xx
bytes trimmed: 12345678901
重點看兩件事:時間與 bytes trimmed。如果最後一次 fstrim 的時間是「好幾個月前」,代表閒置維護機制長期沒有生效;如果 bytes trimmed 一直是 0,可能是檔案系統或控制器沒有正確回報。
你也可以手動觸發一次閒置維護(部分機型需要系統權限):
adb shell sm idle-maint run
或 Android 11 以後
adb shell cmd storage run-idle-maintenance
執行後再跑一次 dumpsys diskstats,若時間更新,就代表 TRIM 正常運作。若指令回傳權限錯誤,這是正常的,多數零售機型不允許 shell 使用者觸發。
4.3 讀取 UFS 健康描述元(Health Descriptor)
UFS 標準定義了一組「健康描述元」,用來回報裝置的壽命與預警狀態。這些數值會出現在 sysfs 的 health_descriptor 目錄中。常見路徑有幾種:
# 路徑一:直接走 scsi_device
adb shell ls /sys/class/scsi_device/0:0:0:0/device/health_descriptor/
路徑二:部分 SoC 走 ufshc 平台裝置
adb shell ls /sys/devices/platform/soc/*.ufshc/health_descriptor/
若能看到目錄內容,通常會包含以下檔案:
pre_eol_info
life_time_estimation_a
life_time_estimation_b
讀取方式(示意):
adb shell cat /sys/class/scsi_device/0:0:0:0/device/health_descriptor/pre_eol_info
adb shell cat /sys/class/scsi_device/0:0:0:0/device/health_descriptor/life_time_estimation_a
需要提醒的是,多數機型的 sysfs 權限僅開放給 root 或系統服務。若你執行後得到「Permission denied」,屬於正常現象,這不是你的操作錯誤。此時可改用第三方工具,或透過 root 環境讀取。
4.4 讀懂 Pre EOL 與 Life Time Estimation
這兩個數值都是以 16 進位回報的枚舉值,換算方式如下表。先看 pre_eol_info:
數值
意義
建議動作
0x01正常(Normal)無須處理
0x00未支援或未回報改用其他指標判斷
再看 life_time_estimation_a(A 代表 SLC 快取區,B 代表 TLC 主儲存區,部分控制器只回報 A):
數值
已消耗壽命
解讀
0x010%~10%新機或輕度使用
0x0210%~20%正常
0x0320%~30%正常
0x0540%~50%中度使用,仍屬健康
0x0870%~80%需留意,建議備份
0x0A90%~100%接近壽命終點
0x0B超過 100%已超出額定寫入量
實務上,一支正常使用兩年的旗艦機,這個數值通常在 0x02~0x03 之間,也就是消耗不到 30%。會看到 0x06 以上的,多半是長期大量錄影、下載、或把儲存空間塞到爆的重度使用者。
4.5 用第三方 App 快速查看
如果你不想碰 ADB,也可以透過第三方工具查看部分資訊。常見的選擇包括 Device Info HW、AIDA64、SD Insight 等。這些 App 能顯示 UFS 型號、容量、支援的介面版本,部分機型甚至在取得 root 後能讀出健康描述元。
要注意的是,非 root 環境下能讀到的資訊有限。多數 App 只能顯示「UFS 3.1、256GB」這類規格,而不會給你 life_time_estimation。若你在 App 中看到「Health: N/A」,不是你選錯 App,而是權限限制。
五、延長 UFS 壽命、讓手機回春的具體做法
理解了機制,接下來就是可執行的改善方案。以下五點按照「效益/風險比」排序,建議從第一點開始做。
5.1 保留 15%~20% 的可用空間
這是最有效、也最容易被忽略的一招。前面提過,儲存空間使用率超過 90% 時,GC 效率會急劇下降,寫入放大會暴增。你可以這樣做:
定期清理 LINE、WeChat 的快取與過期檔案(這兩個 App 的資料庫經常膨脹到數 GB)。
把照片影片自動備份到雲端後,刪除本機副本。
移除長期沒開的遊戲(現代手遊動輒 5~15GB)。
使用系統內建的「儲存空間」分析工具,找出佔用大戶。
以 128GB 機型為例,目標是永遠維持 20GB 以上可用;256GB 機型維持 35GB 以上。這個數字不是隨便估的,而是多數控制器開始有效率的門檻。
5.2 減少不必要的寫入
快閃記憶體的壽命是以「寫入量」計算的,所以任何能減少寫入的行為都有幫助:
5.3 手動觸發 fstrim(與風險提醒)
若你確認系統的閒置維護長期未執行,可嘗試手動觸發。在具備權限的環境下(例如 root 或工程機),可執行:
adb shell fstrim -v /data
這會對 /data 分區執行 FITRIM,並回報實際丟棄的位元組數。若回傳「Operation not permitted」,代表權限不足,請勿強行操作。
風險提醒:fstrim 是安全指令,不會刪除資料,但它會強制控制器進行一次大規模的 GC 與抹除,短時間內可能造成裝置發熱與輕微卡頓。建議在電量 50% 以上、不趕時間時執行,且不要在執行過程中斷電。
5.4 系統設定調整
幾個對儲存友善的設定調整:
關閉「智慧預測」類功能中不必要的背景索引。
將相簿的「裝置上分析」設定為僅在充電時執行。
定期重開機,讓系統有機會完成延遲的維護工作。
保持系統更新,Google 與 OEM 會持續修正 fstrim 的排程邏輯。
5.5 換電池還是換手機?判斷標準
當手機變慢時,很多人直接想換機。但從技術角度看,可以先做以下判斷:
檢查可用空間:若長期低於 10%,先清理再說。
順序建議是:先清空間 → 再換電池 → 最後才考慮換機。多數「用兩年就卡」的案例,換一顆電池加上清理空間就能解決八成問題。
六、常見問題 FAQ
Q1:TRIM 會不會刪掉我的資料?
不會。TRIM 只是告訴控制器「這些區塊的資料已經無效」,它不會主動清除檔案系統中仍被標記為有效的資料。真正刪除資料的動作仍由檔案系統負責。
Q2:每天都手動跑 fstrim 好嗎?
不必要。過度頻繁的 fstrim 會讓控制器不斷進行抹除與 GC,反而增加寫入。系統預設的每 24 小時一次已經足夠,手動執行建議間隔數週以上。
Q3:UFS 健康度掉到 0x05 是不是快壞了?
0x05 代表消耗 40%~50%,仍屬健康範圍。真正需要警覺的是 0x08 以上,或 pre_eol_info 顯示 0x02/0x03。
Q4:記憶體越大手機就越不會卡嗎?
不完全。RAM 影響的是多工與後台保留能力;儲存 I/O 影響的才是全域流暢度。12GB RAM 配一顆塞滿的 UFS,一樣會卡。
Q5:舊機型沒有 UFS,只有 eMMC,怎麼辦?
eMMC 的效能與壽命本來就較低,能做的改善有限。優先順序是清空間、關閉背景同步、降低錄影解析度,並把更換裝置列入規劃。
結語
「手機越用越慢」不是玄學,也不是廠商的計畫性報廢,而是一連串可被觀測、可被量化的物理與軟體行為:NAND 的抹寫限制、FTL 的垃圾回收、檔案系統的 TRIM 通報、以及使用者自己的空間管理習慣。
下次當你覺得手機卡頓時,先別急著按「一鍵加速」。打開儲存空間看看剩下多少、用 ADB 查一下 fstrim 最後執行的時間、讀一下 UFS 的健康描述元。這些動作花不到十分鐘,卻能讓你少花一筆冤枉錢,也讓你的手機多撐一兩年。
如果你在實作過程中遇到路徑讀不到、指令被拒的情況,歡迎把機型、Android 版本與錯誤訊息貼到雅寶社區 · 頂客論壇的 3C 科技教學版,社群裡有許多實際動手過的版友可以一起協助排查。
```
💬 想說點什麼?
歡迎到留言板分享你的想法、心得或疑問。
💬 前往留言板 →