2010-10-25 22 views
7

Gần đây tôi đã xem một trong các video WWDC 2010: Phiên 311 - Phân tích bộ nhớ nâng cao với các công cụ. Liên kết là here.Lời khuyên cho việc tìm kiếm và gỡ lỗi bộ nhớ bị bỏ hoang và tăng trưởng heap

Có một ví dụ thú vị trong video về tìm Bộ nhớ bị bỏ rơi. Họ nói rằng nó thường là quan trọng hơn để gỡ lỗi hơn rò rỉ nhưng có thể khó khăn hơn.

Bộ nhớ bị bỏ qua được định nghĩa là "Bộ nhớ được cấp phát có thể truy cập không bao giờ được sử dụng lại".

Rò rỉ được định nghĩa là "Bộ nhớ phân bổ không thể tiếp cận được nữa".

Cách chính để tìm Bộ nhớ bị bỏ rơi là chụp ảnh heap bằng công cụ Phân bổ.

Tuy nhiên, sau khi xác định rằng tôi đã từ bỏ bộ nhớ trong mã của mình, tôi thấy rằng thật khó để tìm ra chính xác nó đến từ đâu.

Tôi đang tìm một số mẹo hay tài nguyên tốt để tìm Bộ nhớ bị bỏ rơi.

Cảm ơn!

+5

Bạn có thể thấy điều này hữu ích: http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find tăng trưởng bộ nhớ -undesirable-bộ nhớ/ – bbum

+0

Tuyệt vời, chỉ là loại điều tôi đang tìm kiếm. – Jonah

+0

Thật khó để tìm thấy nó khi bạn đã hoàn thành dự án nhưng Công cụ là trợ giúp tuyệt vời. Khả năng tốt nhất là không làm bất kỳ rò rỉ bộ nhớ nào - với các tiêu chuẩn mã hóa tốt, bạn sẽ không gặp vấn đề với rò rỉ. – Sulthan

Trả lời

5

Trong công cụ, bạn có thể nhận được một ngăn xếp cuộc gọi cho bất kỳ đối tượng nào được xác định bằng một heapshot. Ảnh chụp màn hình:

Using Instruments to track abandoned memory

Vì vậy, những gì chúng tôi đã có ở đây là một trường hợp giả tạo nơi tôi phân bổ một 1MB NSMutableData mọi người dùng chạm vào một nút. Trong cửa sổ trung tâm phía dưới, tôi đã có 4 heapshots, và tôi đã mở rộng để hiển thị các đối tượng đã được tạo ra nhưng không được phát hành kể từ lần heapshot cuối cùng. Tôi đã đánh dấu một phân bổ "không đối tượng" 1,25MB và trong ngăn bên phải, nó cho tôi thấy ngăn xếp cuộc gọi chính xác nơi phân bổ này xảy ra. Một mẹo về bảng điều khiển bên phải là thanh trượt dọc theo phía dưới - nó điều khiển việc loại bỏ các khung ngăn xếp. Nếu bạn muốn xem tất cả các khung ngăn xếp, hãy kéo nó sang bên phải. Các khung màu xám là những khung mà bạn không có mã nguồn và các khung không phải là màu xám là mã của bạn (hoặc mã bạn có cả biểu tượng và nguồn.) (Ngoài ra, nếu bạn không thấy bảng điều khiển trên phải, kiểm tra các nút "Xem" trong thanh công cụ.) Bạn đang tìm kiếm thông tin gì khác?

+0

Điều này cho bạn thấy nơi đối tượng vi phạm được * cấp phát *. Tuy nhiên, vấn đề với trí nhớ bị bỏ rơi là bạn muốn tìm hiểu tất cả các địa điểm đang được * giữ lại *. ARC làm cho điều này trở nên khó khăn vì những nơi này trở nên vô hình trong mã của bạn. – benzado

+0

Dụng cụ cũng có thể hiển thị cho bạn ở khắp mọi nơi đối tượng của bạn được giữ lại, tự động phát hành và phát hành. Đó là dịch vụ thậm chí còn phù hợp hơn trong kỷ nguyên ARC. – ipmcc

1

Để tóm tắt bbum's excellent blog post:

  1. hồ sơ ứng dụng của bạn sử dụng dụng cụ
  2. Sử dụng Phân bổ mẫu
  3. Khi ứng dụng không chạy, nhấp vào chút tôi bên cạnh phân bổ theo dõi header và kiểm tra số Ghi lại số tham chiếu; điều này sẽ cho bạn biết nơi các mục đang được giữ lại, không chỉ nơi chúng được phân bổ.
  4. Chạy ứng dụng của bạn, làm điều gì đó, sau đó quay lại trạng thái mặc định. Ví dụ, mở một cửa sổ tài liệu mới, sau đó đóng nó lại.
  5. Nhấp vào nút "Đánh dấu Heap" trong Công cụ.
  6. Lặp lại các bước 4 và 5 nhiều lần.

Khi bạn xem lại phân bổ trong Công cụ, bạn có thể nhấp vào nút mũi tên phải để xem lịch sử các sự kiện cho trường hợp đó, bao gồm tất cả các địa điểm được phân bổ, giữ lại, phát hành và tự động phát hành.

+3

Tôi nghĩ nút "Mark Heap" đã được đổi tên thành "Mark Generation". –

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