터미널 서비스 환경에서 .NET 2.0 WinForms 응용 프로그램을 실행하면 예기치 않은 결과가 나타납니다. 내가 읽은 모든 것은 JIT 어셈블리 (즉, 네이티브 이미지를 생성하기 위해 NGen을 사용하지 않음)가 모든 코드 공간을 사적 페이지에 저장함으로써 작업 세트 크기/메모리 압력을 증가 시킨다는 것을 나타냅니다. 그러나 실제 결과 (Process Explorer, VMMap 및 WinDbg를 사용하여 검증 됨)는 실제로 JIT의 어셈블리가 공유 가능 페이지에 배치되었음을 보여줍니다. (실제로 실행중인 응용 프로그램이 여러 개인 경우에도 별도의 TS로 공유됩니다. 세션/사용자)..NET JIT'ed 어셈블리 (공유 가능 페이지에 있음)
이유가 무엇인지 설명 할 수 있습니까? 이것은 W2K8 서버 환경에서 실행되므로 ASLR은 각 어셈블리에 대해 특정 기본 주소가 부족한 이유를 설명합니다 & 결과 리베이스가 문제를 일으키지 않습니다. 그럼에도 불구하고 이러한 것들이 원시 PE 이미지가 아닌 것으로 보이기 때문에 개인 페이지에 저장되는 어셈블리에 대한 코드가 생성되어야합니다.
이것은 우리가 NGen을 사용하여 메모리 부족을 줄이기 위해 조사를 시작했을 때 발견되었지만 JIT의 어셈블리가 이미 공유되었으므로 실제로 작업 세트 크기가 늘어난 것을 발견했습니다.
이편집 :
내가 발견 한 가장 최근의 참조는 다시 우리의 실제 결과는 다른 어떤 여기 나는 그것을 추가해야합니다 첫번째 질문, 윈도우에 대한 실험을 게시 이후 Server 2003 테스트 상자는 프로세스간에 공유 할 수있는 JIT의 어셈블리를 분명히 보여줍니다. 나는 내가 발견 할 수있는 모든 조언이 NGen이 필요하다는 것을 나타내는 이유에 관해서는 여전히 혼란 스럽다. 그러나 모든 현실 세계의 증거들은 그와 모순된다. 나는 여기 전문가들이 약간의 빛을 발할 수 있기를 정말로 바라고있다.
감사합니다.
편집 : 나는 모든 .NET/CLR 서적을 정리했으며이 문제를 해결하기 위해 검색 쿼리 아이디어가 부족합니다. 누가 나에게 무슨 일이 일어나고 있는지 이해하지 못한다는 끔찍한 잔소리 같은 감정을 없애기 위해 하루를 보냈습니다! :)
NGen이 메모리 사용에 실제로 도움이된다는 (그리고 우리 환경에서 시작 시간의 영향을 무시할 수 있음) 어떠한 확실한 증거가 없으면 우리는 어셈블리의 기본 이미지를 생성하지 않기로 결정했습니다. 나는 아직도 우리가 왜 이런 예기치 않은 행동을하고 있는지 알고 싶습니다! – allgeek