.NET 쓰레기 수집 : 디버그 대 릴리스 모드 불일치
기본 메커니즘
<code class="language-csharp">public class Class1 { public static int c; ~Class1() { c++; } } public class Class2 { public static void Main() { { var c1 = new Class1(); //c1 = null; // Uncommenting this results in "1" at the Console.WriteLine call. } GC.Collect(); GC.WaitForPendingFinalizers(); Console.WriteLine(Class1.c); // Outputs "0" Console.Read(); } }</code>
불일치는 JIT 컴파일러의 최적화에서 발생합니다. 릴리스 모드에서 컴파일러는 성능을위한 코드를 최적화하여 종종 가변 사용을 추적하기위한 테이블을 만듭니다. 이것은 효율적인 쓰레기 수집을 허용합니다.
그러나 디버그 모드에서는 이러한 최적화가 비활성화되어 디버깅을 용이하게합니다. 런타임은 엄격하게 필요한 것보다 더 긴 로컬 변수에 대한 참조를 유지하며, 방법이 끝날 때까지 수명을 효과적으로 확장합니다.
이 예에서 디버거는 Class1.c
전체에 대한 참조를 유지하여 즉각적인 마무리를 방지합니다. 따라서 출력은 "0,"가 아니라 "0"입니다
생산 시사점 및 모범 사례 c1
:
이 방법을 사용하여 필요한 경우 특정 물체의 쓰레기 수집을 명시 적으로 방지하십시오 (예 : 관리되지 않는 코드와 연결).관리되지 않는 코드 인터 로프 :
관리되지 않는 리소스로 작업 할 때는 관리되지 않는 코드가이를 사용하여 마무리 할 때까지 객체에 액세스 할 수 있도록합니다.
com 객체 처리 : 피하 . 대신, COM 객체 청소를 위해 쓰레기 수집기에 의존하십시오.
c1
위 내용은 .NET의 디버그 모드 대 릴리스 모드에서 쓰레기 수집이 다르게 행동합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!