2009-07-24 35 views
6

Ứng dụng của tôi đã sử dụng 150MB bộ nhớ không lâu trước đây, hiện tại nó ở mức 286mb. Nó từ từ tăng lên vì vậy tôi phải quên bỏ một cái gì đó. Điều này không phải là một vấn đề đối với tôi vì tôi có 4GB nhưng tôi muốn gửi nó cho những người khác chỉ có 1GB ram. khác sau đó đi qua dòng mã bằng dòng như thế nào tôi có thể tìm thấy các đối tượng cần phải được xử lý hoặc chỉ các đối tượng nói chung lớn?Làm cách nào để tìm các vấn đề về vứt bỏ và bộ nhớ? C#

Trả lời

2

Khám phá .NET Memory Profiler. Có bản dùng thử 15 ngày và đáng giá phí giấy phép.

Dễ dàng xác định rò rỉ bộ nhớ bằng cách thu và so sánh những bức ảnh của Snapshots nhớ NET bao gồm dữ liệu về phân bổ dụ NET và trường sống tại thời điểm chụp được thu thập. Chúng cung cấp nhiều thông tin hữu ích và làm cho nó dễ dàng xác định bộ nhớ tiềm năng rò rỉ, đặc biệt khi hai ảnh chụp nhanh được so sánh.

1

Bạn cũng có thể sử dụng WinDbg và SOS. Chúng có lợi thế là tự do và rất, rất kỹ lưỡng, nếu một chút khó khăn để làm quen với nó.

Đây là số blog post mô tả quy trình.

+2

windbg và SOS cũng là yêu thích của tôi. Có một bài đăng trên blog cũ hơn nhiều từ Rico Mariani: http://blogs.msdn.com/ricom/archive/2004/12/10/279612.aspx –

+0

Đó là bài đăng khiến tôi bị lôi cuốn vào SOS ban đầu ... Nhưng cái mà tôi đã đăng tôi nghĩ là dễ theo dõi hơn một chút. –

4

Mở rộng cả câu trả lời của JP và Reed.

Tôi muốn xóa một chút nhầm lẫn. Nếu bạn đang thấy sự gia tăng đáng kể trong bộ nhớ, vấn đề có thể không phải là một vấn đề với việc gọi Dispose. Vứt bỏ thường được sử dụng để giải phóng tài nguyên không được quản lý như xử lý. Những thứ này không chiếm nhiều bộ nhớ nhưng thay vào đó quý giá hơn là tài nguyên.

Tăng bộ nhớ thường được liên kết với các đối tượng lớn hoặc bộ sưu tập có thể truy cập từ đối tượng được quản lý bắt nguồn trực tiếp hoặc gián tiếp thông qua đối tượng ngăn xếp hoặc xử lý GC mạnh. Đây là khu vực bạn có thể muốn tập trung điều tra của mình.

+0

Vâng, đây là một điểm tuyệt vời. Tôi sử dụng trình thu thập bộ nhớ để nhận ra những thứ như "oh, bộ sưu tập đó không nên lớn hơn và lớn hơn mãi mãi!" :) –

+2

Ngoài ra, hãy xem qua mọi sự kiện bạn đăng ký. Sự kiện này có tham chiếu đến người đăng ký và nếu bạn không bao giờ hủy đăng ký, tham chiếu đó sẽ không bao giờ bị xóa. – JulianR

0

Check-out this link

