2012-06-14 23 views
5
MyObject obj = new MyObject(); 

Tôi biết từ khóa 'mới' sẽ gọi hàm tạo và khởi tạo đối tượng trong vùng được quản lý.Điều gì đang xảy ra khi tôi đưa MyObject obj = new MyObject()

Câu hỏi của tôi là cách CLR thực hiện bên dưới.

  1. Dòng trên được thực thi bởi CLR như thế nào?
  2. Làm thế nào memeory được phân bổ cho đối tượng bằng CLR?
  3. CLR xác định kích thước của đối tượng như thế nào?
  4. CLR sẽ biết điều đó như thế nào, nếu không có không gian để cấp phát bộ nhớ cho đối tượng từ heap?
+5

Tôi khuyên bạn nên đọc 'CLR qua C#' - Jeffrey Richter để có cái nhìn sâu sắc hơn – V4Vendetta

Trả lời

2

Khi loại tham chiếu được tạo (lớp, đại biểu, giao diện, chuỗi hoặc đối tượng), nó được phân bổ trên heap ..Net có bốn vùng khác nhau: (gen0, gen1, gen2) (Small object Heap) và LOH (Heap đối tượng lớn). Tất cả mọi thứ đó là 85k hoặc nhỏ hơn đi vào một trong ba đống đầu tiên, tùy thuộc vào thời gian tạo (di chuyển từ gen0 đến gen1 đến gen2, vv). Đối tượng lớn hơn 85k được đặt trên LOH. LOH không bao giờ được nén chặt, vì vậy cuối cùng, phân bổ kiểu tôi đang làm cuối cùng sẽ gây ra lỗi OOM khi các đối tượng bị phân tán về không gian bộ nhớ đó. Chúng được gọi là heap được quản lý.

Để tạo một đối tượng, tất cả những gì bạn cần làm là sử dụng từ khóa mới; .NET sẽ đảm nhiệm việc tạo, khởi tạo và đặt đối tượng vào đúng vùng, và đặt trước bất kỳ bộ nhớ bổ sung cần thiết nào. Sau đó bạn có thể quên khá nhiều đối tượng đó, bởi vì bạn không phải xóa nó khi bạn đã hoàn thành nó.

khi bạn tạo đối tượng loại tham chiếu bằng từ khóa mới được đặt trên heap và tham chiếu của nó được sử dụng chủ yếu trong ngăn xếp hiện tại đang chạy. có các nguồn khác nơi đối tượng của bạn có thể được sử dụng như refrence:

  1. toàn cầu/tĩnh tham chiếu đối tượng
  2. CPU đăng ký
  3. tài liệu tham khảo quyết toán đối tượng (hơn sau này)
  4. tài liệu tham khảo Interop (đối tượng .NET qua các cuộc gọi COM/API)
  5. đống tài liệu tham khảo (chủ yếu là sử dụng ở đây)

Những 5 là nút gốc thực sự GC từ whe Hệ thống phân cấp tham chiếu lại được hình thành. Thu thập lớp khách hàng cổ điển, thường có một bộ sưu tập lưu trữ các lớp Order. Khi một Lệnh được thêm vào bộ sưu tập đơn hàng, chính bộ sưu tập sẽ giữ một tham chiếu đến thứ tự được thêm vào. Nếu cá thể của lớp Customer có một tham chiếu stack đến nó.

đây là cách phân cấp được hình thành cho một đối tượng phức tạp, đây là cách GC xem các tham chiếu.

e: g. ngăn xếp tham chiếu cho đối tượng Khách hàng -> tham chiếu đến đối tượng Danh sách đơn đặt hàng -> tham chiếu các đơn hàng riêng lẻ.

bất kỳ nội dung nào tham chiếu lỏng lẻo từ 5 gốc này đều dễ bị GC.

cách bộ nhớ được phân bổ cho các đối tượng là chút phức tạp và nó usally phát triển theo thời gian như MKK theo quy định http://msdn.microsoft.com/en-us/magazine/cc163791.aspx

một ví dụ đơn giản có thể là:

class MyClass 
{ 
    string Test="Hello world Wazzup!"; 
    byte[] data=new byte[86000]; 
} 

Thật dễ dàng để giả định rằng kích thước của MyClass khi được phân bổ bao gồm:

• 19 ký tự

• 86.000 byte. Trong thực tế, kích thước của đối tượng sẽ chỉ bao gồm thứ hạng chung và bộ nhớ cần thiết để lưu trữ con trỏ đối tượng vào chuỗi và mảng byte (biến cấp lớp), sau đó được phân bổ riêng biệt trên vùng heap. Chuỗi sẽ được cấp phát trên SOH và tham chiếu đối tượng của nó được giữ bởi cá thể của lớp; mảng byte sẽ được cấp phát vào LOH, vì nó lớn hơn 85 KB.

SOH có thể được đầm chặt và sẽ không có phân mảnh trong đó, trong khi LOH có thể có phân mảnh trong bộ nhớ.

Trân trọng.

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