2011-09-18 4 views
0

힙 메모리 블록이 해제되지 않고 프로그램이 종료되는 메모리 누출 프로그램을 생각해 봅시다. 이것이 Java 프로그램 인 경우, 내장 된 가비지 콜렉터는 프로그램이 종료되기 전에 자동으로이 힙 블록의 할당을 해제합니다.메모리 누수 - 가비지 컬렉터가 없음

그러나 C++에서도 프로그램이 종료되면 커널이 프로세스와 관련된 모든 공간을 자동으로 할당 해제하지 않습니다. 또한 Java 코드에서 커널은 프로세스의 텍스트 부분 (코드)에 대한 공간을 할당 해제해야합니다 (스택 및 힙 부분이 가비지 수집기에 의해 할당 해제 된 경우에도). 가비지 컬렉터 기능을 사용하면 전반적으로 이점이 있습니다. 커널이 아닌 프로그램 자체에서 힙을 할당 해제하는 데 필요한 시간을 절약 할 수 있습니다. (저축이있는 경우)

EDIT : 응답을 조사한 첫 번째 의심은 GC가 메모리 사용량이 한도에 도달하면 자동으로 실행됩니까? 프로그램이 종료되기 직전에 GC를 호출하면 긴 프로그램에 유용하지 않을 수 있습니다.

+0

프로그램을 아주 오랫동안 실행하려면 어떻게해야합니까? 이 경우 프로그램은 사용 가능한 모든 메모리를 할당 할 수 있으며 물론 실패합니다. 따라서 운영 체제가 종료 될 때 메모리를 확보하더라도 프로그램은 할당 된 메모리를 담당해야합니다. – Isaac

+0

그럴 것입니다. 프로그램에서 언제든지 Java GC를 호출 할 수 있습니까? 메모리 사용량이 한도에 도달하면 자동으로 트리거 될 수 있습니까? 프로그램이 종료 될 때만 GC를 호출하면 장시간 실행되는 프로그램에 도움이되지 않습니다. – Hari

답변

1
  1. 그 다음에 커널을 정리한다고 가정합니다. 모든 OS가 동적으로 할당 된 메모리를 자동으로 처리하는 것은 아닙니다. (그러나 공정성을 위해 : 적어도 데스크탑에서는 가장 현대적인 것이 가장 좋습니다.)
  2. 모든 메모리를 회수하는 OS조차도 프로세스가 종료되면 이됩니다. 대부분의 프로그램은 특정 시점에서 필요로하는 것보다 훨씬 더 많은 메모리를 전체 런타임에 할당합니다 (충분히 길게 실행하면 많은 데이터 처리 응용 프로그램에서 "긴"은 몇 초가 될 수 있음).
  3. 그 때문에, 많은 - 특히 장기 실행 - 프로세스는 더 이상 쓰레기를 만들지 않을 것입니다 (더 이상 사용되지 않으며 다시 사용되지 않을 메모리) 끝내지 않고. 메모리 사용량을 줄이기 위해 전체 프로세스를 중지하고 다시 시작하기를 원하지 않습니까?
  4. 사용되지 않는 메모리가 거의 사용되지 않으므로 (무기한으로 실행되는 프로세스가 상당수 있고 몇 시간 동안 실행될 수있는 프로세스가 있음) 폐기 된 것이므로 잠시 후 심각한 메모리 부족이 발생합니다. 브라우저는이 세션 중에 열어 둔 모든 이미지, HTML 문서, JS 객체 등을 몇 분마다 다시 시작하지 않으므로 메모리에 유지합니다. 그건 브라우저에서 심각한 문제가되는 말인가? 정확히 요. 프로세스가 종료 될 때 그들은 그것을 가치가 있다고 생각하면 수시로 실행되지만, 모든 남아 -
  5. 은 또한, (즉, 말을 모든 좋은 것들입니다) 대부분의 GC를 하지 할당을 취소 모든 것을 할 (사용자 지정 할당 자 또는 OS가 될 수 있음) 낮은 수준으로 남겨 둡니다. 이것은 파이널 라이저가 실행되는 것을 보장하지 않는 이유이기도합니다. 많은 할당을하지 않는 단기 실행 프로그램에서 GC는 실행되지 않을 수 있습니다.

그렇다면 GC는 시간을 절약하는 것이 아닙니다. 이는 많은 메모리를 절약하고 장기간에 걸친 할당 집중 프로그램이 사용 가능한 모든 메모리를 낭비하지 않도록하여 모든 사람이 메모리 부족 오류로 사망하게하는 것입니다.

0

프로그램이 일부 리소스를 할당하고 실행될 때마다 사용하지만 종료 전에 제대로 해제하지 않는 경우를 가정 해 보겠습니다. 이 프로그램이 종료되면 커널은 모든 프로그램 자원을 할당 해제합니다.

이제 모든 함수에서 메모리 누수가 발생하는 상황을 고려해보십시오.이 함수는 1 초에 100 번 호출됩니다. 사용 가능한 메모리가 없기 때문에 몇 분 또는 몇 시간 후에이 프로그램이 충돌합니다.

나쁜 점은 유형 1의 메모리 및 리소스 유출을 만드는 프로그래머는 대개 유형 2의 누수를 만들어 더럽고 불안정한 코드를 생성한다는 것입니다. 전문 프로그래머는 0 리소스 및 메모리 누수로 완벽한 코드를 작성합니다. 가비지 컬렉터를 사용할 수 있다면 괜찮습니다. 그렇지 않은 경우 - 직접 자원을 관리하십시오.

현재 잘 알려진 .NET 이벤트 소스 - 소비자 유출과 같이 가비지 수집기로 누출을 만들 수도 있습니다. 따라서 가비지 컬렉터는 매우 유용하며 많은 개발자 시간을 절약 할 수 있습니다.하지만 개발자는 프로그램 리소스를 신중하게 관리해야합니다.