2010-06-19 33 views
5

Có thể lập trình viên bắt đầu/dừng chương trình thu gom rác bằng ngôn ngữ lập trình C# theo lập trình không? Ví dụ: để tối ưu hóa hiệu suất và v.v.Có thể ngừng thu gom rác thải .NET không?

+1

Bộ sưu tập rác không phải là một phần của ngôn ngữ lập trình C#. Đó là một phần của .NET CLR. –

+0

"Kinda". Nếu bạn không bao giờ phân bổ bất cứ điều gì, GC sẽ không bao giờ thu thập. Trước khi phân bổ mọi thứ bạn cần và sau đó gọi 'GC.Collect()'. –

+0

Cũng có thể xem câu trả lời này: http://stackoverflow.com/questions/6005865/prevent-net-garbage-collection-for-short-period-of-time/6005949#6005949 – Gamlor

Trả lời

6

Không thực sự. Bạn có thể đưa ra các gợi ý GC qua các phương pháp như GC.AddMemoryPressure hoặc GC.RemoveMemoryPressure nhưng không dừng lại hoàn toàn.

Bên cạnh đó, thu gom rác không phải là quá trình chuyên sâu. Các lập trình viên rất hiếm khi lo lắng về nó.

+0

Ồ, tôi hiểu ... Làm thế nào về phương thức SuppressFinalize()? Nó có mục đích khác không? – Alex

+0

SuppressFinalize hoạt động trên các đối tượng riêng lẻ. Chắc chắn không phải trên toàn bộ GC. Từ MSDN: Các đối tượng thực hiện giao diện IDisposable có thể gọi phương thức này từ phương thức IDisposable.Dispose để ngăn chặn trình thu gom rác gọi Object.Finalize trên một đối tượng không yêu cầu nó. (Vì vậy, về cơ bản nó là một tăng cường hiệu suất rất nhẹ.) –

+0

Tôi không thấy làm thế nào điều này sẽ được thêm một gợi ý để * ngăn chặn * bộ sưu tập rác thải, mỗi se; nếu bạn gọi 'GC.AddMemoryPressure' thì sẽ có nhiều khả năng dẫn đến CLR tạo ra * nhiều bộ sưu tập rác hơn vì nó chỉ ra rằng bộ nhớ có sẵn cho CLR cho quá trình (ảo hoặc ngược lại) nhỏ hơn nó nghĩ. Một * có thể gọi là 'GC.RemoveMemoryPressure' mà không có một cuộc gọi tương ứng với' GC.AddMemoryPressure', trong một nỗ lực để lừa CLR nghĩ rằng nó có nhiều bộ nhớ hơn, nhưng người ta sẽ nghĩ rằng API có khả năng chống (một hy vọng) cho những thứ như vậy. – casperOne

3

Không, không có. Tốt nhất bạn có thể kích hoạt bộ sưu tập rác, mặc dù điều này được coi là một điều rất tệ vì nó có thể can thiệp vào các thuật toán lập lịch trình được xây dựng được GC sử dụng.

+0

Bạn không thể kích hoạt thu thập , chỉ có thể "đề xuất". GC sẽ tự quyết định –

4

Nói chung, không. Và hầu hết mọi người sẽ xem xét tối ưu hóa sớm để lo lắng về việc thu gom rác thải trừ khi bạn làm một số hồ sơ và tìm ra rằng đó thực sự là nguyên nhân của hiệu suất kém trong ứng dụng của bạn.

Nếu bạn quan tâm đến việc chỉnh sửa GC cho hiệu suất (hoặc nhiều khả năng, tinh chỉnh ứng dụng của bạn để cải thiện hiệu suất của nó liên quan đến GC), MSDN có mô tả khá tốt về cách thực hiện.

4

Trong khi đó nó có thể, có những phương pháp trong GCclass:

GC.TryStartNoGCRegion(...)GC.EndNoGCRegion().

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