2011-12-01 34 views
7

Tôi đang đọc về bộ thu gom rác C# và cách CLR tạo đồ thị đối tượng. Chương tài liệu tham khảo rễ khác nhau có thể được kích hoạt cho các đối tượng:C# Bộ sưu tập rác Bộ rễ hoạt động

• Tài liệu tham khảo cho các đối tượng toàn cầu (mặc dù chúng không được cho phép trong C#, CIL mã không phân bổ giấy phép của các đối tượng toàn cầu)
• Tài liệu tham khảo cho bất kỳ đối tượng tĩnh/lĩnh vực tĩnh
• Tài liệu tham khảo cho các đối tượng địa phương trong một cơ sở mã ứng dụng của
• Tài liệu tham khảo để phản đối các thông số thông qua thành một phương pháp
• Tài liệu tham khảo cho các đối tượng chờ đợi để được fina lized (mô tả sau trong chương này)
• Bất kỳ đăng ký CPU tham chiếu đến một đối tượng

Tôi đã tự hỏi nếu ai đó có thể cho ví dụ về các rễ trong mã?

Cảm ơn

Trả lời

7

Giả sử bạn chạy chương trình sau:

class Program 
{ 
    static Class1 foo = new Class1(); 

    static void Main(string[] args) 
    { 
     Class2 bar = new Class2(); 

     Class3 baz = new Class3(); 
     baz = null; 

     Debugger.Break(); 

     bar.Run(); 
    } 
} 

Khi chương trình đột nhập vào trình gỡ lỗi, có 3+ đối tượng không đủ điều kiện cho thu gom rác thải vì tham khảo sau đây:

  • một đối tượng Class1 tham chiếu bởi lĩnh vực tĩnh foo
  • một đối tượng string[] tham chiếu bởi tham số args
  • zero hoặc nhiều string đối tượng được tham chiếu bởi đối tượng string[] tham chiếu bởi args
  • một đối tượng Class2 tham chiếu bởi các biến địa phương bar

Đối tượng Class3 là đủ điều kiện cho thùng rác bộ sưu tập và có thể đã được thu thập hoặc đang chờ để được hoàn thành.

Tham chiếu đến các đối tượng chung không được phép trong C#. Tham chiếu trong thanh ghi CPU là chi tiết triển khai của máy ảo.

+3

Tại thời điểm này, thanh 'thực sự có thể đủ điều kiện để thu thập trong chế độ phát hành vì nó không được tham chiếu sau giờ nghỉ. –

+0

Brian đúng, 'bar' sẽ chỉ được giữ trong * chế độ gỡ lỗi * cho đến khi kết thúc phương thức chính, chỉ để gỡ lỗi tiện lợi - trong chế độ phát hành' bar' có thể được thu thập. – BrokenGlass

+0

Tôi tin rằng nếu bạn đang chạy trong DEBUG, các đối tượng luôn an toàn cho đến khi chức năng kết thúc. Tôi tin rằng bạn là chính xác cho mã tối ưu hóa mặc dù. –

1
class Test 
    { 
     static object ImARoot = new object(); //static objects/static fields 

     void foo(object paramRoot) // parameters I'm a root to but only when in foo 
     { 
      object ImARoot2 = new object(); //local objects but only when I'm in foo. 

      //I'm a root after foo ends but only because GC.SuppressFinalize is not called called (typically in Dispose) 
      SomethingWithAFinalizer finalizedRoot = new SomethingWithAFinalizer(); 


     } 
    } 

Nếu bạn muốn tìm hiểu những gì một đối tượng được bắt rễ để tại một điểm nhất định, bạn có thể sử dụng SOS (trong Visual Studio 2005 hoặc sau hoặc trong WinDbg) và sử dụng lệnh gcroot!.