메모리 누수가 얼마나 멀리 갈 수 있습니까?
메모리 누수가 여러 번 발생했습니다. 보통은 malloc
내일이없는 것처럼 지내거나 FILE *
더러운 빨래처럼 매달려 있습니다. 나는 일반적으로 프로그램이 종료 될 때 모든 메모리가 정리된다고 가정합니다 (읽기 : 절망적으로 희망). 프로그램이 종료되거나 충돌 할 때 누수 된 메모리가 수집되지 않는 상황이 있습니까?
대답이 언어마다 다르면 C (++)에 중점을 두십시오.
'내일이없는 것처럼', '더러운 세탁물처럼 매달린 ...'이라는 문구의 쌍곡선 사용법에 유의하십시오. 안전하지 않은 * malloc
* ing은 당신이 사랑하는 사람들을 해칠 수 있습니다. 또한 더러운 세탁물에주의하십시오.
아니요. 운영 체제는 프로세스가 종료 될 때 보유한 모든 리소스를 해제합니다.
메모리, 열린 파일, 네트워크 연결, 창 핸들 등 운영 체제가 유지 관리하는 모든 리소스에 적용됩니다.
즉, 프로그램이 운영 체제가 없거나 임베디드 시스템에서 매우 단순하거나 버그가 많은 운영 체제를 사용하는 경우 재부팅 할 때까지 메모리를 사용하지 못할 수 있습니다. 그러나 그 상황에 처했다면 아마도이 질문을하지 않을 것입니다.
운영 체제에서 특정 자원을 확보하는 데 시간이 오래 걸릴 수 있습니다. 예를 들어 네트워크 서버가 연결을 수락하는 데 사용하는 TCP 포트는 프로그램에 의해 올바르게 닫혀 있어도 몇 분이 걸릴 수 있습니다. 네트워크 프로그램은 데이터베이스 객체와 같은 원격 리소스를 보유 할 수도 있습니다. 네트워크 연결이 끊어지면 원격 시스템에서 해당 리소스를 해제해야하지만 로컬 운영 체제보다 시간이 오래 걸릴 수 있습니다.
C 표준은 malloc
프로그램이 종료 될 때 할당 된 메모리 가 해제 되도록 지정하지 않습니다 . 이것은 운영 체제에 의해 수행되며 프로그램이 종료 될 때 모든 OS (일반적으로 임베디드 세계에 있음)가 메모리를 해제하지는 않습니다.
모든 대답이 현대 OS의 질문에 대한 대부분의 측면을 다루었으므로 역사적으로 DOS 세계에서 프로그래밍 한 적이 있다면 언급 할 가치가 있습니다. TSR ( Terminant and Stay Resident ) 프로그램은 일반적으로 시스템에 제어권을 반환하지만 소프트웨어 / 하드웨어 인터럽트에 의해 복구 될 수있는 메모리에 상주합니다. 이러한 OS에서 작업 할 때 "메모리 부족! 일부 TSR을 언로드 해보십시오" 와 같은 메시지가 표시되는 것은 정상 입니다.
따라서 기술적으로 프로그램은 종료 되지만 여전히 메모리에 상주하기 때문에 프로그램을 언로드하지 않으면 메모리 누수가 해제되지 않습니다.
따라서 버그가 있거나 내장 OS가 그렇게 설계했기 때문에 메모리를 회수하지 않는 OS와 다른 경우라고 생각할 수 있습니다.
하나의 예를 더 기억합니다. 주로 IBM 메인 프레임에서 실행되는 트랜잭션 서버 인 CICS ( 고객 정보 제어 시스템 )는 의사 대화입니다. 실행되면 사용자가 입력 한 데이터를 처리하고 사용자에 대한 다른 데이터 세트를 생성하여 사용자 터미널 노드로 전송하고 종료합니다. 주의 키를 활성화하면 다른 데이터 세트를 처리하기 위해 다시주의를 기울입니다. 기술적으로 다시 작동하는 방식으로 인해 CICS 트랜잭션 서버를 재활용하지 않으면 OS는 종료 된 CICS 프로그램에서 메모리를 회수하지 않습니다.
다른 사람들이 말했듯이, 대부분의 운영 체제는 프로세스 종료시 (그리고 아마도 네트워크 소켓, 파일 핸들 등과 같은 다른 리소스) 할당 된 메모리를 회수합니다.
말했듯이, 메모리가 유일한 malloc / free 대신에 new / delete를 다룰 때 걱정할 필요는 없습니다. 새로 할당 된 메모리는 회수 될 수 있지만 객체의 소멸자에서 수행 될 수있는 작업은 수행되지 않습니다. 아마도 어떤 클래스의 소멸자는 파기시 파일에 센티넬 값을 씁니다. 프로세스가 종료되면 파일 핸들이 플러시되고 메모리가 회수되지만 해당 센티넬 값은 기록되지 않습니다.
이야기의 도덕은 항상 자신을 정리하십시오. 물건을 매달려 두지 마십시오. 당신이 후에 OS 정리에 의존하지 마십시오. 자신을 정리하십시오.
이것은 언어보다 운영 체제에 의존 할 가능성이 높습니다. 궁극적으로 모든 언어의 모든 프로그램은 운영 체제에서 메모리를 가져옵니다.
프로그램이 종료되거나 충돌 할 때 메모리를 재활용하지 않는 운영 체제에 대해 들어 본 적이 없습니다. 따라서 프로그램에 메모리의 상한이 있으면 할당해야하며 할당하고 해제하지 않는 것이 합리적입니다.
프로그램이 다른 프로그램의 주소 공간에로드 된 동적 구성 요소 ( "플러그인")로 바뀐 경우, 깔끔한 메모리 관리 기능이있는 운영 체제에서도 문제가 될 수 있습니다. 우리는 코드가 성능이 떨어지는 시스템으로 이식되는 것에 대해 생각할 필요조차 없습니다.
반면에 모든 메모리를 해제 하면 프로그램 정리 성능에 영향을 줄 수 있습니다 .
내가 작업 한 프로그램 중 하나는 특정 테스트 케이스가 프로그램을 종료하는 데 30 초 이상이 필요하다는 것입니다. 모든 동적 메모리의 그래프를 통해 되풀이되고 조각 단위로 해제 되었기 때문입니다.
합리적인 해결책은 그 기능을 가지고 테스트 케이스로 처리하는 것이지만 프로덕션 코드에서 끄면 응용 프로그램이 빨리 종료됩니다.
제목이 필요한 모든 운영 체제는 종료 후 프로세스가 엉망인 것을 정리합니다. 그러나 예기치 않은 사건이 항상 있습니다. 어떻게 든 액세스가 거부되고 일부 가난한 프로그래머가 가능성을 예견하지 않아 나중에 다시 시도하지 않으면 어떻게 될까요? 메모리 누수가 미션 크리티컬 한 경우 항상 스스로를 청소하는 것이 더 안전합니다. 그렇지 않으면 비용이 많이 드는 경우 IMO 노력의 가치가 없습니다.
편집 : 루프 에서처럼 메모리 누수가 쌓일 위치에 있으면 메모리 누수를 정리해야합니다. 내가 말한 메모리 누수는 프로그램 과정 내내 일정한 시간에 축적되는 누수입니다. 다른 종류의 누수가 있으면 조만간 심각한 문제가 될 것입니다.
기술적 인 측면에서 누출이 메모리 '복잡성'인 경우 O (1) 대부분의 경우 괜찮습니다. O (로그온)은 이미 불쾌하고 (일부 경우 치명적 임) O (N) +는 견딜 수 없습니다.
POSIX 호환 시스템의 공유 메모리는 shm_unlink가 호출되거나 시스템이 재부팅 될 때까지 지속됩니다.
프로세스 간 통신이있는 경우 다른 프로세스가 프로토콜에 따라 리소스를 완료하지 않고 소비하지 않을 수 있습니다.
예를 들어, 프린터 작업 도중에 JVM을 종료했을 때 Java로 PDF 프린터로 인쇄하는 실험을 한 번 시도했지만 PDF 스풀링 프로세스는 활성 상태로 유지되었고 작업 관리자에서 종료해야했습니다. 인쇄를 다시 시도하십시오.
참고 URL : https://stackoverflow.com/questions/15467298/how-far-can-memory-leaks-go
'Programing' 카테고리의 다른 글
CSS에서 이미지 위에 텍스트를 배치하는 방법 (0) | 2020.07.17 |
---|---|
C #의 정수 나누기가 왜 실수가 아닌 정수를 반환합니까? (0) | 2020.07.17 |
Java에서 클래스 내부의 열거 형 유형은 정적입니까? (0) | 2020.07.17 |
http get 요청에서 헤더를 설정하는 방법은 무엇입니까? (0) | 2020.07.17 |
스크립트를 비동기 적으로로드 (0) | 2020.07.17 |