2011-08-30 29 views
23

Tôi đang làm việc trên ứng dụng để phát trực tuyến nhạc từ internet ... Ứng dụng của tôi thực hiện nhiều thứ và cấu trúc theo cách này: Tôi có chế độ xem tab và mỗi chế độ xem được phân bổ trong bộ nhớ nên mỗi lần Tôi điều hướng qua các tab Tôi tìm lại trạng thái trước đó (mỗi tab cũng có thể mở một webview để tìm thông tin về bài hát, tin tức, vv .. trên internet) tất cả đều phát triển trí nhớ nhưng làm cho ứng dụng trở nên rất thân thiện ... Sau khi đã chú ý để tránh rò rỉ bộ nhớ theo hướng dẫn của Android, tôi cố gắng xem xét nghề nghiệp heap và tôi thấy rằng ứng dụng của tôi phân bổ tối đa 3,5MB bộ nhớ và kích thước phân bổ là 4,5 - 4,6 MB ... Tôi đang làm việc trên trình mô phỏng. Họ không phải là quá nhiều tôi nghĩ, nhưng đôi khi ứng dụng của tôi được khởi động lại thành lập trong LogCat một thông điệp lạ nhưAndroid phát triển vùng heap frag

Grow heap (frag case) to 3.373 for 19764-byte allocation 

Nó là gì? một vấn đề giả lập? hoặc cái gì khác? Tôi có sử dụng quá nhiều bộ nhớ không?

Cảm ơn bạn trước sự giúp đỡ nào :)

Trả lời

35

Kích thước heap tối đa phụ thuộc vào thiết bị (bạn có thể nhận được rằng giá trị bằng cách gọi Runtime.getRuntime().maxMemory()), nhưng nó có thể là khoảng 32MB. Để tiết kiệm bộ nhớ, Android không tự động cấp phát bộ nhớ tối đa cho mọi ứng dụng. Thay vào đó nó chờ đợi cho đến khi ứng dụng cần thêm bộ nhớ và sau đó cung cấp cho nó nhiều không gian heap khi cần thiết cho đến khi nó đạt đến mức tối đa. Tôi tin rằng đó là thông báo Grow heap mà bạn thấy.

Nếu bạn thực hiện rất nhiều cấp phát bộ nhớ và giải phóng bộ nhớ, bạn có thể gặp sự cố phân mảnh. Wikipedia có một mô tả phong nha here, nhưng về cơ bản có nghĩa là bạn có thể có bộ nhớ cần thiết có sẵn, chỉ cần không phải tất cả trong một đoạn. Do đó cần phải phát triển heap.

Vì vậy, để trả lời các câu hỏi của bạn, nó có thể không phải là một vấn đề giả lập, nó chỉ là bản chất của chương trình của bạn, mà âm thanh một chút bộ nhớ nặng. Tuy nhiên đây không phải là một điều xấu. Tôi không nghĩ rằng việc sử dụng 3-5MB cho nhiều tab có lượt xem trang web là quá nhiều.

+0

oh cảm ơn vì câu trả lời ^^ tại sao nó không phải là điều xấu? ứng dụng của tôi thoát khi điều này xảy ra ... Tôi nghĩ rằng điều này là xấu ... lỗi của tôi? Tôi nhận được một tin nhắn khác: heapworker là wedged: 13129ms dành bên trong Landroid/media/MediaPlayer; .finalize() V ... Bạn có biết đây là gì không? – Erenwoid

+0

Vâng, nếu ứng dụng của bạn thoát, thì điều đó thật tệ. Tôi có nghĩa là chỉ sử dụng ~ 4MB đống cho nhiều trang web không phải là xấu. Tôi không biết nhiều về vấn đề 'HeapWorker'. Thông thường nó theo dõi bộ nhớ được cấp phát và chạy bộ thu gom rác trên các đối tượng không sử dụng. Đoán của tôi là một trong các chủ đề của bạn đang sử dụng tất cả CPU và 'MediaPlayer' không có thời gian để chạy' finalize() ', đó là một chức năng chắc chắn không mất 13 giây. –

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