2010-09-20 17 views
8

Ứng dụng tôi đang viết đang gặp khá nhiều sự cố do rò rỉ bộ nhớ. Khá nhiều mô hình đối tượng toàn bộ đang ở trong bộ nhớ khi người dùng đóng một dự án đã tải xuống. Cách tôi biết điều này là bởi vì đóng một dự án trong ứng dụng của tôi hầu như không ảnh hưởng đến việc sử dụng bộ nhớ trong trình quản lý tác vụ và sau đó mở một dự án mới gần như làm cho nó tăng gấp đôi mỗi lần. Tôi đã tải xuống bộ nhớ dotTrace Memory 3.5 của jetBrain nhưng có rất ít (không) hướng dẫn sử dụng. Tôi đã tìm ra cách sử dụng nó và nó cho thấy rằng toàn bộ mô hình đối tượng vẫn còn trong bộ nhớ khi tôi chụp ảnh sau khi một dự án đã bị đóng cửa. Trawling thông qua dự án của tôiĐóng mã tôi có thể thấy không có lý do cho việc này. Có ai biết về bất cứ điều gì đặc biệt mà thường gây ra rò rỉ bộ nhớ trong C# hoặc của bất kỳ công cụ hoặc kỹ thuật để theo dõi xuống vấn đề. Tất cả tốt và tốt của nó có một ứng dụng cho thấy toàn bộ mô hình đối tượng của tôi vẫn được nạp vào bộ nhớ nhưng nó không hiển thị cho tôi đối tượng hoặc biến nào đang lưu trữ nó. Cảm ơn trước.C# Bộ nhớ bị rò rỉ, theo dõi techinques và các công cụ

+0

bạn nên sử dụng deleaker - nó sẽ giúp bạn với rò rỉ bộ nhớ –

Trả lời

4

Thứ nhất, điều tra xem liệu rò rỉ có thể là do đăng ký xử lý sự kiện như thế này là một trong những cách dễ nhất để vô tình nhổ tận gốc đối tượng của bạn. Ví dụ, nếu bạn có một lớp 'Bob' cho biết thêm một trong các phương thức 'OnSomeEvent' của nó làm đại biểu cho một sự kiện được nâng lên bởi thành phần sống lâu của hệ thống của bạn (ví dụ 'UserSettingsManager') thì đối tượng của lớp 'Bob 'sẽ không được thu thập khi chúng được giữ sống nhờ vào việc xử lý sự kiện (tức là sự kiện gọi lại không phải là tham chiếu yếu).

Là một giải pháp thay thế cho các công cụ thương mại, có một phần mở rộng cho trình gỡ lỗi Windows được gọi là SoS (Son of Strike) mà bạn có thể sử dụng để gỡ lỗi các ứng dụng được quản lý. Tuy nhiên, nó không phải là người yếu đuối vì nó là một công cụ dòng lệnh cấp thấp đòi hỏi rất nhiều việc học tập phía trước. Nó rất mạnh mẽ, tuy nhiên, và không đấu tranh quá nhiều với các quy trình lớn hơn (về tiêu thụ đống) như các công cụ thương mại làm.

Về mặt profilers thương mại, tôi đã có kinh nghiệm tốt với Redgate ANTS Memory Profiler (nhưng tôi đã có đồng nghiệp ghét nó) vì vậy có thể đáng để thử nghiệm điều đó.

3

Có lẽ nguyên nhân phổ biến nhất của rò rỉ bộ nhớ được quản lý là trình xử lý sự kiện chưa được đăng ký.

Có một số công cụ hữu ích để theo dõi lỗi như thế này. Cá nhân tôi thích ANTS Memory ProfilerWinDbg/SOS. Bạn muốn tìm hiểu những gì đang root các đồ thị đối tượng. Với WinDbg/SOS có một lệnh !gcroot, lệnh này sẽ cho bạn biết nguồn gốc của bất kỳ đối tượng cụ thể nào.

Kiểm tra Tess' blog để biết hướng dẫn về cách khắc phục sự cố bộ nhớ bằng cách sử dụng WinDbg/SOS.

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