2012-02-28 18 views
6

Tôi có một ứng dụng Android OpenGL sử dụng một lượng bộ nhớ đáng kể để thiết lập một cảnh phức tạp và điều này rõ ràng gây ra sự phân mảnh heap đáng kể. Mặc dù không có rò rỉ bộ nhớ nhưng không thể phá hủy và tạo ra ứng dụng mà không có nó thiếu bộ nhớ do phân mảnh. (Phân mảnh chắc chắn là vấn đề, không bị rò rỉ)Chiến lược phân mảnh Heap của Android?

Điều này gây ra một vấn đề lớn vì Android có thói quen hủy và tạo các hoạt động trên cùng một VM/heap. Là một chiến lược để đối phó này, tôi đã sử dụng các kỹ thuật sau:

@Override 
protected void onStop() { 
    super.onStop(); 
    if(isFinishing()) { 
     System.runFinalizersOnExit(true); 
     System.exit(0); 
    } 
} 

Điều này đảm bảo rằng khi hoạt động được hoàn tất nó gây ra một shutdown máy ảo hoàn chỉnh và thời gian do đó tiếp theo hoạt động này được bắt đầu nó được một đống unfragmented tươi.

Lưu ý: Tôi nhận ra rằng đây không phải là "cách Android" nhưng cho rằng bộ thu gom rác không được nén, không thể tiếp tục sử dụng lại heap.

Techinque này thực sự hoạt động nói chung, tuy nhiên nó không hoạt động khi hoạt động bị hủy ở chế độ không hoàn thiện và sau đó được tạo lại.

Có ai có đề xuất hay về cách xử lý sự hủy hoại của vùng heap không?

Lưu ý thêm: Giảm mức tiêu thụ bộ nhớ cũng không thực sự là một tùy chọn. Hoạt động này không thực sự sử dụng nhiều bộ nhớ đó, nhưng đống (và vùng heap bản địa) dường như dễ bị phân mảnh, có thể do một số khối bộ nhớ cỡ lớn

+0

tôi có cùng vấn đề và đã sử dụng giải pháp tương tự. thực sự khủng khiếp. –

Trả lời

4

Phân mảnh hầu như luôn là hậu quả của việc phân bổ có điều kiện. mẫu. Các đối tượng lớn thường được tạo và phá hủy. Kết hợp với các đối tượng nhỏ hơn có thể bền bỉ (hoặc ít nhất là có một tuổi thọ khác nhau) - các lỗ hổng trong heap được tạo ra.

Ngăn chặn phân mảnh hoạt động duy nhất trong các trường hợp như vậy là: ngăn chặn mẫu phân bổ cụ thể. Điều này thường có thể được thực hiện bằng cách gộp các vật thể lớn. Nếu thành công, ứng dụng sẽ biết ơn điều này với tốc độ thực thi tốt hơn nhiều.

@edit: cụ thể hơn cho câu hỏi của bạn: nếu heap sau khi khởi động lại ứng dụng chưa được trống, vậy điều gì sẽ tồn tại trên heap? Bạn xác nhận rằng nó không phải là một vấn đề của một rò rỉ bộ nhớ, nhưng điều này là, những gì nó có vẻ. Vì bạn đang sử dụng OpenGL - có thể nó có thể là, một số trình bao bọc gốc đã tồn tại, bởi vì các tài nguyên OpenGL chưa được xử lý đúng cách?