2012-03-11 21 views
53

Tôi đang cố gắng tìm ra lý do khiến ứng dụng của tôi đang sử dụng quá nhiều bộ nhớ. Tôi thường thấy nó sử dụng từ 15 đến 18MB, cao hơn đáng kể so với tôi mong đợi. Tôi đã xem xét kích thước heap qua DDMS và thấy điều này:Định vị và khắc phục nguyên nhân kích thước heap lớn

enter image description here

Đó nhìn một chút đáng ngờ vì ứng dụng của tôi không đối phó với hình ảnh lớn ở tất cả. Trong thực tế, tổng số tiền ký quỹ trong ứng dụng của tôi là khoảng 250KB. Vì vậy, tôi tạo ra một đống đống và sử dụng MAT để xác định vị trí nơi tất cả bộ nhớ này đã đi. byte [] mảng là cho đến nay người tiêu dùng lớn nhất, vì vậy tôi khoan xuống và nhận thấy như sau:

enter image description here

Tôi hoàn toàn không có ý tưởng tại sao sPreloadedDrawables chịu trách nhiệm cho một kích thước đống giữ lại cao như vậy. Tôi cũng không biết làm thế nào để xác định nguyên nhân gốc rễ, hoặc làm thế nào để 'sửa chữa' nó.

Tôi nên đi đâu từ đây? Ứng dụng của tôi hoạt động chủ yếu trong nền thông qua các dịch vụ không xử lý dữ liệu hình ảnh. Tôi có các Hoạt động mà người dùng có thể chọn sử dụng, nhưng một lần nữa, họ sử dụng các bản vẽ nhỏ không giải thích được kích thước heap lớn như vậy. Tôi cũng đã kiểm tra xem có bất kỳ sự cố rò rỉ nào của Hoạt động hay không, nhưng không xác định được bất kỳ sự cố nào.

EDIT: Tôi nhận thấy rằng kích thước heap thấp hơn đáng kể khi chạy trong trình mô phỏng. Điều này khá khó hiểu. :/

+1

Bạn đang chạy phiên bản Android nào ?. Tôi nhận thấy rằng ICS tải trước các hình ảnh có thể vẽ được, tôi đoán thử một trải nghiệm giao diện người dùng mượt mà hơn và tận dụng giới hạn bộ nhớ VM tăng lên. Vì vậy, nếu điện thoại của bạn là ICS và giả lập của bạn trên 2.X sẽ giải thích sự khác biệt. Cá nhân tôi đã không kiểm tra giả lập chạy 4.X để kiểm tra xem bộ nhớ tăng cao là hiện nay quá (tôi đoán một cái gì đó cho tôi để làm sau này). Nó chắc chắn có trên điện thoại của tôi chạy 4.0.3. – sciutand

+0

Điện thoại của tôi đang chạy Android 4.0.3, như trình mô phỏng. – Glitch

+0

Mật độ/kích thước màn hình nào bạn đang sử dụng trên trình giả lập so với thiết bị? – cistearns

Trả lời

44

Hệ thống sẽ tải trước tài nguyên hệ thống mặc định, điều này độc lập với tài nguyên ứng dụng của bạn, những thứ như Drawables tiêu chuẩn cho hộp kiểm và nút radio. 10.5MB có vẻ lớn nhưng có rất nhiều tài nguyên hệ thống mặc định và Hình ảnh lớn hơn một lần được lưu trữ trong bộ nhớ. Tải trước không phải là mới, nhưng kích thước của tải trước có thể lớn hơn trong ICS. Mật độ hiển thị có thể đóng một phần trong điều này cùng với việc bổ sung thêm nhiều Drawables hệ thống được tải sẵn trong ICS.

Hiện tại không có cách nào để giảm bộ nhớ được tổ chức bởi các sPreloadedDrawables

Thật là bất hạnh mà không có cách nào để xóa này sau quá trình ứng dụng được sinh ra cho các ứng dụng (đặc biệt là trò chơi) mà không làm sử dụng hầu hết các hệ thống Drawables. Trong trường hợp này, mặc dù kích thước lớn của các tài nguyên tải trước dường như là một lỗi với một bản phát hành cụ thể (hoặc cổng thiết bị cầm tay) của ICS. Nó là bình thường một lượng nhỏ bộ nhớ, vì vậy tôi nghi ngờ nó sẽ bao giờ cần thiết để có một cơ chế như vậy để giảm việc sử dụng bộ nhớ preload.

Nếu bạn sắp hết bộ nhớ do bộ nhớ cache này thì tôi có thể gửi báo cáo lỗi cho Google.

Bạn có thể theo dõi quá trình tải trước tài nguyên tại đây nếu bạn quan tâm đến nhiều chi tiết nội bộ hơn. ZygoteInit.preloadResources

+4

Đúng. Sẽ không có một tính năng để tắt chức năng này - nó được thực hiện trong quá trình zygote, được tạo ra một lần và tất cả các quy trình ứng dụng đều sinh ra từ đó.Do đó, các tài nguyên mà nó tải sẽ được chia sẻ trên tất cả các quy trình. – hackbod

+0

Cảm ơn cistearns. Vấn đề chính của tôi là tôi có người dùng nhìn thấy việc sử dụng bộ nhớ này và báo cáo nó. Nó ảnh hưởng đến xếp hạng sao của tôi. Điện thoại của tôi sử dụng cùng màn hình như iPhone 4, vì vậy mật độ rất cao (khoảng 320dpi). Trên cổ phiếu ICS nó sẽ sử dụng lên đến 20MB theo báo cáo của Android. Điều thú vị là, sau khi cập nhật lên phiên bản mới hơn, điều này đã giảm xuống còn khoảng 7MB. Vì vậy, tôi tự hỏi, điều này cũng có thể là một sản phẩm của một cổng ICS chứng khoán xấu? – Glitch

+1

Có vẻ như đó là lỗi gây ra nhiều mục (hoặc lớn hơn) được tải trong khi tải trước hơn dự định. @hackbod Tôi đã không đào sâu vào zygote để thấy rằng nó đã được sử dụng như spawner (rất mát mẻ), vì vậy tôi thấy lý do tại sao preload luôn luôn cần phải xảy ra. Nó sẽ có thể thêm hỗ trợ để xóa các tài nguyên tải trước sau ngã ba. Nhưng cho rằng kích thước lớn dường như là một lỗi và nó thường nhỏ, tôi nghi ngờ nó sẽ là cần thiết. – cistearns

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