2009-11-04 7 views
0

그래서 최근에 특정 프로젝트의 개발이 완료된 후 개발 서버에 4GB RAM이 300MB 이상 남아있는 것으로 나타났습니다. 이것이 개발 단계에서의 메모리 누수로 인한 것이라면, 메모리는 결국 자체적으로 해제되거나 서버를 다시 시작해야 할 것입니다. 미래에 이러한 문제를 방지하는 데 사용할 수있는 도구가 있습니까 (명백한 '메모리 누수를 유발하는 코드를 작성하지 말고')? 때때로 그들은 잠시 동안 보이지 않게되고, 시간이 지남에 따라 앱 테스트를 계속하면서 더할 수 있습니다.개발 중 메모리 누수가 발생했습니다.

+0

여기 cron 작업을 다시 시작해야합니까? 일부 PHP는 이런 종류의 기술을 사용합니다. – jldupont

+0

어떤 프로그래밍 환경입니까? 자바? .그물? – florin

+0

@florin : "C"태그는 C를 제안합니다.) – Will

답변

0

아무 것도 가정하지 말고 메모리 프로파일 러를 실행하고 그 일을 확인하십시오.

+0

.Net 프로파일 러가 C 응용 프로그램을 어떻게 도와 줄지 모르겠군요 ... –

+0

오, 예, 태그, 놓친 것, 사과드립니다. – Fred

2

실행중인 운영 체제는 무엇입니까? 요즘 대부분의 운영 체제는 프로세스가 종료 될 때 프로세스의 누수 된 메모리를 정리합니다. 사용중인 메모리가 실제로 파일 시스템 캐시에 사용 중일 수 있습니다. 걱정할 필요가 없습니다. OS가 필요한 경우이 메모리를 회수합니다. 가입일

: http://learnlinux.tsf.org.za/courses/build/internals/ch05.html

자유 명령에 의해 지시 가능한 메모리 량은 계산에서 버퍼 캐시의 현재 크기 를 포함한다. 이것은 캐시가 곧 사용자 메모리의 대부분을 채우기 때문에 으로 표시된 사용 가능한 메모리의 양이 매우 낮을 때 종종 잘못된 것입니다. '놀라지 마십시오. 응용 프로그램은 이며 아마도 RAM을 크롤링하지 않습니다. 그것은 입니다. 사용 가능한 모든 공간을 까지 가져가는 버퍼 캐시 일뿐입니다. (필요에 따라이 축소됩니다 것을 기억) 응용 프로그램 사용을위한 사용할 수있는 메모리 공간으로 버퍼 캐시의 수는, 그래서 응용 프로그램 사용

무료로 사용 가능한 메모리 의 실제 양을 확인하기 위해 버퍼 캐시 의 크기를 뺍니다
1

Linux x86 상자의 경우 예외적 인 valgrind을 사용하여 프로그램을 실행하십시오.

상업용 동등 물인 Purify은 Windows에서 사용할 수 있습니다.

프로그램의 이러한 런타임 분석은 메모리 누수 및 버퍼 오버플로 및 단위화된 변수와 같은 기타 오류를보고합니다.

정적 코드 분석 - 예를 들어 LintCoverity - 메모리 누수와 더 심각한 오류를 발견 할 수 있습니다.

를 사용하여 프로그램의 작동 중에 메모리 '누출'경우는 위험 응용 프로그램 것이다 결국 배기 RAM 및 스왑이 :


메모리 누수가 원인이 그들이 프로그램을 해칠 방법에 대해 구체적으로 수 있습니다 또는 프로그램에서 사용할 수있는 주소 공간 (실제 RAM보다 작을 수 있음)을 지정하고 다음 할당이 실패하도록합니다. 오류 검사가 보이는 것보다 어렵 기 때문에 대다수의 프로그램은이 오류를 포착하지 못합니다. 대부분의 프로그램은 널 포인터를 참조 해제하거나 종료합니다.

1

누출을 초래하는 수정 버전을 확인하는 것이 더 쉽기 때문에 개발 중이 싸우는 것이 가장 좋습니다 (). 지금 보시다시피, 사실을 한 후에 그것을하는 것은 매우 어렵습니다.

http://valgrind.org/

http://www.ibm.com/software/awdtools/purify/

http://directory.fsf.org/project/ElectricFence/

내가 누출에 대한이 도구, 억제 대부분의 경고를 실행할 수 좋을 것, 그리고 : 도구를 실행할 때 보고서의 많은 기대 나는 아래 추천 그런 다음 하나씩 차례대로 고쳐서 억압을 제거하십시오.

그런 다음 정기적으로 이러한 도구를 실행하고 모든 회귀 변수를 수정해야합니다.

1

당연한 대답은 "메모리 누수를 일으키는 코드를 작성하지 마십시오"이며 유효한 카운트 문제가있는 경우 수정하기가 어려울 수 있거나 유효한 코드입니다. 메모리의 수명을 추적합니다.

현재 상황을 해결하려면 Windows 용 DevPartner 또는 Linux/Unix 용 Valgrind와 같은 도구 사용을 고려해보십시오.이 도구는 메모리 누수를 추적하는 데 매우 효과적입니다 (다른 문제 성능 병목 현상과 같은).

포인터의 사용법을 살펴보고 포인터를 천천히 스마트 포인터로 교체하면 가능한 포인터 수명을 관리하는 데 도움이됩니다.

그리고 아니오, 코드가 실행되는 프로세스를 다시 시작하지 않고도 메모리가 복구 될 것입니다.

+0

"스마트 포인터"에 관한이 사업을 제외한 모든 것에 동의합니다. 이러한 것들은 C 프로그래밍 언어에는 존재하지 않습니다. – BobbyShaftoe

+0

아, 아주 좋은 지적 바비 .... 너무 오래 살고 C + + 토지! – NeilDurant

0

Linux의 경우 '무료'출력을 확인하고 '캐시 된'RAM 양을 확인하십시오. 개발 작업에 많은 디스크 I/O가 포함되어 있다면, 파일 캐싱에이 디스크를 사용할 것이고, '사용 가능'은 거의 볼 수 없지만 필요하다면 여전히 남아 있습니다. 모든 실제적인 목적을 위해 사용 가능한 것으로 free + cached를 고려하십시오.

'무료'출력은 이론적으로

은/proc/meminfo 파일에서 증류, 당신은/proc 디렉토리/$ PID를 /에서 실행중인 프로세스에 대한 자세한 정보를 얻을 수 있습니다 {지도를, 현재 smaps} 할 때 프로세스가 종료 그것이 가진 모든 메모리가 해제됩니다. 프로세스가 종료 되었습니까?

0

저는 대학 때 볼랜드 C++ 빌더 6 IDE 을 사용했습니다. CodeGuard는 메모리 누수 및 기타 메모리 관련 문제를 확인합니다. 이 옵션을 최신 버전에서 계속 사용할 수 있는지 확실하지 않지만 새 버전의 기능이 적 으면 이상 할 것입니다.

위에서 언급 한 바와 같이 valgrind는 좋은 메모리 누수 디버거입니다.

관련 문제