Pergunta

Fundo:Na minha empresa, estamos desenvolvendo vários aplicativos que usam as mesmas DLLs principais.Essas dlls estão usando o contêiner IoC do Spring.net para conectar as coisas (fiação automática).Todos os aplicativos estão usando o mesmo arquivo de configuração Spring, e esse arquivo de configuração aponta para muitas classes em muitas DLLs diferentes.Mas nem todos os aplicativos precisam de funcionalidade de todas as DLL.Mas devido à maneira como os contêineres IoC funcionam, todas as DLLs são carregadas para o Spring.net examinar os tipos e verificar quais interfaces eles implementam e assim por diante.

Pergunta central:Entendo que é melhor apenas carregar as DLLs que você realmente usa.Mas é realmente ruim para o uso de memória apenas carregar uma dll gerenciada?Ou é primeiro que você está usando classes na dll e elas estão recebendo o JIT de que a maior parte da memória é usada?

Foi útil?

Solução

Se nenhum código do assembly for usado, eventualmente as páginas desse assembly serão movidas da memória para o arquivo de paginação em favor das páginas usadas ativamente.Nesse caso, o efeito global a longo prazo será provavelmente menor.Porém, haverá um efeito negativo no tempo de inicialização.

Outras dicas

Eu não acho que seja tão ruim.O único problema é que, devido aos grandes metadados e à quantidade de memória que seu aplicativo ocupa, é mais possível que algumas partes do aplicativo que estão em uso estejam localizadas em páginas de memória diferentes, o que pode causar alguns vazamentos de desempenho, mas é um segmento muito baixo do aplicativo onde esse tipo de coisa é crítico.

Muito ruim é um termo difícil de quantificar, acho que depende da escala das coisas, em geral eu diria que se você pode evitar carregar coisas que não precisa, então deveria.Mas é claro que se você estiver usando a reflexão para determinar se você pode use-o, primeiro você precisa carregá-lo...o problema do ovo e da galinha.

Porém, algo a ser observado: depois de carregar um assembly em um domínio de aplicativo, você não poderá descarregá-lo desse domínio de aplicativo; no entanto, é possível criar dinamicamente domínios de aplicativos, carregar assemblies nele e descarregar todo o domínio do aplicativo quando você estiver feito.

é claro que carregar DLLs sem usá-las causa um tempo de inicialização mais lento devido à leitura do assembly do disco e às verificações de evidências/segurança.Mas se a memória é sua preocupação, pelo menos você pode ter certeza de que não desperdiçará mais memória do que o tamanho de seus assemblies se realmente não usar nenhum tipo.É claro que se esses tipos forem especificados na configuração do Spring, pelo menos esses tipos serão carregados na memória e seu inicializador estático (se houver) será executado.Em casos raros, isso pode ser um problema.O JITing é feito pelo CLR por método, portanto, os métodos que você não usa não desperdiçarão CPU + memória.

Em qualquer caso, você pode dividir seus arquivos de configuração em partições, por exemplo.colocando todas as definições de objeto do módulo A no arquivo moduleA.config, todas as definições do módulo B no arquivo moduleB.config e especificando apenas os módulos para seu aplicativo específico que são realmente necessários.

Hth, Erich

P.S.:Eu também gostaria de sugerir que você postasse perguntas relevantes do Spring for .NET em nosso fóruns da comunidade - é mais provável que suas perguntas sejam respondidas lá.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top