Trong khi thay đổi kích thước các bitmap lớn để tải lên hình ảnh nhanh hơn lên máy chủ, tôi thỉnh thoảng chạy vào OutOfMemoryErrors. Để ngăn chặn điều này, tôi tính toán số lượng bộ nhớ cần thiết và kiểm tra xem nó có vượt quá Runtime.getRuntime(). MaxMemory() trước khi cố gắng mở rộng một hình ảnh.Heap không mở rộng trên trình giả lập Genymotion
Tuy nhiên, tôi vẫn gặp lỗi OOM mặc dù hình ảnh phải vừa với heap dễ dàng.
Thiết bị mô phỏng (Galaxy SII API 16) cho tôi bộ nhớ tối đa 67108864 byte bằng phương pháp trên.
Trong đoạn mã sau, kích thước heap là 43975K và chỉ < 15K bộ nhớ đó đang được sử dụng. Đối với việc phân bổ ~ 31K của tôi, vùng heap sẽ tự động tăng lên khoảng 45K mà vẫn không gần với kích thước tối đa 64 MiB. Nhưng như bạn có thể thấy, thay vì mở rộng heap, valvik vm hết bộ nhớ.
10-13 20:35:57.223: D/dalvikvm(1201): GC_FOR_ALLOC freed 505K, 67% free 14692K/43975K, paused 31ms, total 31ms
10-13 20:35:57.223: I/dalvikvm-heap(1201): Forcing collection of SoftReferences for 31961100-byte allocation
10-13 20:35:57.251: D/dalvikvm(1201): GC_BEFORE_OOM freed 2K, 67% free 14689K/43975K, paused 29ms, total 29ms
10-13 20:35:57.251: E/dalvikvm-heap(1201): Out of memory on a 31961100-byte allocation.
Tôi tự hỏi liệu điều này có thể xảy ra trên thiết bị thực hay nếu đây có thể là lỗi về gen.
Heap có được đảm bảo mở rộng tối đa maxMemory() không? JavaDoc cho Runtime.getRuntime(). FreeMemory() nói rằng "có thể" mở rộng, điều đó có nghĩa là gì.
Tôi chỉ cần một cách đáng tin cậy để tính toán dung lượng bộ nhớ Tôi có thể sử dụng, đây là cách tôi đã làm nó, hãy sửa lại cho tôi nếu tôi sai:
long maxMemory = Runtime.getRuntime().maxMemory();
long usedMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
long availableMemory = maxMemory - usedMemory;
gọi này làm cho OutOfMemoryError:
// outOptions has an appropriate inSampleSize
BitmapFactory.decodeStream(inputStream, null, outOptions);
Bạn đã giải quyết được sự cố này chưa? – KinGPinG
Thật không may là không. Bất kỳ ý tưởng? – wkarl
Không, tôi xin lỗi tôi vẫn đang xử lý nó. Tôi sẽ cho bạn biết nếu tôi tìm thấy một cái gì đó hữu ích. – KinGPinG