어떤 유형도 사용하지 않고 많은 관리 DLL을 로드하는 것이 좋지 않습니까?

StackOverflow https://stackoverflow.com/questions/70098

문제

배경:우리 회사에서는 동일한 핵심 DLL을 사용하는 여러 응용 프로그램을 개발 중입니다.이러한 dll은 Spring.net의 IoC 컨테이너를 사용하여 연결(자동 연결)합니다.모든 애플리케이션은 동일한 스프링 구성 파일을 사용하고 있으며 이 구성 파일은 다양한 dll의 많은 클래스를 가리킵니다.그러나 모든 응용 프로그램에 모든 dll의 기능이 필요한 것은 아닙니다.그러나 IoC 컨테이너가 작동하는 방식으로 인해 모든 dll이 Spring.net에 로드되어 유형을 검사하고 구현하는 인터페이스 등을 확인합니다.

핵심 질문:실제로 사용하는 DLL을 로드하는 것이 더 낫다는 것을 이해합니다.하지만 관리되는 DLL을 로드하는 것만으로도 메모리 사용량이 정말 나쁜가요?아니면 먼저 dll에서 클래스를 사용하고 있으며 대부분의 메모리가 사용된다는 JIT를 받고 있습니까?

도움이 되었습니까?

해결책

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

다른 팁

나는 그것이 그렇게 나쁘다고 생각하지 않는다.유일한 문제는 애플리케이션이 차지하는 메모리 양이 많고 메타데이터가 크기 때문에 사용 중인 애플리케이션의 일부 부분이 다른 메모리 페이지에 위치하여 성능 누수가 발생할 가능성이 더 높다는 것입니다. 이런 종류의 일은 매우 중요합니다.

정말 나쁘다는 것은 정량화하기 어려운 용어입니다. 사물의 규모에 따라 달라지는 것 같습니다. 일반적으로 필요하지 않은 항목을 로드하는 것을 피할 수 있다면 그렇게 해야 한다고 말하고 싶습니다.그러나 물론 리플렉션을 사용하여 ~할 수 있다 그것을 사용하려면 먼저 그것을 로드해야 합니다...닭고기와 달걀 문제.

하지만 알아야 할 사항은 어셈블리를 애플리케이션 도메인에 로드한 후에는 해당 앱 도메인에서 이를 언로드할 수 없다는 점입니다. 그러나 앱 도메인을 동적으로 생성하여 해당 어셈블리에 어셈블리를 로드하고 전체 앱 도메인을 언로드할 수 있습니다. 완료.

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

어떤 경우든 구성 파일을 파티션으로 분할할 수 있습니다.모듈 A의 모든 객체 정의를 moduleA.config 파일에 넣고, 모듈 B의 모든 정의를 moduleB.config 파일에 넣고 특정 애플리케이션에 실제로 필요한 모듈만 지정합니다.

HTH, 에리히

추신.:또한 Spring for .NET 관련 질문을 우리 웹사이트에 게시할 것을 제안하고 싶습니다. 커뮤니티 포럼 - 그곳에서 귀하의 질문에 대한 답변을 얻을 가능성이 더 높습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top