tôi vẫn không chắc chắn về điều này Tôi đang làm việc từ 7 năm trên Máy chủ ứng dụng. Cài đặt lớn hơn của chúng tôi sử dụng Ram 24 GB. Đa luồng rất cao và TẤT CẢ các cuộc gọi cho GC.Collect () gặp phải các vấn đề hiệu năng thực sự khủng khiếp.
Nhiều thành phần bên thứ ba đã sử dụng GC.Collect () khi họ nghĩ rằng thật thông minh để làm điều này ngay bây giờ. Vì vậy, một loạt các Báo cáo Excel đơn giản đã chặn Máy chủ ứng dụng cho tất cả các luồng vài lần một phút.
Chúng tôi đã phải cấu trúc lại tất cả các Thành phần của bên thứ 3 để loại bỏ các cuộc gọi GC.Collect () và tất cả đều hoạt động tốt sau khi thực hiện việc này.
Nhưng tôi cũng đang chạy Máy chủ trên Win32, và ở đây tôi bắt đầu sử dụng rất nhiều GC.Collect () sau khi nhận được OutOfMemoryException.
Nhưng tôi cũng không chắc lắm về điều này, vì tôi thường nhận thấy, khi tôi nhận được OOM trên 32 Bit và tôi thử chạy lại hoạt động tương tự, mà không gọi cho GC.Collect (), nó chỉ hoạt động tốt.
Một điều tôi tự hỏi là chính OOM Exception ... Nếu tôi đã viết .Net Framework và tôi không thể phân bổ một khối bộ nhớ, tôi sẽ sử dụng GC.Collect (), phân mảnh bộ nhớ (??), thử lại và nếu tôi vẫn không thể tìm thấy khối bộ nhớ trống, thì tôi sẽ ném OOM-Exception.
Hoặc ít nhất thực hiện hành vi này dưới dạng tùy chọn có thể định cấu hình, do những hạn chế của vấn đề hiệu năng với GC.Collect.
Bây giờ tôi có rất nhiều mã như thế này trong ứng dụng của mình để "giải quyết" vấn đề:
public static TResult ExecuteOOMAware<T1, T2, TResult>(Func<T1,T2 ,TResult> func, T1 a1, T2 a2)
{
int oomCounter = 0;
int maxOOMRetries = 10;
do
{
try
{
return func(a1, a2);
}
catch (OutOfMemoryException)
{
oomCounter++;
if (maxOOMRetries > 10)
{
throw;
}
else
{
Log.Info("OutOfMemory-Exception caught, Trying to fix. Counter: " + oomCounter.ToString());
System.Threading.Thread.Sleep(TimeSpan.FromSeconds(oomCounter * 10));
GC.Collect();
}
}
} while (oomCounter < maxOOMRetries);
// never gets hitted.
return default(TResult);
}
(Lưu ý rằng hành vi Thread.S ngủ () là một hành vi ứng dụng thực sự của Ứng dụng, bởi vì chúng tôi đang chạy Dịch vụ lưu đệm ORM và dịch vụ phải mất một thời gian để giải phóng tất cả các đối tượng được lưu trong bộ nhớ cache, nếu RAM vượt quá một số giá trị được xác định trước. vài giây lần đầu tiên và đã tăng thời gian chờ đợi mỗi lần xuất hiện của OOM.)