Tôi gặp một số vấn đề với dịch vụ web WCF (một số bãi chứa, rò rỉ bộ nhớ, v.v.) và tôi chạy công cụ profillng (ANTS Memory Profiles).Bộ nhớ giao dịch từ từ điển C# chứa trong một đối tượng tĩnh
Chỉ cần tìm hiểu rằng ngay cả khi xử lý qua (tôi chạy một thử nghiệm cụ thể và sau đó dừng lại), Thế hệ 2 là 25% bộ nhớ cho dịch vụ web. Tôi đã theo dõi bộ nhớ này để tìm thấy rằng tôi đã có một đối tượng từ điển đầy đủ các mục (null, null), với -1 mã băm.
Luồng công việc của dịch vụ web ngụ ý rằng trong quá trình xử lý các mục cụ thể được thêm vào và sau đó bị xóa khỏi từ điển (chỉ đơn giản Add
và Remove
). Không phải là một thỏa thuận lớn. Nhưng có vẻ như sau khi tất cả các mục được xóa, từ điển đầy (null, null) KeyValuePair
s. Hàng ngàn người trong số họ trong thực tế, như vậy mà họ chiếm một phần lớn của bộ nhớ và cuối cùng tràn xảy ra, với các ứng dụng buộc tương ứng hồ bơi tái chế và DW20.exe nhận được tất cả các chu kỳ CPU nó có thể nhận được.
Từ điển trên thực tế là Dictionary<SomeKeyType, IEnumerable<KeyValuePair<SomeOtherKeyType, SomeCustomType>>>
(System.OutOfMemoryException because of Large Dictionary) vì vậy, tôi đã kiểm tra xem có loại tham chiếu nào đang nắm giữ mọi thứ không.
Từ điển được chứa trong một đối tượng tĩnh (để làm cho nó có thể xử lý được với các xử lý khác nhau thông qua quá trình xử lý), từ câu hỏi này và nhiều hơn nữa (Do static members ever get garbage collected?) Tôi hiểu tại sao từ điển đó là Thế hệ 2. Nhưng đây cũng là nguyên nhân của những người (null, null)? Ngay cả khi tôi xóa các mục khỏi từ điển, thứ gì đó sẽ luôn bị chiếm giữ trong bộ nhớ?
Đây không phải là vấn đề tốc độ như trong câu hỏi này Deallocate memory from large data structures in C#. Dường như bộ nhớ không bao giờ được khai hoang.
Có điều gì tôi có thể thực hiện để thực sự xóa các mục khỏi từ điển, không chỉ tiếp tục lấp đầy nó bằng các cặp (null, null)? Có điều gì khác mà tôi cần phải kiểm tra không?
+ !: Để nghiên cứu thích hợp và viết một câu hỏi hay. – Virtlink
'Danh sách <>' có phương thức 'TrimExcess()', 'Từ điển <,>' không may là không. Nghĩ rằng đây là một số điểm dễ dàng :) –
Gọi từ điển.Clear() có tạo nên sự khác biệt nào không? – Alex