2012-07-23 28 views
8

Tôi đang trình bày giới thiệu về GC Net CLR và có tất cả các phần khác nhau, nhưng tôi muốn một ví dụ cụ thể về cách cố gắng bắt buộc thu thập có thể nguy hiểm hoặc có hại. Tôi biết bạn có thể buộc mọi thứ vào thế hệ cao hơn sớm, nhưng (từ những gì tôi có thể nói) mà thực sự chỉ làm chậm mọi thứ.Ví dụ về GC bắt buộc bị lỗi?

Tôi đang cố gắng để nghĩ ra một tình huống mà buộc GC có thể thực sự gây tổn hại và tôi tiếp tục mọc lên w/chỉ đơn thuần là giải pháp kém hiệu quả.

+2

Mất thời gian là nhược điểm duy nhất. – Dialecticus

+0

Bởi "buộc bộ sưu tập" tôi giả sử bạn có nghĩa là bằng cách gọi GC.Collect(). Tại sao bạn nghĩ điều đó sẽ nguy hiểm? Có một số tài liệu mà tôi bị mất mà nói như vậy? (Tôi nhận thấy khả năng là cao, vì tôi không thể theo kịp những ngày này.) – David

+0

Bộ hẹn giờ chặt chẽ với các yêu cầu thời gian thực có thể? – leppie

Trả lời

4

Đây là một minh chứng thú vị. Lưu ý bạn nên chạy bản demo này được biên dịch trong chế độ phát hành hoặc nó có thể không hoạt động như được quảng cáo.

Phiên bản 1:

private void Button_Click(object sender, EventArgs e) 
{ 
    Timer timer = new Timer(Print, null, 0, 1000); 
} 

private void Print(Object o) 
{ 
    if (textBox1.InvokeRequired) 
    { 
     Action<object> action = Print; 
     textBox1.Invoke(action, o); 
     return; 
    } 

    textBox1.Text = DateTime.Now.ToString(); 
} 

Phiên bản 1 hạnh phúc sẽ in ngày tháng và thời gian để vào hộp văn bản một lần thứ hai.

Version 2:

private void Button_Click(object sender, EventArgs e) 
{ 
    Timer timer = new Timer(Print, null, 0, 1000); 
} 

private void Print(Object o) 
{ 
    if (textBox1.InvokeRequired) 
    { 
     Action<object> action = Print; 
     textBox1.Invoke(action, o); 
     return; 
    } 

    textBox1.Text = DateTime.Now.ToString(); 

    GC.Collect(); // force a garbage collection 
} 

Bây giờ trong phiên bản 2, ngày và thời gian sẽ chỉ được in một lần bởi vì, sau khi tuyên bố, không có nhiều tài liệu tham khảo cho các đối tượng hẹn giờ, và do đó các đối tượng timer được được thu thập.

Đó là một ví dụ khá giả tạo nhưng có thể làm cho một cuộc biểu tình tốt.

tôi phải ghi Jeffery Richter cho một này - đó là trong cuốn sách tuyệt vời của mình CLR via C#.

+0

Tôi tin rằng hành vi này sẽ bất ngờ hơn nếu bạn chỉ gọi là 'Bộ hẹn giờ mới (... 'và không lưu giá trị trả về. –

+2

Nhưng trong trường hợp này, 'GC.Collect()' không phải là xấu, nó thực sự tốt, bởi vì nó giúp bạn phát hiện ra một lỗi trong ứng dụng. Không có 'GC.Collect()', nó sẽ ngừng hoạt động một cách bí ẩn trong tương lai. – svick

+0

@svick - điểm tốt. có lẽ đó chỉ là một bài học tốt hơn về phạm vi. trong mọi trường hợp, điều đó thật thú vị và nó có một suy nghĩ về GC. – James

1

Điều gì về ý tưởng tồi tệ sau đây? "Hãy ép buộc GC sau mỗi yêu cầu HTTP trong ASP.NET để dọn dẹp trạng thái yêu cầu chắc chắn sẽ bị mồ côi!"

Đó là một ý tưởng tồi vì yêu cầu HTTP đồng thời sẽ giao thoa với nhau. Điều này sẽ giới thiệu nhiều cú sốc độ trễ độ trễ và phá hủy hiệu suất. Tất cả bắt đầu từ một "tối ưu" vô tội.

Đó là về điều tồi tệ nhất tôi có thể nghĩ đến.