2010-06-01 29 views
5

Tôi đã có tình huống mà chu kỳ tải và sau đó đóng một tài liệu ăn lên một vài Mb RAM. Bộ nhớ này không bị rò rỉ như một cái gì đó sở hữu nó và làm sạch nó khi thoát ứng dụng (Visual Leak Detector và công cụ Rò rỉ Mac hiển thị thỏa thuận về điều này). Tuy nhiên, tôi muốn tìm ra nơi nó đang diễn ra. Tôi giả định đó là một số loại bộ nhớ cache trong ứng dụng được phổ biến khi tài liệu tải nhưng không được giải phóng khi tài liệu được đóng lại. Tôi có thể sử dụng những phương pháp hoặc công cụ nào để tìm ra những phân bổ này đang được thực hiện ở đâu?Làm thế nào để tìm ra nơi bộ nhớ của tôi đang đi

UPDATE:

Tiếp theo bài của Hans Tôi đã thêm một vòng lặp để ứng dụng vào các tài liệu liên tục mở và đóng. Tôi thấy rằng có một bước nhảy ban đầu trong việc sử dụng bộ nhớ ('Private Bytes' như được báo cáo bởi Process Explorer) sau khi tải một vài tài liệu đầu tiên, nhưng sau đó nó không còn tăng lên mỗi lần. Vì vậy, điều này cho thấy rằng không có phân bổ mới, và sự gia tăng rõ ràng có thể là chủ yếu là do một vật phẩm của phân trang.

Tôi cũng đã xem xét kỹ hơn các công cụ trên mac, điều này rất hữu ích khi xem phân bổ đã xảy ra ở đâu: tạo một Công cụ bao gồm các công cụ Phân bổ và Rò rỉ, sau đó thêm ảnh chụp nhanh ở đầu và cuối của và trong danh sách Heapshots nó sẽ hiển thị tất cả các vùng phân bổ tương ứng với ảnh chụp nhanh cuối cùng. Điều này cho thấy rằng trên máy Mac phân bổ bộ nhớ tăng nhưng đó là do bộ nhớ cache nội bộ như bản vẽ CoreGraphics, qua đó chúng tôi có ít quyền kiểm soát.

+0

Nếu bạn mở/đóng mở/đóng mở/đóng, nó sẽ ăn thêm một vài Mb mỗi khi bạn mở/đóng hoặc thực hiện nó chỉ đạt kích thước cố định sau lần thử đầu tiên. Ngoài ra, làm thế nào bạn đo được bộ nhớ được sử dụng? –

Trả lời

2

Làm việc với giả định rằng đó thực sự là RAM bạn đã đo: chắc chắn điều này hoàn toàn bình thường. Chương trình của bạn đang tích cực giải quyết các trang bộ nhớ ảo khi tải tài liệu, chúng sẽ được ánh xạ tới RAM. Họ sẽ ở đó cho đến khi một quá trình khác cần phải có các trang được ánh xạ tới RAM. Một số hệ điều hành cắt bộ làm việc trước, trên Windows chẳng hạn khi các cửa sổ ứng dụng được thu nhỏ.

Nếu đó thực sự là các trang bộ nhớ ảo bạn đã đo: điều đó cũng bình thường. Sau khi bạn giải phóng bộ nhớ, các khối đống được thêm vào danh sách các khối miễn phí, sẵn sàng để được sử dụng bởi cấp phát bộ nhớ tiếp theo. Nếu việc giải phóng bộ nhớ xảy ra để giải phóng toàn bộ phạm vi trang thì trình quản lý bộ nhớ sẽ có cơ hội để hủy bỏ phạm vi đó. Nó không xảy ra thường xuyên và một chi tiết thực hiện của người quản lý bộ nhớ của bạn mạnh như thế nào.

+0

Nhận xét hữu ích - Tôi đã không cân nhắc điều đó. Có lẽ tôi cần phải chạy một trường hợp thử nghiệm, nơi ứng dụng sẽ liên tục mở và đóng các tệp để xem liệu nó có thực sự phân bổ bộ nhớ nhiều hơn hoặc cho dù đó chỉ là một điều không thích hợp của phân trang. Giá trị tôi đo là 'Bytes riêng' được báo cáo bởi Process Explorer. –

+0

Đó là bộ nhớ ảo, không phải RAM. Nó bao gồm các khối miễn phí trong heap. –

2

Vâng, thực ra bạn đã bị rò rỉ. Khi ứng dụng thoát khỏi hệ điều hành dọn dẹp tất cả các tài nguyên: không có rò rỉ ứng dụng theo nghĩa là để lại bộ nhớ vĩnh viễn được cấp phát sau khi thoát. XCode có một công cụ giúp bạn xác định rò rỉ.
Nhìn dưới

Run->Run with performance Tool->Leaks
Điều đó sẽ chạy ứng dụng của bạn được thiết bị với mã sẽ giúp bạn tìm thấy các rò rỉ.

+0

Tôi quên: nó sẽ cung cấp cho bạn một công cụ trực quan, để quan sát những gì bị rò rỉ và ngăn xếp cuộc gọi dẫn đến rò rỉ. – garph0

+0

Tôi đã đề cập rằng tôi đã chạy Rò rỉ và nó đã không tìm thấy một vấn đề. Bộ nhớ có nhiều khả năng được cấp phát bởi bộ nhớ đệm bên trong ứng dụng và bộ nhớ cache đó được giải phóng một cách chính xác trên lối thoát ứng dụng. Câu hỏi của tôi là làm cách nào để tìm bộ nhớ cache cụ thể nào đang tính toán tất cả bộ nhớ để tôi có thể xóa bộ nhớ cache khi đóng tài liệu? –

+0

Lỗi của tôi: Tôi không nhận ra rằng bạn có nghĩa là công cụ hiệu suất Xcode Rò rỉ. Có phải máy dò rò rỉ Visual Leak hay Mac Leaks? – garph0

4

Nếu bạn có thể tái tạo một cách đáng tin cậy, bạn sẽ có thể sử dụng vùng gỡ lỗi trong MS CRT để khắc phục sự cố này. Bắt đầu tại đây: Memory Leak Detection and Isolation

+0

Tôi có thể thử điều đó - Tôi đã không thử sử dụng các thủ tục MS CRT trong một vài năm vì nó từng là trường hợp mà chúng không xây dựng với codebase của chúng tôi. Tôi nghĩ rằng đó là một cái gì đó giống như việc sử dụng 'vị trí mới' mà nó không thích. –

0

Có thể hữu ích cho ai đó. Tôi thấy rằng Xcode 4.2 với các đối tượng zombie phát hiện được kích hoạt (một hộp kiểm trong lược đồ chỉnh sửa) ăn bộ nhớ như điên - ˜4GB trong một phút. Chỉ cần đảm bảo kiểm tra điều này trong trường hợp ứng dụng của bạn ăn bộ nhớ đang được chạy trong Xcode và không có cách nào khác. Các công cụ cấp phát bộ nhớ và rò rỉ cũng không có gì.

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