Tôi có một ứng dụng web ASP.NET/C# đang sử dụng rất nhiều bộ nhớ.Gen lớn 0 Heap trong .NET, lãng phí bộ nhớ?
ANTS Memory Profiler và PerfMon cho thấy cả đống Gen 0 của tôi phát triển nhanh chóng với kích thước khoảng 1 GB trong suốt quá trình Application_Start. Tôi đọc here rằng bộ đếm PerfMon cho Gen 0 Heap thực sự hiển thị "ngân sách" cho Gen 0, không phải kích thước (nghĩa là không phải tất cả bộ nhớ đó là một phần của bộ làm việc riêng của quy trình?). Tuy nhiên, trình lược tả ANTS hiển thị khoảng 700 MB "bộ nhớ không sử dụng được cấp phát cho .NET", và này dường như là một phần của quá trình làm việc riêng tư (như được báo cáo trong taskmgr). Tôi đoán số lượng lớn bộ nhớ không sử dụng này có liên quan đến đống Gen 0 lớn.
Điều gì đang xảy ra trong Application_Start trong khi điều này xảy ra là tôi đang trong một vòng lặp while đọc khoảng một triệu hàng từ một SqlDataReader. Chúng đang được sử dụng để cư trú một bộ nhớ cache lớn để sử dụng sau này. Với điều này, thủ phạm rõ ràng đối với số lượng lớn bộ nhớ không sử dụng là phân mảnh đống đối tượng lớn, nhưng tôi không nghĩ đây là trường hợp vì tôi đang phân bổ trước nhiều hơn là cần thiết cho đối tượng bộ nhớ cache lớn của tôi. Để chắc chắn, tôi thậm chí đã cố gắng bình luận ra một phần của vòng lặp mà thực sự thêm vào đối tượng bộ nhớ cache của tôi; nó không có sự khác biệt về lượng bộ nhớ không sử dụng được cấp phát. Là một thử nghiệm, tôi đã cố gắng thường xuyên buộc thu gom rác của gen 0 trong vòng lặp (chống lại tất cả các khuyến nghị, tôi biết), và điều này khiến kích thước của heap gen0 giảm xuống còn khoảng 128 MB và cũng chỉ dẫn đến một vài MB bộ nhớ trống không sử dụng. Nhưng nó cũng maxed ra CPU của tôi và làm cho Application_Start mất quá nhiều thời gian.
Câu hỏi của tôi là:
1) Điều gì có thể gây ra kích thước báo cáo của Gen 0 Heap phát triển quá lớn?
2) Đây có phải là sự cố không? Đặc biệt, nó có thể gây ra một lượng lớn không gian không sử dụng được cấp cho .NET không?
3) Nếu có, tôi nên làm gì để khắc phục sự cố? Nếu tôi không thể ngăn chặn quá trình sử dụng nhiều bộ nhớ đó trong Application_Start, tôi muốn ít nhất có thể làm cho nó mất bộ nhớ khi ứng dụng bắt đầu hoàn thành.
Điều gì sẽ xảy ra nếu bạn làm một thùng rác đầy đủ * đơn * được thu thập ở cuối Application_Start? –
Một bộ sưu tập rác đầy đủ ở cuối Application_Start đã không tạo ra sự khác biệt. Vấn đề là ngay cả sau khi số lượng lớn các vật thể sống ngắn được thu thập, tất cả ký ức mà họ * đã * đang chiếm vẫn được cấp phát cho quá trình này. –
Tuy nhiên, tôi không còn tin rằng đây là một vấn đề. Hoặc bộ nhớ cuối cùng được phát hành bởi quá trình, hoặc nếu tổng bộ nhớ bắt đầu lấp đầy trước khi điều đó xảy ra, sau đó nó có thể được hoán đổi vào đĩa. Câu hỏi này giải quyết một mối quan tâm tương tự: http: // stackoverflow.com/questions/5244980/khi-là-bộ nhớ-phân bổ-by-net-quá trình phát hành-back-to-windows –