12

MSDN에 따르면, 동시 가비지 수집 (기본 동작이므로 <gcConcurrent enabled="true"/> 또는 지정되지 않음)으로 인해로드가 심한 .NET 응용 프로그램이 ExecutionEngineException을 throw 할 수 있다는 내용의 "팁"이 있습니다. 누구든지 Microsoft KB 기사 또는 이에 대한 배경을 제공하는 다른 소스를 알고 있습니까?동시 GC로 인해 때때로 MSDN 당 ExecutionEngineException이 발생하는 이유는 무엇입니까?

우리는 NHibernate 3.2 기반 Windows 서비스 응용 프로그램을 직접 경험했습니다.이 응용 프로그램은 최대 몇 시간의 작동 후에도 항상 충돌합니다. 우리는 ISession.Flush() 호출에 대한 예외를 추적 할 수있었습니다.

nhusers에 동일한 문제가있는 것으로보고 한 사람이 thread입니다. 동시 GC를 비활성화하는 것이었던 그의 제안 된 해결 방법은 지금까지 우리에게 도움이되었습니다. 동시 GC를 암시 적으로 비활성화하는 서버 모드 GC (<gcServer enable="true"/>)로 전환하는 것도 트릭을 수행했습니다.

이 버그를 MS에 버그로 제출하기 전에,이 팁에 언급 된 동시 GC 불안정성에 대한 추가 정보가있는 사용자가 있는지 확인하고 싶습니다.

+2

문서화되었다는 사실을 감안할 때 귀하의 버그는 "디자인 별"으로 마감 될 수 있습니다. 그건 제쳐두고, 재미있는 질문. – vcsjones

+2

@Nick Jones : .NET 4.0 설명서에는이 버전이 더 이상 사용되지 않고 런타임에 더 이상이 예외를 throw하지 않는다고 나와 있습니다. – casperOne

+0

@casperOne : NH 3.2는. NET 3.5에 대해 컴파일됩니다. –

답변

5

동시 GC를 사용하도록 설정하면 GC가 응용 프로그램을 일시 중지하지 않고 작업을 시도하기 때문에 응용 프로그램이 과부하 일 때 발생하는 것으로 생각됩니다. GC가 GC주기의 압축 단계에서 메모리를 이동하려고 시도하고 메모리를 이동할 수 없거나 응용 프로그램 포인터를 올바르게 업데이트 할 수없는 상황이 발생하면 런타임에서이 문제를 일으킬 수 있습니다 예외로 인해 응용 프로그램이 잠재적으로 유효하지 않은 상태가 될 수 있습니다.

@casperOne은 자신의 의견에서 지적했듯이이 예외는 .NET 4.0에서는 사용되지 않는 것으로 표시되어 있지만 반드시 GC가 여전히 예외를 throw하는 동일한 상태가 될 수는 없습니다. .NET 3.5. GC가 그와 같은 상태가되면 런타임은 FailFast 명령을 실행하고 예외를 던지기보다는 종료합니다.

+1

을 참조하십시오. "API"가 사용되지 않는 것으로 표시되어 있지만 버그는 실제로 ** .NET 4.0 **에서 발생합니다 (예 :이 SO 스레드 : [응용 프로그램이 ".NET 런타임의 내부 오류로 중단됨]"(http://stackoverflow.com/q/4367664/69809)). [MSDN KB 항목] (http://support.microsoft.com/kb/2679415)에 x64 .NET 4 문제로 설명되어 있지만 x64로 제한되지는 않을 것입니다. 우리에게는 같은 문제가 있었고, NHibernate가 관련되어 있었고 동시 GC 전환으로 인해 문제가 해결되었습니다. 그것은 아침에 일하기 위해 와서 내부 .NET 예외에 의해 아래로 가져온 우리의 메인 서버 응용 프로그램을 볼 수 있습니다. :) – Groo

관련 문제