Trình tắt ứng dụng khi bộ nhớ thấp

Nền tảng Android hoạt động trên cơ sở bộ nhớ trống là bộ nhớ bị lãng phí. Android luôn cố gắng sử dụng tất cả bộ nhớ có sẵn. Ví dụ: sau khi các ứng dụng đã đóng, hệ thống sẽ vẫn lưu giữ chúng trong bộ nhớ để người dùng có thể nhanh chóng chuyển về ứng dụng khi được mở lại. Vì lý do này, các thiết bị Android thường chạy với rất ít bộ nhớ trống (xem phần Phân bổ bộ nhớ Android tại đây).

Quy trình trình nền low memory killer (LMK) của Android sẽ giám sát trạng thái bộ nhớ của một hệ thống Android đang chạy và phản ứng với áp lực bộ nhớ cao bằng cách tắt các quy trình ít cần thiết nhất để hệ thống hoạt động ở mức chấp nhận được.

Để quyết định cần loại bỏ quy trình nào, trình nền LMK sẽ sử dụng điểm hết bộ nhớ được gọi là oom_adj_score để ưu tiên các quy trình đang chạy. Những quy trình có điểm cao sẽ bị xoá trước. Ứng dụng nền sẽ bị loại bỏ đầu tiên; các quy trình hệ thống sẽ bị loại bỏ sau cùng. Bảng sau đây liệt kê các danh mục có điểm LMK từ cao đến thấp. Các mục trong danh mục có điểm số cao nhất ở hàng một sẽ bị xoá trước:

Các quy trình của Android được xếp hạng từ điểm cao nhất đến điểm thấp nhất: Ứng dụng nền, ứng dụng trước, ứng dụng màn hình chính, dịch vụ, ứng dụng có thể nhận biết, ứng dụng trên nền trước, ứng dụng liên tục, hệ thống và ứng dụng gốc.
Hình 1. Các quy trình của Android, với điểm cao ở trên cùng và điểm thấp ở dưới cùng.

Công cụ phân tích bộ nhớ

Các công cụ sau đây có thể giúp bạn tìm và chẩn đoán các vấn đề về bộ nhớ theo những cách sau:

  • Xem cách ứng dụng của bạn phân bổ bộ nhớ theo thời gian. Bạn có thể xem biểu đồ theo thời gian thực về mức sử dụng bộ nhớ của ứng dụng, số lượng đối tượng Java được phân bổ và thời điểm thu gom rác.
  • Hãy bắt đầu các sự kiện thu thập rác và chụp nhanh vùng nhớ khối xếp Java trong khi ứng dụng của bạn chạy.
  • Ghi lại quy trình phân bổ bộ nhớ của ứng dụng, kiểm tra tất cả đối tượng được phân bổ và xem dấu vết ngăn xếp của từng lượt phân bổ.

Nếu trò chơi của bạn đang chạy trên một công cụ gốc, hãy sử dụng HWAddress Sanitizer để gỡ lỗi việc phân bổ bộ nhớ gốc.

Trình phân tích bộ nhớ của Android Studio

Android Studio cung cấp Trình phân tích bộ nhớ dưới dạng một thành phần của Trình phân tích tài nguyên Android. Thành phần này giúp bạn xác định tình trạng rò rỉ bộ nhớ và tình trạng nhồi nhét bộ nhớ có thể khiến ứng dụng của bạn kết xuất gián đoạn, bị treo và thậm chí gặp sự cố. Trình phân tích tài nguyên cho thấy biểu đồ theo thời gian thực về mức sử dụng bộ nhớ của ứng dụng, đồng thời cho phép bạn ghi lại tệp báo lỗi, buộc thu thập rác và theo dõi hoạt động phân bổ bộ nhớ.

Hình 2. Xem các lượt tham chiếu JNI toàn cục trong Trình phân tích bộ nhớ của Android Studio.

Công cụ phân tích bộ nhớ của Unity

Nếu đang dùng Unity Engine để tạo ứng dụng, bạn có thể làm theo hướng dẫn phân tích bộ nhớ của Unity. Unity cung cấp 2 công cụ để phân tích mức sử dụng bộ nhớ trong ứng dụng của bạn trong Unity.

Đầu tiên là mô-đun Trình phân tích bộ nhớ, đây là một trình phân tích tài nguyên tích hợp sẵn, cung cấp cho bạn thông tin cơ bản về vị trí ứng dụng sử dụng bộ nhớ.

Mô-đun bộ nhớ cho biết mức phân bổ bộ nhớ, chẳng hạn như bộ nhớ hoạ tiết và bộ nhớ lưới.
Hình 3. Cửa sổ Unity Profiler có mô-đun Memory (Bộ nhớ) được chọn.

