Rất nhiều giải pháp hữu ích đã được đề xuất và bài viết MSDN rất kỹ lưỡng. Cùng với những gợi ý ở trên, tôi cũng sẽ làm như sau;
Tương quan thời gian của ngoại lệ với tệp nhật ký của bạn để xem điều gì đang diễn ra tại thời điểm ngoại lệ OOM. Nếu bạn có ít đăng nhập vào thông tin hoặc mức độ gỡ lỗi tôi sẽ đề nghị thêm một số đăng nhập để bạn có một ý tưởng về bối cảnh xung quanh lỗi này.
Việc sử dụng bộ nhớ có tăng dần trong một khoảng thời gian dài trước khi ngoại lệ (ví dụ: quy trình máy chủ chạy vô thời hạn) hay không tăng lên nhanh chóng tăng nhanh cho đến khi ngoại lệ?Có rất nhiều chủ đề đang chạy hoặc chỉ một chủ đề?
Nếu điều đầu tiên là đúng và ngoại lệ không xảy ra trong một thời gian dài, điều đó có nghĩa là tài nguyên bị rò rỉ bị rò rỉ như đã nêu ở trên. Nếu sau này đúng là một số thứ có thể đóng góp vào nguyên nhân, ví dụ: một vòng lặp phân bổ rất nhiều bộ nhớ cho mỗi lần lặp lại, nhận được rất nhiều kết quả từ một dịch vụ, v.v.
Hoặc là tệp nhật ký sẽ cung cấp cho bạn đủ thông tin về nơi bắt đầu. Từ đó tôi sẽ đảm bảo rằng tôi có thể tạo lại lỗi bằng cách phát hành một bộ lệnh nhất định trong giao diện hoặc bằng cách sử dụng bộ đầu vào nhất quán. Sau đó tùy thuộc vào trạng thái của mã tôi sẽ thử (với việc sử dụng thông tin tệp nhật ký) để tạo một số kiểm tra tích hợp nhắm mục tiêu nguồn giả định của sự cố. Điều này sẽ cho phép bạn tạo lại điều kiện lỗi nhanh hơn nhiều và làm cho việc tìm kiếm dễ dàng hơn rất nhiều vì mã bạn đang tập trung vào sẽ nhỏ hơn rất nhiều.
Những thứ khác mà tôi có xu hướng làm là mã nhạy cảm với bộ nhớ đệm với một lớp lược tả nhỏ. Điều này có thể ghi lại việc sử dụng bộ nhớ vào tệp nhật ký và cung cấp cho bạn khả năng hiển thị ngay lập tức các sự cố trong nhật ký. Lớp này có thể được tối ưu hóa để nó không được biên dịch thành bản phát hành hoặc có chi phí hoạt động cực nhỏ (nếu bạn cần thêm thông tin, hãy liên hệ với tôi). Cách tiếp cận này không hoạt động tốt khi nhiều luồng được phân bổ
Bạn đã đề cập đến tài nguyên không được quản lý Tôi giả sử tất cả mã bạn/nhóm của bạn đã viết được quản lý? Nếu không và nếu có thể, tôi sẽ bao quanh các ranh giới không được quản lý với một lớp lược tả tương tự như lớp được đề cập ở trên để loại trừ rò rỉ từ mã không được quản lý hoặc interop. Ghim nhiều con trỏ không được quản lý cũng có thể gây ra phân đoạn heap nhưng nếu bạn không có mã không được quản lý, cả hai điểm này đều có thể bỏ qua.
Gọi rõ ràng bộ thu gom rác trong một nhận xét trước đó đã không được khuyến khích. Mặc dù bạn hiếm khi làm điều này vào những thời điểm có hiệu lực (tìm kiếm blog của Rico Mariani để biết ví dụ). Một ví dụ (được đề cập trong blog được đề cập) trong đó tôi đã gọi thu thập rõ ràng là khi một lượng lớn chuỗi đã được trả về từ một dịch vụ, được đưa vào tập dữ liệu và sau đó được liên kết với lưới. Ngay cả sau khi màn hình đã bị đóng, bộ nhớ này không được thu thập trong một thời gian. Nói chung nó không nên được gọi một cách rõ ràng như các bộ thu gom rác duy trì các số liệu mà nó dựa trên (trong số những thứ khác) bộ sưu tập trên. Việc thu thập cuộc gọi thu thập một cách rõ ràng sẽ làm vô hiệu các chỉ số này.
Cuối cùng, bạn nên có ý tưởng về các yêu cầu về bộ nhớ trong ứng dụng của mình. Hoặc có được điều này bằng cách đăng nhập thông tin nhiều hơn, đôi khi chạy các trình kiểm tra profiler, stress/unit/integration. Nhận ý tưởng về tác động của một hoạt động nhất định ở cấp cao, ví dụ: dựa trên một tập hợp các đầu vào khoảng x sẽ được phân bổ. Tôi hiểu được điều này bằng cách đăng xuất thông tin chi tiết tại các điểm chiến lược trong tệp nhật ký. Tệp nhật ký cồng kềnh có thể khó hiểu hoặc giải thích.
IMHO, trong trường hợp này bắt ngoại lệ bằng trình gỡ lỗi sẽ vô dụng, thiệt hại (rò rỉ bộ nhớ nhiều nhất có thể) đã được thực hiện ở một nơi khác. – Naveen
Chỉ cần ném ra một vài lựa chọn. Không thể đau để nhìn. – tsilb
tslib có một điểm, đôi khi bạn có thể thu hẹp khi bạn hết bộ nhớ. – Gregory