2011-11-04 7 views
2

모두리플렉션을 사용한 어셈블리로드 중 메모리 관리

복합 패턴을 사용하는 구성 요소를 생성하고 있습니다. 핵심 구성 요소는 XMl 메타 데이터를 사용하여 컴포지트 (부품)를 정의합니다. 런타임시 핵심 컴포넌트는 리플렉션을 사용하여 부품 어셈블리를 메모리 및 호출 메소드에로드합니다 (예 : IPart.execute 메소드).

이제 내 문제는 내가 객체를 폐기하거나하지 않을 경우

1) 반사를 사용하여로드되는 어셈블리에 의해 점유 된 (동적) 메모리가 언로드 될 것입니다.

2) 메모리를 언로드하거나 해제하지 않으면 메모리에서 제거 할 수있는 방법이 있습니까?

이 질문의 이유는 내가 만들고있는 구성 요소가 커스터마이징이 가능한 엔터프라이즈 응용 프로그램의 비즈니스 계층의 핵심이되기 때문입니다.

감사 앨버트 Arul 프라 카쉬

+0

우리가 Regex microsoft를 사용하면 동적 어셈블리를 만들고이 어셈블리는 application/appdomain이 재활용 될 때까지 메모리에서 가비지 수집/언로드되지 않는다고 말합니다. 리플렉션을 사용하여 어셈블리를로드하면 동적 어셈블리가 만들어집니다. 그렇다면 객체는 항상 메모리에 있으며 메모리 사용은 최적화되지 않습니다. 이것은 내 관심사입니다. 적절한 방어 코딩과 IDIspose 등을 통해 리소스를 확보 할 수 있습니다. – Bepenfriends

답변

1

내가 본 사람들은 반성을 통해 추가 라이브러리를로드 다른 응용 프로그램 도메인에 (우리는이 라이브러리 "플러그인"을 호출 할 수 있습니다). 예를 들어,이 문서를 참조하십시오 : http://adrianvintu.com/blogengine/post/Unloadable-plugins.aspx 당신이 "악"플러그인뿐만 아니라 메모리로부터 보호하는이 방법은 응용 프로그램 도메인 (AppDomain을 언로드 할 때, 메모리뿐만 아니라 최대 해제)

+0

지금까지 앱 도메인을 사용한 적이 없습니다. 내 의견은 어리 석다. 복합체는 컨설턴트 또는 시스템 관리자가 개발 한 더 많은 복합 부품을 사용할 수있는 메소드 (예 : Company.Insert) 용입니다. 따라서 Company.Insert 메서드와 그 부분을 별도의 appdomain에로드하면 주어진 시간에 더 많은 App 도메인 수가 메모리에있을 가능성이 있습니다. 성능 문제가 발생하지 않습니까? – Bepenfriends

0

관리 할 수 ​​있습니다

플러그인/모듈에서 메모리를 소비 할 수있는 두 가지가 있습니다. 총체적으로 말하자면,이 코드 (어셈블리를 프로세스 공간에로드하면 메모리를 사용함)와 객체 (인스턴스를 생성하면 메모리를 사용함)입니다.

리플렉션을 사용하여로드 된 어셈블리가 차지하는 (동적 인) 메모리는 개체를 처분 할 때 언로드됩니다.

IDisposableDispose을 호출하면 메모리에 관한 한 아무 것도 처리하지 않습니다. 객체가 사용하는 리소스를 해제 할 수 있습니다 (예 : 파일을 닫으면 열린 파일 핸들을 제거합니다). 그러나 객체 자체를 해제하지는 않습니다. IDisposable은 마법 같은 메모리 해제 기능이 아닙니다. 이것은 인터페이스가 소유하고있는 자원을 제거해야한다는 것을 객체가 알 수있게하는 단지 방법입니다.

개체 자체를 해제하려면 해당 개체에 대한 모든 참조를 제거해야합니다 (null로 설정하거나 프로그램 스택에서 삭제하도록 할 수 있음). 결국 가비지 수집기를 실행하여 해당 메모리를 회수해야합니다.

언로드 및 메모리를 해제하지 않으면 메모리에서 제거 할 수있는 방법이 있습니까?

GUI 및 파일 핸들과 같은 리소스에만 관심이있는 경우 Dispose으로 전화하십시오. 항상 다음 작업을 수행해야합니다.

개체 메모리가 염려되는 경우 GC가 작동하도록하십시오. 그것도 괴롭히지 마십시오. 그것을 스스로 실행하십시오.

코드 메모리가 염려되는 경우 코드가 들어있는 AppDomain을 언로드해야합니다.이 값이 기본값 인 AppDomain이면 프로그램을 종료하지 않고 언로드 할 수 없습니다. 대신, 런타임에 작성한 서브 AppDomain에 해당 플러그인을로드해야합니다. 그런 다음 하위 공간 AppDomain을 언로드하여 프로세스 공간에서 코드를 가져올 수 있습니다.

서브 AppDomain 사용 방법에 대한 정보는 naivists' answer을 참조하십시오.