Stephen Toub đi vào chiều dài tuyệt vời để giải thích kỹ thuật khác nhau để thực hiện điều này, Sau đây là một số điểm nổi bật tóm tắt từ bài viết của ông

  • Bằng cách thêm một finalizer cho mục đích gỡ lỗi, bạn có thể giới thiệu một cách để tìm hiểu khi nào một lớp không được xử lý đúng cách, nếu finalizer không bao giờ được gọi, bạn kno w rằng xử lý không được gọi

  • Để có thêm thông tin về các trường hợp, threadIds vv để hỗ trợ trong việc thu hẹp xuống mà dụ không có nó xử lý gọi, ông đã tạo ra một lớp FinalizationDebgger mà lớp dùng một lần bạn sẽ giữ lên mà wouldin lần lượt gọi là Vứt bỏ các trường hợp FinalizationDebugger khi bản thân nó được xử lý. Nếu Vứt bỏ không được gọi vào dụ lớp học của bạn sau đó khi finalizer chạy nó sẽ gọi finalizer cho FinalizationDebgger dụ nơi ở, bạn có thể khẳng định hoặc ném một ngoại lệ để giúp gỡ vấn đề,

  • Move tất cả các theo dõi mã liên quan vào một lớp cơ sở mà lớp dùng một lần của bạn sẽ sau đó kế thừa từ, làm cho mã này sạch hơn nhiều. Cách tiếp cận này có thể hoặc không thể làm việc kể từ khi bạn đốt một lớp cơ sở và nếu bạn đang kế thừa từ một cơ sở khác.

  • Trong tùy chọn cuối cùng, mọi thứ được tính vào lớp tĩnh mà trường hợp của bạn gọi là số . FinalizationDebugger trở thành một lớp tĩnh hiển thị ba phương thức tĩnh : Constructor, Dispose và Finalizer. Ý tưởng là bạn gọi những phương thức này là từ vị trí thích hợp trong lớp học của bạn (bỏ/hoàn thành/khởi tạo) .Đây là tối thiểu xâm nhập vào mã của bạn, vì nó thường chỉ bao gồm thêm ba dòng mã. Tất cả của những phương pháp này được đánh dấu bằng ConditionalAttribute sao cho chúng sẽ chỉ được gọi là bởi lớp học của bạn khi bạn biên dịch lớp học của bạn ở chế độ DEBUG.

Stephen cũng giải thích những ưu và nhược điểm của từng phương pháp tiếp cận của mình. Các giải pháp trình bày các tùy chọn khác nhau và bạn sẽ cần phải đánh giá từng tùy chọn để tìm ra giải pháp phù hợp nhất cho tình huống của bạn. A PHẢI đọc IMHO

Hy vọng điều này sẽ hữu ích.

+0

Cần điền câu trả lời tốt hơn để nhận phiếu bầu. Chỉ cần trỏ đến một liên kết là không đủ tốt gây ra nếu liên kết đi don này không còn là một câu trả lời hữu ích. –

+0

Đủ công bằng, chỉnh sửa câu trả lời để bao gồm tóm tắt ngắn gọn về những gì được đề cập trong bài viết MSDN –

0

Đồng thời thử dùng ANTS Memory Profiler. Có 14 ngày dùng thử miễn phí đầy đủ chức năng và tôi thực sự thích giao diện người dùng.

Tiết lộ: Họ tài trợ Mã Herding ngay bây giờ, đó là lý do tại sao tôi dùng thử. Nhưng tôi thực sự ấn tượng với nó - tôi đã lược tả một ứng dụng trong 30 giờ và nhận được rất nhiều thông tin hữu ích từ nó. Giao diện người dùng thực sự hữu ích - nó hướng dẫn bạn qua quy trình và có vẻ như không có gì.

alt text http://www.red-gate.com/products/ants_memory_profiler/images/object_retention_graph.gif

0

Dưới đây là vài thủ thuật sử dụng ANTS Memory Profiler để giúp tìm các đối tượng chưa ga và sửa chữa rò rỉ.

  1. Trình biên tập bộ nhớ ANTS cho phép bộ lọc được đặt chỉ hiển thị đối tượng có chứa phương thức Vứt bỏ(). Bật tính năng này và bạn sẽ được đưa ra danh sách các đối tượng trực tiếp chưa được xử lý.

  2. Trong khi việc tìm kiếm các đối tượng không rõ là hữu ích, thậm chí hữu ích hơn là biết tại sao các đối tượng này không được xử lý. Tìm những nơi mà các đối tượng không rõ ràng này được tạo ra một cách lâu dài để tìm ra nguyên nhân của sự rò rỉ là . Nếu bạn có thể thay đổi mã của đối tượng bị rò rỉ, một mẹo hữu ích là giới thiệu một trường để giữ một chồng xếp chồng và điền vào trường này tại thời điểm xây dựng đối tượng. Sau đó, vì trình thông báo bộ nhớ ANTS cho phép bạn kiểm tra các trường của đối tượng, , bạn có thể chỉ cần đọc ra stacktrace vì nó đã được tại thời điểm các đối tượng bị rò rỉ được tạo ra. Điều này sẽ cung cấp cho bạn một đầu mối mạnh mẽ về việc ai là chủ sở hữu của các đối tượng bị rò rỉ, và cách họ nên nói về việc gọi Dispose trên các đối tượng mà họ chịu trách nhiệm.

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