2010-05-10 18 views
7

Tôi có một trang web mà là ném OutOfMemoryExceptions vào bất cứ khi nào nó được cho là vị trí sau trong mã của tôi:NET OutOfMemoryException trên XMLSerializer.Serialize

XmlSerializer xs = new XmlSerializer(t, xoverrides); 

Thấy thế nào điều này chỉ xảy ra khi nó là trên máy chủ web , tôi không có nhiều thông tin về lý do tại sao điều này xảy ra. Tôi biết rằng các đối tượng mà nó đang serializing không phải là bất cứ điều gì quá nghiêm trọng - chắc chắn ít hơn một MB mỗi.

Bạn đã có điều này trước đây chưa? Cảm thấy muốn giúp tôi chẩn đoán vấn đề? Bất kỳ trợ giúp được đánh giá cao.

Cảm ơn!

Trả lời

9

Ngoại lệ OutOfMemoryException không phải do các đối tượng được sắp xếp, mà thay vào đó là kết quả của việc xây dựng các đối tượng XmlSerializer. Khi một XmlSerializer được tạo ra, một assembly được tạo động và nạp vào AppDomain. Những hội đồng không thể được thu thập rác cho đến khi AppDomain của họ được dỡ bỏ, mà trong trường hợp của bạn là không bao giờ. Tùy thuộc vào hàm tạo XmlSerializer đang được sử dụng, mỗi XmlSerializer được xây dựng sẽ tự động tạo ra một assembly mới. Theo thời gian, các hội đồng này sẽ tiêu thụ tất cả bộ nhớ có sẵn.

Có một vài giải pháp:

  1. cache XmlSerializer mà bạn tạo.
  2. Sử dụng một trong các quá tải khởi tạo XmlSerializer thực hiện bộ nhớ đệm. Dường như bạn đang sử dụng XmlSerializer (Type, XmlAttributeOverrides) mà không thực hiện bộ nhớ đệm. XmlSerializer (Type) và XmlSerializer (Type, string) thực hiện bộ nhớ đệm.

Microsoft KB : Memory usage is high when you create several XmlSerializer objects in ASP.NET

+0

Hi, tôi đã phải đối mặt với vấn đề tương tự trong khi tôi đang sử dụng "mới XmlSerializer (o.GetType());". Tôi đang đối mặt với vấn đề này tại máy địa phương của tôi với dữ liệu rất lớn đang được đăng, Nó không đưa ra bất kỳ ngoại lệ nào về ứng dụng trực tiếp đang được lưu trữ trên máy chủ đám mây. Nhưng tôi không thể sử dụng và kiểm tra chuỗi tuần tự hóa thêm trong quá trình phát triển. Tôi đang mở để gợi ý. –

0

Nếu tôi nhớ lại các sự cố tương tự trong khi quay lại, XmlSerializer cần nhiều bộ nhớ hơn dữ liệu xử lý của nó. Tôi không chắc chắn tại sao đây là trường hợp mặc dù.

Các vấn đề liên quan