Tôi đã dành 4 ngày trọn vẹn để thử mọi thứ có thể để tìm ra lỗi rò rỉ bộ nhớ trong một ứng dụng mà tôi đang phát triển, nhưng mọi thứ đã ngừng hoạt động từ lâu.
Ứng dụng tôi đang phát triển có tính chất xã hội, vì vậy hãy nghĩ đến các Hoạt động (P) và liệt kê các Hoạt động kèm theo dữ liệu - ví dụ như huy hiệu (B). Bạn có thể chuyển từ hồ sơ đến danh sách huy hiệu sang hồ sơ khác, đến danh sách khác, v.v.
Vì vậy, hãy tưởng tượng một luồng như thế này P1 -> B1 -> P2 -> B2 -> P3 -> B3, v.v. Để nhất quán, tôi đang tải hồ sơ và huy hiệu của cùng một người dùng, vì vậy mỗi trang P giống nhau và tương tự mỗi trang B.
Ý chính chung của vấn đề là: sau khi điều hướng một chút, tùy thuộc vào kích thước của mỗi trang, tôi nhận được một ngoại lệ hết bộ nhớ ở những nơi ngẫu nhiên - Bitmap, Chuỗi, v.v. - có vẻ như không nhất quán.
Sau khi làm tất cả mọi thứ có thể tưởng tượng để tìm ra lý do tại sao tôi cạn kiệt bộ nhớ, tôi không nghĩ ra gì cả. Điều tôi không hiểu là tại sao Android không giết P1, B1, v.v. nếu nó hết bộ nhớ khi tải và thay vào đó bị treo. Tôi mong đợi những hoạt động trước đó sẽ chết và hồi sinh nếu tôi quay lại chúng qua onCreate () và onRestoreInstanceState ().
Hãy để một mình điều này - ngay cả khi tôi làm P1 -> B1 -> Quay lại -> B1 -> Quay lại -> B1, tôi vẫn gặp sự cố. Điều này cho thấy một số loại rò rỉ bộ nhớ, nhưng ngay cả sau khi kết xuất hprof và sử dụng MAT và JProfiler, tôi không thể xác định nó.
Tôi đã vô hiệu hóa tải hình ảnh từ web (và tăng dữ liệu thử nghiệm được tải để bù đắp và làm cho quá trình thử nghiệm trở nên công bằng) và đảm bảo rằng bộ nhớ cache hình ảnh sử dụng SoftRefferences. Android thực sự cố gắng giải phóng một số SoftRefferences mà nó có, nhưng ngay trước khi nó bị hỏng bộ nhớ.
Các trang huy hiệu lấy dữ liệu từ web, tải nó vào một mảng EntityData từ BaseAdapter và cấp nó vào ListView (Tôi thực sự đang sử dụng MergeAdapter tuyệt vời của CommonsWare , nhưng trong hoạt động Badge này, thực sự chỉ có 1 bộ điều hợp, nhưng tôi muốn đề cập đến thực tế này theo cách nào đó).
Tôi đã xem qua mã và không thể tìm thấy bất kỳ thứ gì có thể bị rò rỉ. Tôi đã xóa và vô hiệu hóa mọi thứ tôi có thể tìm thấy và thậm chí System.gc () trái và phải nhưng ứng dụng vẫn bị treo.
Tôi vẫn không hiểu tại sao các hoạt động không hoạt động có trong ngăn xếp lại không được gặt hái và tôi thực sự muốn tìm ra điều đó.
Tại thời điểm này, tôi đang tìm kiếm bất kỳ gợi ý, lời khuyên, giải pháp ... bất cứ điều gì có thể giúp.
Cảm ơn bạn.
outOfMemory
lỗi. Cảm ơn!