.NET 쓰레기 수집 및 디버깅 : 디버그 모드에서 변수가 지속되는 이유
. .NET의 효율적인 메모리 관리는 쓰레기 수집에 크게 의존합니다. 그러나 디버깅은 객체가 완성 될 때와 관련하여 예기치 않은 동작을 소개 할 수 있습니다. 이것은 다음 c# 코드에 설명되어 있습니다<:> Puzzle : 범위가 나지 않고 참조되지 않더라도 가 완료되지 않는 이유는 무엇입니까? 디버거의 영향
디버그 모드에서 JIT 컴파일러 가이 테이블을 변경합니다. 동봉 된 방법이 완료 될 때까지 로컬 변수를 살리게합니다. 이를 통해 논리적으로 더 이상 필요하지 않더라도 변수는 디버깅에 액세스 할 수 있습니다. 따라서
<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 doesn't change the output in debug mode. } GC.Collect(); GC.WaitForPendingFinalizers(); Console.WriteLine(Class1.c); // Prints 0 in debug mode, likely 1 in release mode. Console.Read(); } }</code>릴리스 모드 동작
예상되는 쓰레기 수집 동작을 관찰하려면 릴리스 모드에서 코드를 실행하십시오 (JIT 최적화가 활성화 됨). c1
x increment가 1으로 증가 할 수 있으며,
가 가 마무리되었음을 보여줍니다. 명시 적으로 로 설정하면 릴리스 모드 에서이 결과가 변경되지 않습니다. 결론 : 디버그 대 릴리스
디버그 모드와 릴리스 모드의 불일치는 중요한 차이를 강조합니다. 디버깅 도구는 쓰레기 수집가의 행동을 수정합니다. 개발자는 디버깅 중 메모리 관리를 분석 할 때이를 알고 있어야합니다. 정확한 쓰레기 수집을 보장하고 생산에서 예상치 못한 동작을 피하기 위해 항상 메모리 관련 코드를 릴리스 모드에서 검증하십시오.
위 내용은 가비지 컬렉션이 .NET 디버그 모드에서 변수를 마무리하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!