2011-08-19 32 views
9

Tôi đã đọc rằng các đối tượng ghim trong vùng được quản lý ảnh hưởng đến hiệu suất GC trong .NET, vì GC không thể thu gọn bộ nhớ nếu có các đối tượng được ghim "theo cách". Nhưng kể từ khi đống đối tượng lớn không được nén gọn, điều này không nên áp dụng cho các đối tượng trong LOH. Có bất kỳ chi phí ẩn nào khác khi ghim một đối tượng trong LOH không? Hoặc tôi có thể an toàn pin các đối tượng trong LOH mà không làm giảm hiệu suất GC?Việc ghim một đối tượng trong LOH có ảnh hưởng đến hiệu năng GC không?

Trả lời

5

Vâng, chỉ vì Heap đối tượng lớn (LOH) không được nén không có nghĩa là không được thu thập. The LOH is collected và ghim một đối tượng sẽ có phân nhánh về phân bổ trong tương lai.

Vì một đối tượng được ghim, nó thu nhỏ hiệu quả lượng bộ nhớ có sẵn trong LOH (giống như khi bạn đang giữ một tham chiếu). Khi một yêu cầu khác để cấp phát một đối tượng lớn được thực hiện, nếu có quá nhiều tham chiếu được ghim/giữ trong LOH, bạn có thể gặp phải các vấn đề phân bổ các đối tượng lớn hơn.

Khi đánh dấu được thực hiện trong phần thu gom rác và đánh dấu, CLR có thể đánh dấu tất cả các tài liệu tham khảo được ghim là gốc để có thể không có tác động trong phần này của bộ sưu tập; nó sẽ cư xử theo cùng một cách nếu ai đó giữ một tham chiếu đến vật thể lớn.

Kể từ khi deallocation xảy ra cùng một cách trên LOH (khối chỉ đơn giản là được gắn thẻ là có sẵn), hoạt động này không bị ảnh hưởng.

Và cuối cùng, vì LOH không được nén, thao tác này không bao giờ diễn ra trên vùng này trong GC, do đó điều này không bị ảnh hưởng ở đây.

Tóm lại, phân bổ trên LOH có thể chắc chắn bị ảnh hưởng bởi việc ghim tham chiếu đến đối tượng trên LOH, trong khi bộ sưu tập trên LOH có nhiều khả năng không.

Mặc dù chúng ta không quên rằng việc phân bổ và giữ các khối bộ nhớ lớn có thể có phân nhánh trên các hệ thống nói chung, những nhận xét này là nghiêm ngặt về LOH.

+0

Cảm ơn bạn đã trả lời. Tôi không chắc chắn tôi nhận được đoạn thứ hai: Tại sao ghim thu hẹp bộ nhớ có sẵn hơn là giữ một tham chiếu sẽ? Tôi luôn luôn mặc dù phân bổ một cái gì đó trên LOH về cơ bản có nghĩa là tìm kiếm một khối bộ nhớ miễn phí đủ lớn hoặc phân bổ một phân đoạn mới - nếu vậy, bất kỳ khối sống nên được đối xử như nhau, pinned hay không. – Niki

+0

@nikie: Nó không làm điều đó nữa, nó chỉ có tác dụng tương tự (như bạn đã nói). Tôi đã cập nhật câu trả lời của mình cho phù hợp. Đó là một sự thay đổi nhỏ nhưng đáng kể. – casperOne

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