Giám sát việc sử dụng Byte ảo của chương trình trong khi nó đang chạy cho thấy rằng bằng cách thực hiện một số thao tác loại, việc sử dụng byte ảo tăng khoảng 1GB trong khoảng 5 phút. Chương trình giao dịch với ổ cắm tcp và thông lượng truyền dữ liệu cao giữa chúng (~ 800Mbps).windbg "miễn phí" loại đối tượng
Tải tệp kết xuất của chương trình trong windbg cho thấy lý do sử dụng bộ nhớ rất cao và nhanh là khoảng 1GB đối tượng "miễn phí". Thật vậy, khi tôi gọi bộ thu gom rác (gen 0, 1 & 2) từ màn hình bảng điều khiển của chương trình (sau khi nhận được nó đến trạng thái này) nó giải phóng khoảng 1GB sử dụng bộ nhớ.
Tôi đang cố gắng hiểu chính xác những đối tượng miễn phí này là gì và tại sao chúng không phải là rác do bộ thu gom rác thu thập tự động.
Chỉnh sửa: Một gợi ý là tôi có thể tạo các đối tượng trong Heap đối tượng lớn và nó trở thành không mong muốn nhưng đây không phải là trường hợp như tôi đã thấy tất cả các đối tượng "miễn phí" nằm trong Gen 2 Heap.
Đề nghị khác là có thể Gen 2 Heap bị phân mảnh vì đối tượng được ghim nhưng nếu đúng như vậy, GC.Collect sẽ không khắc phục được sự cố nhưng nó thực sự làm như vậy tôi tin rằng đây không phải là trường hợp.
Điều tôi nghi ngờ từ cuộc thảo luận với Paul là bộ nhớ được giải phóng nhưng là từ một lý do nào đó quay trở lại hệ điều hành hiếm khi hoặc chỉ khi tôi gọi GC.Collect theo cách thủ công.
Cảm ơn câu trả lời. Kiểm tra kích thước heaps cho thấy rằng Gen 2 là một trong những chiếm tất cả bộ nhớ và thực sự gọi GC.Collect (0) hoặc GC.Collect (1) đã không giải phóng bộ nhớ trong khi GC.Collect (2) đã thực hiện việc làm. # đối tượng được ghim vẫn ở mức thấp trong suốt quá trình thực hiện. Khi tôi theo dõi bộ sưu tập # Gen 2 trong perfmon tôi thấy rằng nó tăng liên tục nhưng bộ nhớ từ Gen2 rất hiếm khi được giải phóng tự động. Nó được giải phóng khi tôi gọi GC.Collect (2) mặc dù, như đã đề cập ở trên. Điều gì có thể exaplin này? – galbarm
@galbarm: Có vẻ như đó chỉ là chiến lược mà CLR .NET thực hiện để quản lý bộ nhớ. Hãy nhớ rằng bộ nhớ .NET sử dụng cho các heap được quản lý phải được phân bổ bởi hệ điều hành và hoạt động này rõ ràng là có phí. Nó sẽ có ý nghĩa cho nó để treo vào bộ nhớ hơn là liên tục cấp phát và phát hành khối bộ nhớ. Như một thử nghiệm, bạn có thể thử tạo ra một quá trình thứ hai mà gobbles bộ nhớ và xem nếu một sự kiện bộ nhớ hệ thống thấp kích hoạt ứng dụng hiện tại của bạn vào phát hành bộ nhớ miễn phí nó có sẵn. –
Làm thế nào tôi có thể thấy sự gia tăng liên tục trong bộ sưu tập # Gen 2 nhưng bộ nhớ không được giải phóng cho đến khi tôi sử dụng thủ công GC.Collect? – galbarm