2008-09-19 14 views
19

Có cách nào để kích hoạt bộ sưu tập rác trong quy trình .NET từ một tiến trình khác hoặc từ bên trong WinDBG không?Kích hoạt bộ sưu tập rác .NET bên ngoài

Có những Trình hỗ trợ gỡ lỗi được quản lý có thể thu thập khi bạn di chuyển qua ranh giới gốc/được quản lý và AQTime dường như có nút cho thấy điều này thực hiện, nhưng tôi không thể tìm thấy bất kỳ tài liệu nào về cách thực hiện.

+0

Bản sao có thể có của [Chạy bộ thu gom rác từ dòng lệnh?] (Http://stackoverflow.com/questions/3594069/run-garbage-collector-from-command-line) –

Trả lời

2

Câu trả lời của John Cocktoastan để sử dụng GC.Collect khi trong Visual Studio là tùy chọn tốt nhất nếu có.

Tôi vẫn không thể tìm thấy giải pháp thay thế để thực sự thực hiện bộ sưu tập trong WinDBG nhưng thực hiện một bước về vấn đề "Bộ nhớ có thể khôi phục được bao nhiêu bộ nhớ?" (xem bình luận của tôi để trả lời của John) Tôi nghĩ rằng có một thay thế bằng cách sử dụng một kịch bản (PowerDBG?) tìm kiếm thông qua một số kết hợp của DumpHeap và! GCRoot để tìm các xử lý không bắt nguồn và tổng không gian được sử dụng (cơ bản thi đua các thuật toán GC sẽ sử dụng trình gỡ lỗi). Nhưng kể từ khi nghĩ về điều này tôi đã không có một trong những lỗi này vì vậy đã không cố gắng để viết mã để làm điều đó.

0

Nếu bạn phơi bày một chức năng/đối tượng thông qua điều khiển từ xa, điều đó có thể được thực hiện khá dễ dàng.

+0

Các ứng dụng tôi rất thú vị làm điều đó với không hỗ trợ điều khiển từ xa hiện tại và sẽ không thể thêm nó chỉ cho việc này. –

+0

Tại sao một vật thể bị phơi nhiễm tiếp xúc duy nhất không thể xảy ra? Bạn có thể làm điều đó với ít hơn 20 dòng. Dưới đây là một ví dụ nhỏ: http://xacc.svn.sourceforge.net/viewvc/xacc/xacc/Configuration/KickStart.cs?view=markup – leppie

+0

Vì đây là ứng dụng gốc C++ chỉ truy cập .net qua COM và trong khi có rất nhiều C# số tiền được đảm bảo để được truy cập, nơi bạn có thể móc này nhỏ hơn nhiều. Cũng không có lý do kỹ thuật. –

11

Vâng ... có cửa sổ ngay lập tức. Nếu bạn có sự gắn bó với quy trình này, tôi cho rằng bạn có thể GC.Collect theo cách thủ công trong cửa sổ ngay lập tức.

Câu hỏi lớn hơn: tại sao bạn muốn tự tạo GC.Collect? Đó là một thói quen khó chịu, và chỉ ra các vấn đề thiết kế lớn hơn nhiều.

+1

Nó không phải là một cái gì đó tôi có ý định làm thường xuyên, đủ để được thói quen :-). Đôi khi chúng tôi có vấn đề về sử dụng bộ nhớ; khi những điều này xảy ra, GC sẽ thu thập thường xuyên. Khi điều tra thích hợp hơn là sử dụng các tập dữ liệu đã cắt giảm vì lý do tốc độ nhưng chúng không làm giảm GC theo cùng một cách. ... –

+0

[Tiếp tục ...] Một khía cạnh của thông tin hữu ích đôi khi khi trên các bộ nhỏ hơn là tỷ lệ sử dụng bộ nhớ có khả năng thu hồi được bởi GC. Nếu nó chỉ là một điểm cụ thể thì bạn có thể tinh chỉnh mã để buộc, nhưng đôi khi nhiều phương pháp quảng cáo hoc sẽ thuận tiện hơn. –

+0

Tôi đồng ý, tôi đã sử dụng GC.Collect cho mục đích đó, thường là khi xem perfmon để xem "những gì tôi có thể lấy lại". Tốt trên ya, có vẻ như bạn đang ở bên phải của cuộc tranh luận GC :) –

8

trả lời trong another question:

Về cơ bản, sử dụng PerfView:

PerfView.exe ForceGC [ProcessName | Process ID] /AcceptEULA 

Nó không dành cho sản xuất.

+1

Phiên bản mới nhất 2.0.7 cũng cần chuyển đổi '/ AcceptEula' trên đó. – bergmeister

+0

Cảm ơn @bergmeister, tôi đã cập nhật dòng lệnh. –