문제

AC#기반 웹 서비스에서 IronpyThon을 호스팅하여 사용자 정의 확장 스크립트를 제공 할 수 있습니다. 그러나 루프에서 웹 서비스를 반복적으로 실행하여 간단한로드 테스트를 수행 할 때 메모리 사용이 급격히 증가한다는 것을 알게되었습니다.

Ironpython-1.1은 객체에 idisposable을 구현하여 객체가 완료되었을 때 폐기 할 수 있도록 객체를 구현했습니다. DLR을 기반으로 한 새로운 Ironpython-2 엔진에는 그러한 개념이 없습니다.

내가 이해 한 바에 따르면, 스크립 테진에서 스크립트를 실행할 때마다 새 어셈블리가 appdomain에 주입되어 언로드 할 수 없습니다.

이 주위에 어떤 방법이 있습니까?

도움이 되었습니까?

해결책 3

ASPNET_WP가 약 500MB로 이동 한 후에는 쓰레기 수집가가 차고 혼란을 정리합니다. 그런 다음 메모리 사용량은 약 20MB로 떨어지고로드 테스트 중에 꾸준히 증가하기 시작합니다. 따라서 메모리 '누출'이 없습니다.

다른 팁

Ironpython 스크립트 중 하나를 실행할 때마다 새로운 AppDomain을 만들 수 있습니다. AssebMlies는 메모리에서 언로드 할 수는 없지만 AppDomain을 언로드 할 수 있으므로 주입 된 어셈블리를 메모리에서 빼낼 수 있습니다.

최적화 된 코드 생성을 비활성화해야합니다.

var runtime = Python.CreateRuntime();
var engine = runtime.GetEngine("py");
PythonCompilerOptions pco = (PythonCompilerOptions)engine.GetCompilerOptions();
pco.Module &= ~ModuleOptions.Optimized;

// this shouldn't leak now
while(true) {
   var code = engine.CreateScriptSourceFromString("1.0+2.0").Compile(pco);
   code.Execute();
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top