java.lang.OutOfMemoryError: Failed to allocate a 582912 byte allocation with 75624 free bytes and 73KB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.BitmapFactory.nativeDecodeAsset(...)
at android.graphics.drawable.Drawable.createFromResourceStream(...)
at android.view.LayoutInflater.inflate(...)
at com.haoming.hm_xzt.app.LoginActivity.onCreate(LoginActivity.java:21)
關鍵點:
LoginActivity.onCreate 膨脹佈局時。android:src="@drawable/xxx"、ImageView)在膨脹時會被 BitmapFactory 解碼為 Bitmap。寬 × 高 × 4 字節。例如 3000×2000 像素 → 24 MB。drawable-nodpi 或 raw 目錄放入原圖,代碼中使用 BitmapFactory.decodeStream 配合 inSampleSize 按需縮放。| 庫 | 特點 | 適用場景 |
|---|---|---|
| Glide | 自動縮放、緩存、生命周期感知、GIF 支持好 | 通用圖片加載,Google 官方推薦 |
| Picasso | API 簡潔、自動縮放 | 輕量項目 |
| Fresco (Facebook) | 共享內存 (Ashmem)、極大圖支持、WebP、漸進式加載 | 超大圖、長列表、低端機優化 |
| Coil (Kotlin) | 協程原生、輕量、現代 API | Kotlin 項目 |
XML 中不再寫 android:src,改用 tools:src 預覽,運行時由庫異步加載:
Glide.with(this).load(R.drawable.big_image).into(imageView);
<application
android:largeHeap="true"
... >
可申請更大堆(如 512MB),但不解決根本問題,且低端機可能無效,Google Play 審核可能關注此標誌。
// 僅在確定不再使用時
if (bitmap != null && !bitmap.isRecycled()) {
bitmap.recycle();
bitmap = null;
}
現代庫已自動管理,手動 recycle() 易導致「Canvas: trying to use a recycled bitmap」崩潰,不建議。
drawable 目錄下圖片分辨率與檔案大小,刪除/替換超大圖。src 引用。inSampleSize 手動解碼縮放,或拆分為可重複紋理 + 純色背景。Android Profiler → Memory 實時監控堆內存,驗證優化效果。「Android Studio 內存不足」是誤診,**真兇是 App 運行時因超大圖片解碼導致 OOM**。核心對策:縮放圖片至合理尺寸 + 使用成熟圖片庫異步加載。Fresco 在極端大圖場景下表現最佳,Glide 綜合體驗最優,按項目技術棧選擇即可。