2013-05-23 1 views
1

동일한 클래스 라이브러리를 참조하는 두 개의 ASP.NET 웹 사이트가 있습니다. 현재 우리는 클래스 라이브러리의 두 복사본으로 사이트를 게시합니다. 이것은 메모리를 낭비합니까? 운영 체제는 파일의 두 복사본이 동일하므로 DLL의 코드 섹션에 대한 메모리를 공유 할 수 있다는 것을 알고 있습니까? GAC 또는 다른 공유 위치에 복사하여 하나의 실제 파일로 만들면 총 메모리가 적게 매핑됩니까?두 개의 .NET 프로세스가 DLL 메모리를 언제 공유 할 수 있습니까?

+0

만약 당신이 이것에 대해 걱정된다면 다른 것이 틀릴 수도 있습니다. –

+0

그런 질문을하는 경우 dll의 크기는 무엇입니까? 왜 asp.net에 대해 이야기하고 있다면 Windows에 태그를 지정합니까? – Uzzy

+0

@Uzzy 실제로 많은 DLL이 공유되어 수백 메가의 가치가 있습니다. 나는 그 질문을 위해 단순화하고 있었다. Windows는 주로 일반적인 Windows 질문이기 때문에 .NET 응답은 응답에 영향을 줄 수 있습니다. –

답변

0

프로세스 및 앱 도메인이 제대로 작동하려면 메모리에로드해야합니다. 앱 도메인 및 프로세스는 샌드 박스 처리됩니다.

+0

예.하지만 OS에는 일반적으로로드되는 DLL의 일부 읽기 전용 부분을 공유 할 수있는 기능이 있습니다. 나는 그것을 활용할 수 있는지를/알고 싶다. –

3

이 질문은 잘못된 전제로 시작되며 ASP.NET DLL에는 코드가 포함되어 있지 않습니다. 데이터, IL 및 어셈블리 매니페스트 만 표시됩니다. 지터가 IL에서 기계 코드를 생성하면 해당 코드가 AppDomain의 로더 힙으로 이동합니다. 프로세스의 개인 바이트이며 공유되지 않습니다.

일리노이에서 생성 된 기계어 코드 한 부를 가져 오는 것이 가능합니다. Ngen.exe를 실행해야합니다. IL을 사전 처리 컴파일하고 GAC 하위 디렉토리에 저장된 .ni.dll 인 네이티브 DLL을 생성합니다. 이 코드는 RAM에있는 단 하나의 복사본과 공유 할 수 있습니다.

+0

기본 주소에 로딩하는 것도 퍼즐의 중요한 부분입니다. http://msdn.microsoft.com/en-us/magazine/cc163610.aspx#S4 주소 공간 레이아웃 - 최신 버전의 Windows에서 구현되고 네트워크 코드에 강력하게 권장되는 무작위 화가이를 방해합니다. –

+0

@Hans Passant : Process Explorer에서 Temporary ASP.NET DLL 경로에서 여러 번로드 된 .NET DLL이 가상 경로로 구분되고 0이 아닌 (흔히 의미있는) WS 공유 가능 바이트 및 WS가로드되는 것을 볼 수 있습니다. 공유 바이트. 그것은 내가 GAC에 넣었을 때 공유 할 수있는 것이 있다는 것을 의미합니다. 그리고 만약 내가 NGen'd 먼저 더 많은 어쩌면? –

+0

제가 설명했듯이 공유 바이트에 대해 0이 아닌 값을 원하면 ngen.exe를 실행하고 다시 시도해야합니다. –