Có, điều này nghe có vẻ quá mức. Giảm số lượng GC có thể là bước duy nhất tốt nhất bạn có thể thực hiện để giảm thời gian chạy của ứng dụng của bạn (nếu đó là mục tiêu của bạn).
Một "% thời gian trong GC" cao thường do phân bổ và sau đó vứt bỏ hàng nghìn hoặc hàng triệu đối tượng. Một cách hay để tìm hiểu điều gì đang xảy ra là sử dụng một công cụ bộ nhớ hồ sơ.
Microsoft cung cấp miễn phí CLR Profiler. Điều này sẽ cho bạn thấy mọi phân bổ, nhưng sẽ làm cho ứng dụng của bạn chạy chậm hơn 10-60 lần. Bạn có thể cần phải chạy nó trên dữ liệu đầu vào ít hơn để nó có thể kết thúc phân tích trong một khoảng thời gian hợp lý.
Công cụ thương mại tuyệt vời là .NET Memory Profiler của SciTech. Điều này áp đặt chi phí thời gian chạy ít hơn nhiều và có bản dùng thử miễn phí. Bằng cách chụp nhiều ảnh trong khi quá trình của bạn đang chạy, bạn có thể tìm ra loại đối tượng nào đang được phân bổ thường xuyên (và sau đó bị phá hủy).
Khi bạn đã xác định nguồn của phân bổ, sau đó bạn cần phải kiểm tra mã và tìm ra cách phân bổ có thể được giảm. Mặc dù không có câu trả lời một kích thước phù hợp, nhưng một số điều tôi đã gặp phải trong quá khứ bao gồm:
- String.Split có thể tạo hàng trăm chuỗi ngắn. Nếu bạn đang thực hiện rất nhiều thao tác chuỗi, nó có thể giúp xử lý chuỗi bằng cách đi theo từng ký tự.
- Tạo mảng hoặc danh sách hàng nghìn lớp nhỏ (có kích thước dưới 24 byte) có thể tốn kém; nếu các lớp đó có thể được coi là các kiểu giá trị, nó có thể (đôi khi) cải thiện đáng kể mọi thứ để thay đổi chúng thành các cấu trúc.
- Tạo hàng nghìn mảng nhỏ có thể tăng mức sử dụng bộ nhớ rất nhiều (vì mỗi mảng có một lượng nhỏ phí trên đầu); đôi khi chúng có thể được thay thế bằng một mảng và chỉ mục lớn thành một phần phụ của nó.
- Có rất nhiều đối tượng cuối cùng (đặc biệt nếu chúng không được xử lý) có thể gây nhiều áp lực lên bộ thu gom rác; đảm bảo rằng bạn đang xử lý chính xác tất cả các đối tượng IDisposable, và lưu ý rằng các kiểu của riêng bạn nên (gần như) never have finalizers.
- Microsoft có một bài viết với Garbage Collection Guidelines để cải thiện hiệu suất.
Nguồn
2009-07-15 15:24:26
Đây có phải là ASP.NET không? –
Một điều cần lưu ý là bộ đếm hiệu suất này hiển thị giá trị quan sát cuối cùng, không phải là giá trị trung bình liên tục. Nó chỉ được cập nhật vào cuối mỗi chu kỳ GC. – adrianbanks
Nó nằm trong một dịch vụ WCF tự lưu trữ. –