디버깅 및 .NET 쓰레기 수집기 : 예상치 못한 조기 마무리
객체는 그 범위를 떠난 후에 마무리되어야합니다. 그러나 디버깅 중에는 때때로 1 인쇄 1을 인쇄하여
.
디버거의 영향public class Class1 { public static int c; ~Class1() { c++; } } public class Class2 { public static void Main() { { var c1 = new Class1(); } GC.Collect(); GC.WaitForPendingFinalizers(); Console.WriteLine(Class1.c); // Might print 0 or 1 } }
Class1.c
릴리스 모드 (디버거 없음) : JIT는 최적화되어 c1
의 수명 및 마무리 타이밍을 정확하게 결정합니다.
디버그 모드 (디버거 포함) : JIT의 최적화가 억제됩니다. 디버거의 존재는 인위적으로 의 수명을 연장하여 최종화기가 예상보다 일찍 실행될 수 있습니다.
문제 해결 GC.Collect()
이를 바로 잡으려면 릴리스 모드에서 코드를 실행하십시오. 또는 JIT 최적화를 허용하기 위해 디버거 설정을 조정하십시오. 이것은 정확한 GC 동작을 보장합니다.
추가 점
설정 는 JIT 최적화로 인해 릴리스 모드에서 효과가 없습니다.
객체 수명을 명시 적으로 제어 할 수 있습니다 디버깅에 의해 유도 된 조기 마무리는 외부 참조 또는 인터 로프와 관련된 시나리오를 복잡하게 할 수 있습니다.위 내용은 내 .NET 쓰레기 수집기가 디버깅 중에 일찍 물체를 마무리하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!