2016-11-02 4 views
0

많은 사용자가 다양한 하드웨어에서 실행되는 WPF 데스크톱 응용 프로그램을 검토합니다. 여러 스레드가 지속적으로 많은 양의 데이터를 처리합니다.app.config를 변경하지 않고 데스크톱 응용 프로그램에서 백그라운드 서버 GC를 사용하려면 어떻게해야합니까?

켜기 .NET Framework 4.5 Background server garbage collection을 켜면 성능이 크게 향상되었지만 사용되는 메모리가 많고 CPU 사용 패턴이 다양합니다. 이는 덜 강력한 시스템을 사용하는 사용자에게는 잠재적 인 문제이므로 대부분의 사람들에게 혜택을 줄 수있는 사용자에게 모든 사람들에게 강제하지 않고 서버 GC를 사용하도록 지정하려고합니다.

<configuration> 
    <runtime> 
    <gcServer enabled="true"/> 
    </runtime> 
</configuration> 

그러나, 대부분의 사용자가 응용 프로그램은 프로그램 파일 내에 존재로 이것을 수정할 수있는 권한이 없습니다 그리고 그들은 아니에요 :

나는이 가능하도록 지금까지 찾은 유일한 방법은 App.Config에 로컬 관리자. 내 이상적인 시나리오는 서버 GC를 사용하도록 설정 한 상태에서 앱을 다시 시작하고 선택 사항을 기억할 수있는 친숙한 옵션입니다.

내 질문은 : 누군가이 설정을 적용하는 다른 방법을 알고 있습니까?

나는 아마 바램이 들기도하지만, 이상적으로는 런타임시 동적 인 것이거나 프로세스의 컨텍스트에서 설정할 수있는 명령 줄 인수 또는 환경 변수 일 수 있습니다. complus_gcServer env variable으로 CoreCLR에이 사실에 대한 힌트가 있습니다.

컴퓨터에서이 기능을 사용할 수있는 전역 시스템 설정에 대해 읽었지만 다른 앱에 영향을 미치고 다른 악영향을 미치지 않으려 고합니다. 단지 내 앱에만 적용하기를 원합니다.

마지막으로 다른 구성 파일과 실행기로 EXE 파일을 두 개 배포하여 실행할 올바른 버전을 선택할 수 있지만 극단적 인 것으로 보입니다.

의견을 보내 주셔서 감사합니다.

+0

지정된 세대 중 하나를 통해 GC를 실행합니다. "백그라운드 서버 GC를 이용하기 위해 아무것도 변경할 필요가 없습니다. 대부분의 GC 기능과 마찬가지로, 모든 애플리케이션에서 자동으로 켜집니다."......하지만 아직 완전히 읽지는 않습니다. https://blogs.msdn.microsoft.com/dotnet/2012/07/20/the-net-framework-4-5-includes-new-garbage-collector-enhancements-for-client-and-server-apps/ – Naidu

+0

링크를 제공해 주셔서 감사합니다.하지만 블로그 게시물이 올바르지 않은 것으로 보입니다. GCSettings.IsServerGC는 app.config에 지정되어 있지 않으면 false를 반환합니다. – embee

답변

1

다음은 대체 제안 사항입니다. 이전처럼 서버 GC를 사용 가능하게 유지하십시오. 그런 다음 사용자 정의 설정에 따라 앱 메모리가 위험 수준으로 결정되는 특정 임계 값을 초과하면 강제 GC가 실행됩니다.

이 경로를 따르는 경우 가비지 수집이 CLR에서 실행되어야하는 시점에 대해 더 잘 알고 있다고 효과적으로 알 수 있습니다. 대부분의 경우 CLR이 우리가 간섭 할 때보 다 CLR이 더 나은 일을한다는 것을 알게되었습니다.

코드는 메모리 사용량을 확인하고 모든 세대 또는 내가이 블로그에 n 개의 흥미로운 문을 보았다

if (Math.Abs(DateTime.Now.Subtract(MemUsageLastCheckTime).TotalMinutes) > 5d) 
{ 
    long UsedMemory; 
    //UsedMemory = GC.GetTotalMemory(false); // Not as reliable 
    UsedMemory = System.Diagnostics.Process.GetCurrentProcess().PagedMemorySize64; 
    if (UsedMemory > 1073741824) // One GB in bytes 1 X 1024 X 1024 X 1024 
    { 
     GC.Collect(); // Collect all generations 
     //GC.Collect(2,GCCollectionMode.Forced);; Or collect a specific generation and force it to run now 
    } 
    MemUsageLastCheckTime = DateTime.Now; 
} 
+0

동의합니다. CLR에 콜렉션을 남기고 싶습니다. 어쨌든 고마워. – embee