2016-01-05 16 views
5

Tôi đã nhận được báo cáo sự cố lạ sau đây cho Ứng dụng Android của tôi từ Google Play (lưu ý số lượng phân bổ so với dung lượng trống có sẵn) -java.lang.OutOfMemoryError trên Android 5.0, gây ra bởi phân bổ 16k khi 5M có sẵn

java.lang.OutOfMemoryError: Failed to allocate a 16396 byte allocation with 5746272 free bytes and 111MB until OOM 
    at com.android.internal.util.FastXmlSerializer.<init>(FastXmlSerializer.java:55) 
    at com.android.internal.util.XmlUtils.writeMapXml(XmlUtils.java:183) 
    at android.app.SharedPreferencesImpl.writeToFile(SharedPreferencesImpl.java:597) 
    at android.app.SharedPreferencesImpl.access$800(SharedPreferencesImpl.java:51) 
    at android.app.SharedPreferencesImpl$2.run(SharedPreferencesImpl.java:512) 
    at android.app.SharedPreferencesImpl.enqueueDiskWrite(SharedPreferencesImpl.java:533) 
    at android.app.SharedPreferencesImpl.access$100(SharedPreferencesImpl.java:51) 
    at android.app.SharedPreferencesImpl$EditorImpl.commit(SharedPreferencesImpl.java:455) 
    at com.headuck.headuckblocker.bj.a(Unknown Source) 
    at com.headuck.headuckblocker.UpdateService.e(Unknown Source) 
    at com.headuck.headuckblocker.UpdateService.a(Unknown Source) 
    at x.a.onHandleIntent(Unknown Source) 
    at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:145) 
    at android.os.HandlerThread.run(HandlerThread.java:61) 

Tôi biết một số câu hỏi OutOfMemoryError trên SO, nhưng dường như không có câu hỏi nào trong số đó do phân bổ byte nhỏ hơn nhiều so với không gian trống khả dụng.

Người dùng đang sử dụng Galaxy S5 trên Android 5.0 và báo cáo rằng các sự cố như vậy xảy ra khi chơi trò chơi (và trò chơi nào không quan trọng) - tôi nhận thấy điều này lặp lại bất cứ khi nào anh ấy/cô ấy đang sử dụng ứng dụng bộ nhớ khác trong nền trước và dịch vụ nền của Ứng dụng của tôi được lên lịch để chạy. Là một báo cáo trên Google Play, tôi không có phương tiện nào khác để có thêm chi tiết.

Câu hỏi của tôi là, điều gì có thể khiến điều này xảy ra và mọi biện pháp mà ứng dụng có thể thực hiện để tránh điều đó?

Một số nền (trong trường hợp này có liên quan): sự cố ở trên là từ dịch vụ nền được lập lịch định kỳ của Ứng dụng của tôi, không liên quan đến bất kỳ giao diện người dùng/bitmap nào. Tất cả những gì nó làm là tải xuống dữ liệu từ máy chủ và cập nhật cơ sở dữ liệu/trạng thái. Nó chạy mà không có bất kỳ vấn đề trong máy 5 năm tuổi với RAM ít hơn nhiều, và nên rất nhẹ trên bộ nhớ theo các tiêu chuẩn của điện thoại Android hiện đại. Ví dụ trên xảy ra tại một điểm sau khi cập nhật cơ sở dữ liệu và dịch vụ đang viết trạng thái cập nhật cho tùy chọn được chia sẻ.

Chỉnh sửa: chỉ cần đọc OutOfMemoryError in android on allocation 4Mb when 10Mb is free được liên kết với câu hỏi này sau khi đăng, nhưng nó chỉ xuất hiện khá không thể xảy ra mà không gian trống có sẵn có thể bị phân mảnh trong trường hợp này? Có nguyên nhân nào khác không?

+0

https://github.com/facebook/fresco/issues/404 https://github.com/facebook/fresco/issues/159 –

Trả lời

0

nếu bạn đang sử dụng Android Studio, sau đó thêm "LargeHeap = true" vào tệp kê khai của bạn.

Như thế này;

android: largeHeap = "true"

+0

Cảm ơn nhưng vấn đề không phải là dịch vụ của tôi đặc biệt là bộ nhớ đói, vì vậy đó chắc chắn là một quá giết, và không phải là một đề nghị thực hành http://stackoverflow.com/questions/27396892/androidlargeheap-true-in-mainifast-advantages – headuck

+0

tôi không nghĩ vậy nên tốt hơn là thêm phần lớn vào đúng. và theo stacktrace không có hoạt động bitmap nào được thực hiện để gây ra oom.http: //stackoverflow.com/questions/27396892/androidlargeheap-true-in-mainifast-advantages – mcd

0

tôi đã phải đối mặt với vấn đề tương tự. Đây là những gì tôi đã làm để giải quyết nó

  1. Tạo một thư mục drawable-nodpi mới trong res của bạn/thư mục
  2. Move tất cả "hình ảnh" trong thư mục/drawable đến/thư mục drawable-nodpi

Hy vọng điều này sẽ giúp ai đó :)

+0

Cảm ơn, có lẽ hữu ích cho người khác nhưng trong trường hợp cụ thể của tôi, một quá trình nền mà không sử dụng bất kỳ drawable, vì vậy điều này là không áp dụng đối với tôi. – headuck

Các vấn đề liên quan