가비지 수집기를 강제로 실행하는 방법?


147

면접관이 오늘 이것에 대해 물었습니다 ... 대답이 있습니까?


3
:이 질문은 당신이 생각하지 말아야 할 이유에 대한 좋은 정보가 stackoverflow.com/questions/118633/...
한스 올슨

1
왜 이렇게 말하고 있습니까
Andrew Collins

1
@Jason-면접관이 해결책을 듣기를 원치 않았으며 Andrew의 지식과 그에 대한 추론을 얻지 못하면이 질문이 효과적으로 이해 될 수 있습니다.
martinstoeckli

2
@martinstoeckli 그것은 여전히 ​​끔찍한 질문입니다. 스트레스가 많은 인터뷰에서 지식을 가진 사람은 그것이 어려운 질문임을 깨닫지 못하거나 추가 정보를 제공한다고 생각하지 않습니다. 그런 다음 질문은 면접관이 지식을 가진 사람과 그렇지 않은 사람을 구별하는 데 도움이되지 않습니다. 따라서 질문은 여전히 ​​끔찍합니다.
제임스

2
"가비지 수집을 언제 강제로 수행합니까?" 나에게 좋은 인터뷰 질문처럼 들린다 ( "How": not much). 초보자 : 나는 몰라. 중급 : 절대 전문가 : 메모리 누수 테스트를 작성할 때.
mikebridge

답변:


188

System.GC.Collect()가비지 수집기를 강제로 실행합니다. 권장하지는 않지만 상황이 발생하면 사용할 수 있습니다.


17
권장하지 않는 이유는 무엇입니까?
Luke T O'Brien

5
GC.Collect ()는 실행 비용이 많이 듭니다. 필요 이상으로하는 것은 바람직하지 않습니다. 언제 호출해야하는지에 대한 코드가 잘 작성되었습니다. 특수한 경우에만 일반적으로 자체 수집해야합니다. stackoverflow.com/a/21961777/2710988
Brandon Barkley 2014 년

186

gc를 명시 적으로 호출하는 것은 좋지 않지만 전화를 거는 경우

GC.Collect();
GC.WaitForPendingFinalizers();

코드 전체에서 GC를 명시 적으로 호출하므로 GC.WaitForPendingFinalizers();after 을 호출하는 것을 잊지 마십시오 GC.Collect().


14
WaitForPendingFinalizers반드시 "더 나은 성능"을 제공 할 필요는 없습니다. 최종 큐에있는 모든 객체가 완료 될 때까지 (이전에 호출했을 때 있었던 객체) 단순히 차단합니다 Collect. 당신이 원하는 경우에 사람들을위한 기회는 수집 당신이 필요로하는 개체를 다른 에 전화를 Collect 한 후 호출 WaitForPendingFinalizers.
LukeH

2
gc.Collect를 호출해야하는 몇 가지 좋은 이유 중 하나는 올바르게 폐기되지 않은 자원을 확보하기위한 최후의 노력이므로 WaitForPendingFinalizers는 필요한 단계로 보입니다. 그러나 gc 호출을 피하는 가장 좋은 방법은 확실하지 않습니다. BTW, gc.Collect가 세대를 장려하는 '기술적 이유'가 있는지 궁금합니다. 발전을 정당화하기 위해 충분한 물건이 할당되지 않은 한 세대를 유지하는 것이 더 유용 할 것입니다.
supercat

2
C #의 초보자를위한 참고 사항 (나와 같은) : GC 강제 호출은 보장하지 않으며 일부 사용되지 않는 구체적인 객체는 메모리에서 제거됩니다. (이 작업을 수행하는 한 가지 방법은 "구문 사용"( msdn.microsoft.com/ru-ru/library/yh598w02(v=vs.80).aspx )을 사용하는 것)
user1234567

왜 전화 WaitForPendingFinalizers해야합니까?
Christian

19
GC.Collect() 

에서 MDSN ,

액세스 할 수없는 모든 메모리를 회수하려면이 방법을 사용하십시오.

메모리에 저장된 시간에 관계없이 모든 객체는 수집 대상으로 간주됩니다. 그러나 관리 코드에서 참조되는 오브젝트는 수집되지 않습니다. 시스템이 사용 가능한 최대 메모리 양을 되찾기 위해이 방법을 사용하십시오.



12

GC.Collect();

가비지 콜렉터가 항상 예상 한 것을 정리하지는 않을 수도 있습니다.


5
그게 무슨 뜻 이니? 예기치 않게 무엇을 청소할 수 있습니까?
Voldemort

5
@ Voldemort-예기치 않게 아무것도 청소하지 않습니다. 그러나 예상 한 모든 것을 정리하지 못할 수 있습니다.
저스틴 니스 너

6

가비지 수집기를 강제로 실행하고 싶지 않습니다.

그러나, 당신이 (순수하게 학문적 인 운동으로) 해본 적이 있다면 :

GC.Collect()

4
@Karthik의 답변을 선호합니다. 앱이 합법적으로 GC.Collect ()를 호출 해야하는 상황이있을 수 있습니다. 아주 드물다.
Henk Holterman

2
약한 참조 배열이 있고 '실시간'참조가 있는지 확인하려고한다고 가정 해보십시오. 확인하기 전에 GC.Collect ()를 호출하는 것이 좋습니다. 그냥 말하면
Rich Ehmer

1
개시 진술이 사실 틀 렸기 때문에 공감 됨. 예, 가비지 수집기를 강제로 실행하고 싶습니다.
Syndog

5

.Net Framework는이 경우를 대비하여 자동으로 수행한다고 생각합니다. 먼저 지우려는 것을 선택하고 가비지 콜렉터를 호출하십시오.

randomClass object1 = new randomClass
...
...
// Give a null value to the code you want to delete
object1 = null;
// Then call the garbage collector to erase what you gave the null value
GC.Collect();

그게 다인 것 같아요. 누군가 도와주세요.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.