Làm thế nào để buộc người thu gom rác chạy?


147

Người phỏng vấn hỏi tôi về điều này hôm nay ... có câu trả lời không?


3
Câu hỏi này có thông tin tốt về lý do tại sao bạn không nên làm điều đó: stackoverflow.com/questions/118633/ Khăn
Hans Olsson

1
tại sao bạn lại nói như thế này
Andrew Collins

1
@Jason - Có lẽ người phỏng vấn không muốn nghe giải pháp, thay vào đó có được kiến ​​thức và lý luận của Andrew chống lại việc đó, thì câu hỏi này có thể có ý nghĩa.
martinstoeckli

2
@martinstoeckli Đây vẫn là một câu hỏi khủng khiếp. Một người có kiến ​​thức trong một cuộc phỏng vấn căng thẳng sẽ không nhận ra đó là một câu hỏi mẹo, hoặc suy nghĩ để cung cấp thêm thông tin. Sau đó, câu hỏi không giúp người phỏng vấn phân biệt giữa người có kiến ​​thức hoặc người không có nó. Vì vậy, câu hỏi vẫn còn khủng khiếp.
James

2
"Khi nào bạn buộc thu gom rác?" Nghe có vẻ như một câu hỏi phỏng vấn tốt với tôi ("Làm thế nào": không quá nhiều). Người mới bắt đầu: Tôi không biết. Trung cấp: Không bao giờ. Chuyên gia: Khi bạn viết một bài kiểm tra rò rỉ bộ nhớ.
mikebridge

Câu trả lời:


188

System.GC.Collect()buộc người thu gom rác phải chạy. Điều này không được khuyến khích nhưng có thể được sử dụng nếu tình huống phát sinh.


17
Tại sao nó không được khuyến khích?
Luke T O'Brien

5
GC.Collect () đắt tiền để chạy. Làm điều đó nhiều hơn cần thiết là không thể. Mã khi được gọi là được viết tốt. Bạn thường chỉ nên tự thu thập trong các trường hợp cạnh chuyên biệt. stackoverflow.com/a/21961777/2710988
Brandon Barkley

186

Không nên gọi gc một cách rõ ràng, nhưng nếu bạn gọi

GC.Collect();
GC.WaitForPendingFinalizers();

Nó sẽ gọi GC rõ ràng trong toàn bộ mã của bạn, đừng quên gọi GC.WaitForPendingFinalizers();sau GC.Collect().


14
WaitForPendingFinalizerskhông nhất thiết phải cung cấp "hiệu suất tốt hơn": nó chỉ chặn cho đến khi tất cả các đối tượng trong hàng đợi hoàn thiện đã được hoàn thành (các đối tượng có thể được đặt ở đó theo lệnh gọi trước đó của bạn Collect). Nếu bạn muốn có cơ hội cho những đối tượng đó được thu thập thì bạn cần một cuộc gọi khác Collect sau khi gọi WaitForPendingFinalizers.
LukeH

2
Vì một trong vài lý do chính đáng để gọi gc.Collect là một nỗ lực cuối cùng để giải phóng các tài nguyên không được xử lý đúng cách, WaitForPendingFinalators dường như là một bước cần thiết. Tuy nhiên, không chắc chắn cách thực hành tốt nhất sẽ là gì để tránh gọi gc.Collect quá mức trong các trường hợp như vậy. BTW, tôi tự hỏi liệu có bất kỳ lý do kỹ thuật nào mà gc.Collect 'có' để thúc đẩy các thế hệ không? Nó có vẻ hữu ích hơn khi có các thế hệ ở lại trừ khi đủ thứ được phân bổ trong một để biện minh cho việc thúc đẩy nó.
supercat

2
Lưu ý cho người mới bắt đầu trong C # (như tôi): Cuộc gọi lực lượng GC không đảm bảo, một số đối tượng không sử dụng cụ thể sẽ bị xóa khỏi bộ nhớ. (một cách để làm điều này là sử dụng các "sử dụng tuyên bố" ( msdn.microsoft.com/ru-ru/library/yh598w02(v=vs.80).aspx ))
user1234567

Tại sao nó được coi là quan trọng để gọi WaitForPendingFinalizers?
Christian

19
GC.Collect() 

từ MDSN ,

Sử dụng phương pháp này để cố gắng lấy lại tất cả bộ nhớ không thể truy cập.

Tất cả các đối tượng, bất kể chúng đã ở trong bộ nhớ bao lâu, đều được xem xét để thu thập; tuy nhiên, các đối tượng được tham chiếu trong mã được quản lý không được thu thập. Sử dụng phương pháp này để buộc hệ thống cố gắng lấy lại số lượng bộ nhớ khả dụng tối đa.



12

GC.Collect();

Tuy nhiên, hãy nhớ rằng Trình thu gom rác có thể không luôn luôn dọn sạch những gì bạn mong đợi ...


5
Ý bạn là như thế nào? Những gì nó có thể làm sạch bất ngờ?
Voldemort

5
@Voldemort - Nó sẽ không bất ngờ làm sạch bất cứ điều gì. Nhưng nó có thể không làm sạch mọi thứ mà bạn mong đợi.
Justin Niessner 17/03/2015

6

Bạn không muốn buộc người thu gom rác chạy.

Tuy nhiên, nếu bạn đã từng làm (như một bài tập hoàn toàn học tập, tất nhiên):

GC.Collect()

4
Tôi thích câu trả lời của @ Karthik, có thể có một tình huống trong đó một ứng dụng nên gọi một cách hợp pháp là GC.Collect (). Rất hiếm khi mặc dù.
Henk Holterman

2
Giả sử bạn có một loạt các tài liệu tham khảo yếu và muốn kiểm tra xem có tồn tại bất kỳ tài liệu tham khảo 'sống' nào không. Sẽ thật hợp lý khi gọi GC.Collect () trước khi kiểm tra. Chỉ cần nói.
Rich Ehmer

1
Bị từ chối vì tuyên bố mở là thực tế không chính xác; Có, tôi muốn buộc người thu gom rác chạy.
Syndog

5

Tôi nghĩ rằng .Net Framework thực hiện việc này một cách tự động nhưng chỉ trong trường hợp. Trước tiên, hãy đảm bảo chọn những gì bạn muốn xóa, sau đó gọi trình thu gom rác:

randomClass object1 = new randomClass
...
...
// Give a null value to the code you want to delete
object1 = null;
// Then call the garbage collector to erase what you gave the null value
GC.Collect();

Tôi nghĩ đó là nó .. Hy vọng tôi sẽ giúp được ai đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.