2012-07-23 4 views
8

.Net CLR GC에 대한 소개 프레젠테이션을하고 있으며 모든 다양한 부분을 가지고 있지만 수집을 강제로 시도하는 방법이 위험하거나 해를 끼칠 수 있다는 구체적인 예를 원했습니다. 조만간 더 높은 세대로 일을 강요 할 수는 있지만 (내가 말할 수있는 것에서는) 실제로 일을 늦추기 만하면됩니다.강제 GC의 예가 잘못 되었나요?

저는 GC를 강요하는 것이 실제로 위험 할 수있는 상황을 생각하려고합니다. 그리고 나는 덜 효율적인 솔루션으로 계속해서 떠오르고 있습니다.

+2

유일한 단점은 시간 손실입니다. – Dialecticus

+0

"강제 수집"으로 GC.Collect()를 호출하면됩니다. 왜 그렇게 위험하다고 생각하니? 제가 그리워 한 문서가 있습니까? (나는 요즘을 유지할 수 없기 때문에 가능성이 높다는 것을 알고 있습니다.) – David

+0

실시간 요구 사항이있는 긴밀한 타이머가있을 수 있습니까? – leppie

답변

4

다음은 흥미로운 데모입니다. 릴리스 모드로 컴파일 된이 데모를 실행해야합니다. 그렇지 않으면 보급 된대로 작동하지 않을 수 있습니다.

버전 1 :

private void Button_Click(object sender, EventArgs e) 
{ 
    Timer timer = new Timer(Print, null, 0, 1000); 
} 

private void Print(Object o) 
{ 
    if (textBox1.InvokeRequired) 
    { 
     Action<object> action = Print; 
     textBox1.Invoke(action, o); 
     return; 
    } 

    textBox1.Text = DateTime.Now.ToString(); 
} 

버전 1 행복하게 한 번 텍스트 상자 두 번째로 날짜와 시간을 인쇄합니다.

버전 2 : 선언 후, 타이머 객체 참조가 존재하지 않게, 때문에 지금

private void Button_Click(object sender, EventArgs e) 
{ 
    Timer timer = new Timer(Print, null, 0, 1000); 
} 

private void Print(Object o) 
{ 
    if (textBox1.InvokeRequired) 
    { 
     Action<object> action = Print; 
     textBox1.Invoke(action, o); 
     return; 
    } 

    textBox1.Text = DateTime.Now.ToString(); 

    GC.Collect(); // force a garbage collection 
} 

버전 2는 날짜와 시간은 한 번만 인쇄됩니다, 그래서 타이머 객체 가져 모은.

상당히 고안된 예이지만 좋은 데모가 될 수 있습니다.

제프리 리히터 (Jeffery Richter)에게이 책을 기증해야합니다. 훌륭한 책 CLR via C#에 있습니다.

+0

'new timer (...')를 호출하고 반환 값을 저장하지 않은 경우이 동작이 더 예기치 않게 발생한다고 생각합니다. –

+2

하지만이 경우'GC.Collect()'는 나쁘지 않습니다. 실제로 응용 프로그램에서 버그를 발견하는 데 도움이되기 때문에 실제로 좋습니다. 'GC.Collect()'가 없다면, 장래에 언젠가는 작업을 멈추게된다. – svick

+0

@svick - 좋은 지적. 아마도 범위 지정에 대한 더 나은 교훈 일 수 있습니다. 어쨌든 그것은 흥미 롭습니다. 그리고 그것은 GC에 대해 생각하게 만듭니다. – James

1

다음과 같은 나쁜 생각은 어떨까요? "확실히 고아가 될 요청 상태를 정리하기 위해 ASP.NET에서 모든 HTTP 요청 후에 GC를 강제 실행합시다!"

동시 HTTP 요청이 서로 방해하기 때문에 좋지 않습니다. 그러면 지연 시간이 많아이 발생하고 성능이 저하됩니다. 모든 것은 무고한 "최적화"에서 시작됩니다.

내가 생각할 수있는 최악의 경우입니다.