2011-06-21 52 views
6

Tôi đang thiết kế máy ảo Dalvik và muốn biết liệu có bất kỳ công cụ nào để phân tích bộ sưu tập rác trong dalvik hay không. Tôi biết về theo dõi phân bổ nhưng tôi đang tìm kiếm một cái gì đó phức tạp hơn.Công cụ thu gom rác cho dalvik

+0

Tôi nghĩ DDMS sẽ giúp bạn. –

+0

Bạn đang cố giải quyết vấn đề gì? –

+0

Tôi đang chạy một dịch vụ nền trên thiết bị của mình, thu hút lưu lượng truy cập web và hoạt động như một proxy cho các ứng dụng web khác trên thiết bị. Vấn đề của tôi là thu gom rác đột ngột mất nhiều thời gian hơn so với thực hiện bình thường. Điều này làm cho dịch vụ nền bị gian hàng dẫn đến phản ứng web chậm chạp đối với ứng dụng. Tôi đang cố gắng xem xét hành vi đột ngột này của bộ thu gom rác. – 22kar

Trả lời

0

Nhận một bản ghi của tất cả các hoạt động GC theo thời gian:

Mỗi khi một GC diễn ra, bạn nhận được một dòng trong LogCat của bạn.

08-08 16:42:21.998: D/dalvikvm(26942): GC_CONCURRENT freed 773K, 26% free 4739K/6368K, paused 4ms+3ms, total 92ms 
08-08 16:42:21.998: D/dalvikvm(26942): WAIT_FOR_CONCURRENT_GC blocked 11ms 

Có vẻ như tôi đang nhận được những thứ đó cho tất cả ứng dụng trên thiết bị của mình.

Dòng này bao gồm nhiều số liệu thống kê thú vị về GC như số lượng bộ nhớ được giải phóng, thời gian GC mất, khi nào chính xác nó xảy ra và kích thước heap của bạn (được sử dụng/tổng số).

Vì tất cả các dòng nhật ký đó có thẻ dalvikvm, bạn sẽ có thể thu thập và lọc chúng trong một khoảng thời gian dài và phân tích để tìm hiểu về hành vi của GC.

Phân tích một hoạt động cụ thể của GC:

Nếu bạn muốn phân tích những gì xảy ra trong một hoạt động GC cụ, công cụ tốt nhất cho công việc là Eclipse MAT. Eclipse MAT có thể phân tích cú pháp các vùng heap. Chụp nhanh heap, đợi GC (hoặc kích hoạt nó bằng DDMS), và sau đó chụp một ảnh khác.

Eclipse MAT có thể hiển thị cho bạn vùng đồng bằng giữa hai ảnh chụp nhanh. Lưu ý rằng bạn sẽ thấy cả phân bổ mới và thỏa thuận do GC gây ra. Thông tin thêm về so sánh ảnh chụp nhanh là available here.

Một số suy nghĩ khác:

Tôi không chắc chắn có bao nhiêu bạn sẽ có thể học hỏi từ việc phân tích quá trình GC. Các hoạt động bên trong của GC là một chi tiết thực hiện. Nó có thể thay đổi mà không cần thông báo giữa các phiên bản hệ điều hành/thiết bị/cấu hình.

Tôi đang cố gắng nghĩ ra các cách để cải thiện độ trễ GC bạn đang gặp phải .. Dường như với tôi GC thường chạy khi điều kiện bộ nhớ thấp. Điều này có thể xảy ra trong thời gian phân bổ mới, do đó GC có thể đang chạy trong khi dịch vụ của bạn đang hoạt động. Có thể, nếu bạn sử dụng thời gian dịch vụ của bạn không hoạt động với GC theo cách thủ công, bạn sẽ có thể giảm số lượng GC xảy ra trong đường dẫn quan trọng để phản hồi yêu cầu web. Để thử điều đó, tôi sẽ thêm một bộ đếm thời gian nền đơn giản và đặt lại nó bất cứ khi nào dịch vụ của tôi hoạt động (yêu cầu mới). Khi bộ đếm thời gian được đánh dấu (không hoạt động trong một khoảng thời gian), tôi sẽ chạy System.gc() theo cách thủ công.