12

Theo MSDN, có một "mẹo" nói rằng ứng dụng .NET chạy dưới tải nặng với bộ sưu tập rác đồng thời (hoặc <gcConcurrent enabled="true"/> hoặc không xác định, vì đó là hành vi mặc định) có thể ném một ExecutionEngineException. Có ai biết về bài viết Microsoft KB hoặc nguồn khác cung cấp thêm nền tảng về điều này không?Tại sao GC đồng thời đôi khi gây ra ExecutionEngineException (trên MSDN)?

Chúng tôi đã trải nghiệm điều này trực tiếp với ứng dụng Dịch vụ Windows dựa trên nền tảng NHibernate 3.2, điều này sẽ luôn sụp đổ sau ít nhất một vài giờ hoạt động. Chúng tôi đã có thể theo dõi ngoại lệ cho cuộc gọi ISession.Flush().

Có một số thread trên người nhai báo cáo có vẻ là vấn đề tương tự. Cách giải quyết được đề xuất của ông, đó là vô hiệu hóa GC đồng thời, đã làm việc cho chúng tôi cho đến nay, mặc dù chuyển sang chế độ máy chủ GC (<gcServer enable="true"/>), điều này ngầm vô hiệu hóa GC đồng thời cũng đã thực hiện thủ thuật.

Trước khi gửi lỗi này cho MS dưới dạng lỗi, tôi muốn tìm hiểu xem có ai ngoài đó có thông tin bổ sung về tính đồng bộ GC đồng thời mà mẹo đề cập hay không.

+2

Do thực tế là tài liệu được viết, lỗi của bạn có thể bị đóng là "Theo thiết kế". Đó sang một bên, câu hỏi thú vị. – vcsjones

+2

@Nick Jones: Tài liệu .NET 4.0 cũng liệt kê nó là lỗi thời và nói rằng thời gian chạy không còn ném ngoại lệ này nữa. – casperOne

+0

@casperOne: đã lưu ý, nhưng NH 3.2 được biên dịch dựa trên .NET 3.5. –

Trả lời

5

Tôi nghi ngờ điều này xảy ra khi ứng dụng chịu tải nặng vì khi GC đồng thời được bật, GC cố gắng thực hiện công việc mà không cần tạm dừng ứng dụng của bạn. Nếu GC gặp một tình huống mà nó cố gắng di chuyển bộ nhớ xung quanh trong giai đoạn nén của chu kỳ GC và không thể di chuyển bộ nhớ hoặc không thể cập nhật chính xác các con trỏ ứng dụng, điều đó có thể khiến thời gian chạy bị ném ngoại lệ vì nó sẽ kết thúc đưa ứng dụng của bạn vào trạng thái không hợp lệ tiềm ẩn.

Như @casperOne chỉ ra trong bình luận của mình, ngoại lệ này được đánh dấu là lỗi thời trong .NET 4.0 mặc dù điều đó không nhất thiết có nghĩa là GC vẫn không thể tự rơi vào trạng thái tương tự khiến nó ném ngoại lệ .NET 3.5. Nếu GC đã nhận được chính nó vào cùng một trạng thái, thời gian chạy sẽ phát hành một lệnh FailFast và chấm dứt hơn là ném một ngoại lệ.

+1

Lưu ý rằng, trong khi "API" được đánh dấu lỗi thời, lỗi thực sự xảy ra trong **. NET 4.0 ** (ví dụ như chủ đề SO này: [Lỗi ứng dụng với "Lỗi nội bộ trong .NET Runtime"] (http://stackoverflow.com/q/4367664/69809)). [MSDN KB entry] (http://support.microsoft.com/kb/2679415) mô tả nó như là một vấn đề x64 .NET 4, nhưng tôi sẽ không đặt cược nó giới hạn ở x64. Chúng tôi đã có cùng một vấn đề, và nó cũng đã NHibernate tham gia, và tắt GC đồng thời cố định nó. Nó sucks để đi làm vào buổi sáng và thấy ứng dụng máy chủ chính của chúng tôi đưa xuống bởi một ngoại lệ. NET nội bộ. :) – Groo

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