2008-09-16 5 views
3

배경 : 우리 회사에서 우리는 동일한 핵심 dll을 사용하는 묶음 응용 프로그램을 개발하고 있습니다. 이 dll은 Spring.net의 IoC 컨테이너를 사용하여 일을 연결합니다 (자동 배선). 모든 응용 프로그램은 동일한 스프링 구성 파일을 사용하며이 구성 파일은 여러 dll 파일의 여러 클래스를 가리 킵니다. 그러나 모든 응용 프로그램이 모든 dll의 기능을 필요로하는 것은 아닙니다. 그러나 IoC 컨테이너가 작동하는 방식 때문에 Spring.net에서는 모든 dll을로드하여 유형을 검사하고 구현하는 인터페이스를 확인합니다.많은 유형의 관리 DLL을로드하지 않는 것이 좋습니까?

핵심 질문 : 나는 당신이 정말로 사용하는 dll을로드하는 것이 낫다는 것을 이해합니다. 그러나 관리되는 dll을로드하는 것만으로 메모리 사용량이 실제로 나쁜 것입니까? 아니면 그것은 먼저 dll 클래스를 사용하고 그들은 대부분의 메모리가 사용되는 JIT'ed지고있다?

답변

1

어셈블리의 코드를 전혀 사용하지 않으면 결국 해당 어셈블리의 페이지가 메모리에서 페이지 파일로 이동되어 적극적으로 사용되는 페이지가 생성됩니다. 이 경우 전반적인 장기 효과는 미미할 수 있습니다. 그러나 시작 시간에 부정적인 영향을 미칩니다.

1

나는 그렇게 나쁘지 않다고 생각합니다. 유일한 문제는 큰 메타 데이터와 메모리 용량으로 인해 응용 프로그램이 사용하는 일부 응용 프로그램이 다른 성능의 메모리 누수가 발생할 수있는 다른 메모리 페이지에 위치 할 가능성이 있지만 응용 프로그램이 매우 낮습니다. 이런 종류의 일은 매우 중요합니다.

1

정말 나쁘다는 것은 정량화하기가 어려운 용어입니다. 일반적으로 물건의 크기에 따라 다르다고 생각합니다. 물건을 적재하지 않으면 그럴 필요가 없습니다. 물론 당신이 반사를 사용하여 당신이 일 수 있다면 그것을 사용하면, 그것을로드해야합니다 ... 닭고기와 계란 문제.

알아 두어야 할 사항 어셈블리를 응용 프로그램 도메인에로드하면 해당 응용 프로그램 도메인에서 어셈블리를 언로드 할 수 없지만 동적으로 응용 프로그램 도메인을 어셈블리 도메인에로드하고 전체 응용 프로그램을 언로드 할 수는 있습니다 도메인이 완료되면

0

물론 디스크를 사용하지 않고 dll을로드하면 디스크에서 어셈블리를 읽고 증거/보안 검사를하기 때문에 시작 시간이 느려집니다. 하지만 메모리가 걱정된다면 최소한 확신 할 수 있습니다. 실제로 어떤 유형도 사용하지 않으면 어셈블리 크기보다 많은 메모리를 낭비하지 않아도됩니다. 물론 이러한 유형이 스프링 구성에 지정되어 있으면 적어도 해당 유형이 메모리에로드되고 정적 초기화 프로그램 (있는 경우)이 실행됩니다. 드문 경우이지만 이것이 문제 일 수 있습니다. JITing은 메소드별로 CLR이 수행하므로 사용하지 않는 메소드는 CPU + 메모리를 낭비하지 않습니다.

어쨌든 구성 파일을 파티션으로 나눌 수 있습니다. 모듈 A의 모든 객체 정의를 moduleA.config 파일에 넣고 모듈 B의 모든 정의를 moduleB.config 파일에 넣고 특정 응용 프로그램에 실제로 필요한 모듈 만 지정합니다.

HTH, 에리히

P.S : 나는 또한 당신이 .NET 관련 질문 봄을 게시 제안하고 싶습니다 우리의 community forums - 그것은 당신의 질문이 대답 얻을 가능성이 높습니다.

관련 문제