Công cụ thứ hai là gói Trình phân tích bộ nhớ. Đây là một gói Unity mà bạn có thể thêm vào dự án của mình. Gói này sẽ thêm một cửa sổ Trình phân tích bộ nhớ khác vào Trình chỉnh sửa Unity. Trình phân tích bộ nhớ cho phép bạn phân tích mức sử dụng bộ nhớ trong ứng dụng của mình một cách chi tiết hơn. Bạn có thể lưu trữ và so sánh các ảnh chụp nhanh để tìm ra tình trạng rò rỉ bộ nhớ hoặc xem bố cục bộ nhớ để tìm ra các vấn đề về phân mảnh bộ nhớ.

Hình 4. Phân tích thông tin tổng quan nhanh về bộ nhớ bằng cửa sổ Trình phân tích bộ nhớ.

Unreal Memory Insights

Các ứng dụng do Unreal Engine tạo có thể sử dụng Unreal Memory Insights để xem thông tin chi tiết về việc phân bổ và giải phóng bộ nhớ, bao gồm cả thẻ Low Level Memory (LLM) và ngăn xếp lệnh được liên kết với các khối bộ nhớ.

Hệ thống truy vấn Thông tin chi tiết về bộ nhớ có thể tìm thấy các hoạt động phân bổ trực tiếp tại bất kỳ thời điểm nào, xác định các thay đổi về mức sử dụng bộ nhớ, xác định vị trí rò rỉ bộ nhớ và phân biệt các hoạt động phân bổ ngắn hạn với dài hạn.

Từ UE 5.4, Memory Insights hỗ trợ tính năng theo dõi bộ nhớ bằng callstack cho các dự án Android.

Trình theo dõi Thông tin chi tiết về bộ nhớ cho thấy biểu đồ bộ nhớ chính, số lượng phân bổ trực tiếp và số lượng sự kiện phân bổ/giải phóng.
Hình 5. Trình theo dõi Thông tin chi tiết về bộ nhớ của Unreal.

Thông tin chi tiết về bộ nhớ thấp

Android cung cấp các lệnh gọi lại và API cho phép bạn giảm yêu cầu về bộ nhớ của trò chơi và xác định lý do khiến các lần chạy trò chơi trước đó bị chấm dứt.

Lệnh gọi lại

Không đăng ký các lệnh gọi lại trim không dùng nữa. Android không có API nào để phát hiện các sự kiện áp lực bộ nhớ gốc khi hệ thống sắp hết bộ nhớ. Các lệnh gọi lại cắt bớt không giúp ngăn chặn tình trạng hệ thống huỷ các tiến trình do thiếu bộ nhớ, vì vậy, Android đã ngừng sử dụng tất cả các lệnh gọi lại này, ngoại trừ TRIM_MEMORY_UI_HIDDENTRIM_MEMORY_BACKGROUND.

Chấm dứt trò chơi

Android cố gắng sử dụng tất cả bộ nhớ có sẵn để lưu vào bộ nhớ đệm các ứng dụng và trò chơi nhằm đảm bảo chúng tải nhanh (cải thiện trải nghiệm người dùng). Tuy nhiên, khi bộ nhớ bị hạn chế, hệ thống sẽ tắt các ứng dụng và trò chơi tiêu tốn nhiều bộ nhớ nhất để giải phóng bộ nhớ cho hoạt động bình thường của thiết bị.

Thông tin, thông tin chi tiết và các phương pháp hay nhất giúp bạn sử dụng bộ nhớ trò chơi hiệu quả hơn, bao gồm:

  • Sử dụng ApplicationExitInfo: API này trả về lý do khiến hệ thống Android huỷ phiên chạy trò chơi trước đó. Sử dụng ApplicationExitInfo để kiểm tra xem có phải do bộ nhớ thấp nên quá trình chạy trước đó đã bị dừng hay không. Kiểm tra xem trò chơi có bị dừng do hết bộ nhớ hay không để có thể tối ưu hoá trò chơi nhằm sử dụng ít bộ nhớ hơn trên thiết bị đó.
  • Xem tổng RAM vật lý: Để ngăn trò chơi bị huỷ khi ở nền trước và để phù hợp với các chức năng của thiết bị, hãy xem tổng RAM vật lý trên mỗi thiết bị để điều chỉnh mức sử dụng bộ nhớ của trò chơi dựa trên mức độ chi tiết đó. Nếu mục tiêu là ngăn các ứng dụng bị tắt ngay sau khi chuyển sang chế độ nền (để cho phép người chơi thực hiện nhiều việc cùng lúc), hãy sử dụng các lệnh gọi lại trim (cụ thể là TRIM_MEMORY_UI_HIDDEN) để giảm mức sử dụng bộ nhớ của trò chơi.

Tài nguyên khác