짧은 시간 동안 .NET 가비지 수집 방지
매우 많은 양의 데이터를 처리하는 고성능 애플리케이션이 있습니다. 매우 짧은 기간 동안 엄청난 양의 정보를 수신, 분석 및 폐기합니다. 이로 인해 현재 최적화하려는 상당한 양의 개체 변동이 발생하지만 2 차 문제도 발생합니다. 가비지 컬렉션이 시작되면 정리할 때 약간의 긴 지연이 발생할 수 있습니다 (오래되면 10 초에서 100 밀리 초를 의미합니다). 99 %의 시간이 허용되지만 1 ~ 2 분 정도의 짧은 시간 동안 가비지 컬렉션이 지연을 일으키지 않는지 확인해야합니다. 이 기간이 언제 발생할지 미리 알고 있으며이 기간 동안 가비지 수집이 발생하지 않도록하는 방법이 필요합니다. 응용 프로그램은 .NET 4를 사용하여 C #으로 작성되었습니다.
내 질문은 다음과 같습니다.
- 전체 프로그램에 대해 가비지 수집을 잠시 일시 중지 할 수 있습니까?
- System.GC.Collect ()를 사용하여 가비지 수집이 필요없는 창 전에 가비지 수집을 강제 할 수 있습니까? 그리고 이렇게하면 얼마나 오래 가비지 수집이 해제됩니까?
- 사람들이 전체적으로 가비지 컬렉션의 필요성을 최소화하기 위해 어떤 조언을합니까?
참고-이 시스템은 다양한 구성 요소로 인해 상당히 복잡합니다. 프로그램의 모든 클래스에서 사용자 지정 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
'program story' 카테고리의 다른 글
PHP 또는 JavaScript를 사용하지 않고 내용에 맞게 텍스트 영역을 확장하는 방법이 있습니까? (0) | 2020.12.03 |
---|---|
함수의 자바 스크립트 선택적 인수 (0) | 2020.12.03 |
쉼표로 구분 된 열 데이터를 추가 열로 분할 (0) | 2020.12.03 |
Java에서 숫자를 거듭 제곱하기 (0) | 2020.12.03 |
fgetcsv가 mac 형식의 csv 파일로 끝나는 줄을 읽지 못합니다. 더 나은 솔루션이 있습니까? (0) | 2020.12.02 |