2011-01-30 1 views
3

런타임에 여러 외부 어셈블리를 내 응용 프로그램에로드하고 있습니다. 그리고 각 외부 어셈블리에 정의 된 특정 클래스 (예 : 인스턴스 당 10MB)에서 사용할 수있는 메모리 양을 제한해야합니다. 그렇지 않으면 OutOfMemory가됩니다.특정 클래스에서 할당 할 수있는 메모리를 제한하는 방법은 무엇입니까?

나는 이것을 수행하는 가장 좋은 방법은 무엇인가 봤는데 CLR Runtime Hosting에 대한 정보를 찾았습니다. 그것은 내가 필요로하는 것으로 보이지만 나는 좋은 예를 찾을 수 없습니다.

누구나 CLR 런타임 호스팅을 사용하여 메모리 관리에 대한 코드 예제 또는 링크를 공유 할 수 있습니까? 또는 클래스 당 메모리 양을 제한하는 더 좋은 해결책이 있습니까?

미리 감사드립니다.

+0

이것은 흥미로운 주제입니다. 그러나, 당신은 조금 더 정성 들여 주시겠습니까 * 이유는 클래스 단위 *? 어쩌면 클래스 인스턴스에서 생각을 풀면 다른 명백한 해결책이있을 수 있습니다. –

+0

실제로 클래스 단위로 제한하는 것은 그리 중요하지 않습니다. 정확한 유형의 클래스가 인스턴스화 할 유일한 것입니다. 그래서 내 생각을 클래스 인스턴스와 '잠근'합니다. :) 예를 들어 appdomain (appdomain의 각 인스턴스 만들기)에서이 작업을 수행 할 수 있지만 각 appdomain에 대한 memmory를 제한 할 수있는 방법을 찾을 수는 없습니다. (내 목표는 어떻게 든 외부 메모리를 사용할 수있는 메모리를 제한하는 것입니다. 개발자 '라고 말합니다. – Andrey

답변

4

이것은 당신이 CLR 호스팅을 통해 할 수있는 것이 아닙니다. CLR을 호스팅하면 GC에서 Windows 로의 할당 요구 사항을 충족 할 수 있습니다. 그래서 VirtualAlloc 대신 다른 할당자를 사용합니다. 그러나 호스트가 객체가 할당 될 때마다 호출되지는 않습니다 (너무 비쌉니다).

이론적으로 CLR 프로파일 링 API를 사용하여이 작업을 수행 할 수 있습니다. 객체가 할당 될 때마다 콜백을받을 수 있습니다.

나는 당신이 틀린 관점에서 이것을 보려고합니다. 매우 세분화 된 클래스 인스턴스가 사용하는 메모리 양을 제한하는 대신 이러한 외부 어셈블리를 별도의 프로세스로 분리하여 Win32 작업 객체 API를 사용하여 제한 할 수 있습니까?

+0

이론적으로 이러한 어셈블리가 수백 개있을 수 있으며 상호 작용이 가능하기 때문에 각 프로세스를 별도의 프로세스로 격리하는 것이 두려운 것입니다. 물론 제한 할 수있는 옵션이 없으면 프로세스를 제외하고 메모리, 난 선택의 여지가 :) 당신을 위해 감사 응답 – Andrey

+0

내 경험에 의하면, 이러한 경우 표준 절차는 별도의 AppDomain에 각각 별도의 프로세스에서 여러 개의 플러그인 어셈블리를 실행하는 것입니다. 일반적으로 신뢰할 수있는 "사용자"코드와 그렇지 않은 "다른"코드가 있으므로 격리가 너무 많지 않습니다. –

0

개별 프로세스 메모리 사용량을 제한하려는 경우 프로세스 클래스의 'MaxWorkingSet'속성을 사용하는 것이 좋습니다. 자세한 내용은 http://msdn.microsoft.com/en-us/library/system.diagnostics.process.maxworkingset.aspx을 참조하십시오.

+0

내 목표는 하나의 프로세스에서 각 특정 클래스 인스턴스의 메모리 양을 제한하는 것입니다 – Andrey

+0

이 스레드를 확인하십시오 http://stackoverflow.com/questions/4752439/memory-usage-of-class-instance-in-c –

+0

나는 ' ve는 단지 얼마나 많은 메모리가 이미 사용되었는지를 결정하는 방법을 찾았습니다. 그러나 제 질문은 외부의 '개발자'가 예를 들어 10MB 이상을 사용하지 못하게하는 방법입니다. 모든 것이 할당 된 다음 할당 된 메모리 양을 확인하는 것은 좋지 않습니다. – Andrey