program story

짧은 시간 동안 .NET 가비지 수집 방지

inputbox 2020. 12. 3. 07:49
반응형

짧은 시간 동안 .NET 가비지 수집 방지


매우 많은 양의 데이터를 처리하는 고성능 애플리케이션이 있습니다. 매우 짧은 기간 동안 엄청난 양의 정보를 수신, 분석 및 폐기합니다. 이로 인해 현재 최적화하려는 상당한 양의 개체 변동이 발생하지만 2 차 문제도 발생합니다. 가비지 컬렉션이 시작되면 정리할 때 약간의 긴 지연이 발생할 수 있습니다 (오래되면 10 초에서 100 밀리 초를 의미합니다). 99 %의 시간이 허용되지만 1 ~ 2 분 정도의 짧은 시간 동안 가비지 컬렉션이 지연을 일으키지 않는지 확인해야합니다. 이 기간이 언제 발생할지 미리 알고 있으며이 기간 동안 가비지 수집이 발생하지 않도록하는 방법이 필요합니다. 응용 프로그램은 .NET 4를 사용하여 C #으로 작성되었습니다.

내 질문은 다음과 같습니다.

  1. 전체 프로그램에 대해 가비지 수집을 잠시 일시 중지 할 수 있습니까?
  2. System.GC.Collect ()를 사용하여 가비지 수집이 필요없는 창 전에 가비지 수집을 강제 할 수 있습니까? 그리고 이렇게하면 얼마나 오래 가비지 수집이 해제됩니까?
  3. 사람들이 전체적으로 가비지 컬렉션의 필요성을 최소화하기 위해 어떤 조언을합니까?

참고-이 시스템은 다양한 구성 요소로 인해 상당히 복잡합니다. 프로그램의 모든 클래스에서 사용자 지정 IDisposable 인터페이스를 구현해야하는 접근 방식을 피하고 싶습니다.


.NET 4.6은 두 가지 새로운 방법을 추가 : GC.TryStartNoGCRegion그리고 GC.EndNoGCRegion그냥이합니다.


GCLatencyMode oldMode = GCSettings.LatencyMode;

// Make sure we can always go to the catch block, 
// so we can set the latency mode back to `oldMode`
RuntimeHelpers.PrepareConstrainedRegions();

try
{
    GCSettings.LatencyMode = GCLatencyMode.LowLatency;

    // Generation 2 garbage collection is now
    // deferred, except in extremely low-memory situations
}
finally
{
    // ALWAYS set the latency mode back
    GCSettings.LatencyMode = oldMode;
}

그러면 가능한 한 많이 GC를 비활성화 할 수 있습니다. 다음이 될 때까지 대규모 개체 컬렉션을 수행하지 않습니다.

  • 당신은 전화 GC.Collect()
  • 당신은 GCSettings.LatencyMode다른 것을 설정 했습니다LowLatency
  • OS는 CLR에 메모리 부족 신호를 보냅니다.

이 작업을 수행 할 때주의하십시오 try. 해당 블록에 있는 동안 메모리 사용량이 매우 빠르게 증가 할 수 있기 때문 입니다. GC가 수집하는 경우에는 이유가 있으며 시스템에 많은 양의 메모리가있는 경우에만이를 심각하게 고려해야합니다.

질문 3과 관련하여 파일 시스템 I / O 또는 네트워크를 통해 정보를 수신하는 경우 바이트 배열과 같은 객체를 재사용 할 수 있습니까? 해당 정보를 사용자 정의 클래스로 구문 분석하는 경우 해당 정보도 재사용 해보십시오.하지만 정확히 무엇을하는지에 대해 더 많이 알지 않고서는 너무 많은 좋은 조언을 드릴 수 없습니다.

다음은 도움이 될 수있는 몇 가지 MSDN 문서입니다.

참고 : 인 GCSettings.LatencyMode = GCLatencyMode.LowLatency 경우에만 설정할 수 GCSettings.IsServerGC == false있습니다. IsServerGC다음에서 변경할 수 있습니다 App.config.

  <runtime>
    <gcServer enabled="false" />
  </runtime>

참고 URL : https://stackoverflow.com/questions/6005865/prevent-net-garbage-collection-for-short-period-of-time

반응형