programing

메모리 누수는 어디까지 할 수 있습니까?

bestcode 2022. 8. 9. 21:43
반응형

메모리 누수는 어디까지 할 수 있습니까?

을 사용하다 내가 ★★★★★★★★★★★★★★★★★★★★★★★.mallocFILE *더러운 세탁물 같아요.나는 일반적으로 적어도 프로그램이 종료될 때 모든 메모리가 청소될 것이라고 생각한다(절박하게 읽는다).프로그램 종료 시 리크된 메모리가 수집되지 않거나 크래시가 발생할 수 있습니까?

언어마다 답이 크게 다르다면 C(+)에 초점을 맞추자.

'아주머니'는 '아주머니는...안전하지 않다*malloc*inglaundry * * * * laundry laundry빨래에 주세요.

아니요. 운영체제는 프로세스가 종료될 때 프로세스가 보유한 모든 리소스를 해방합니다.

이는 메모리, 열린 파일, 네트워크 연결, 창 핸들 등 운영 체제가 유지하는 모든 리소스에 적용됩니다.

즉, operating system이 탑재되어 있지 않은 임베디드 시스템에서 프로그램을 실행하고 있는 경우, 또는 매우 심플한 operating system이나 버그가 있는 경우는, 재기동할 때까지 메모리를 사용할 수 없는 경우가 있습니다.하지만 만약 당신이 그 상황이었다면 당신은 아마 이 질문을 하지 않았을 것입니다.

OS에 따라서는, 자원을 해방하는 데 오랜 시간이 걸릴 수 있습니다.예를 들어 네트워크 서버가 접속을 받아들이기 위해 사용하는TCP 포트는 프로그램에 의해 정상적으로 닫히더라도 개방되기까지 몇 분 정도 걸릴 수 있습니다.네트워크 프로그램은 데이터베이스 개체와 같은 원격 리소스를 보유할 수도 있습니다.네트워크 접속이 끊어지면 리모트시스템에 의해 이러한 리소스가 해방되지만 로컬 운영체제보다 시간이 더 걸릴 수 있습니다.

에는 C에 의해 않습니다.malloc프로그램이 종료되면 해제됩니다.이 조작은, 모든 OS(통상은 임베디드 환경에 있는 OS)가 아니고, operating system에 의해서 행해집니다.프로그램이 종료되면 메모리가 해방됩니다.

모든 답변이 최신 OS에 관한 질문의 대부분을 커버하고 있기 때문에, 지금까지 DOS 세계에서 프로그래밍을 한 적이 있다면 언급할 가치가 있는 것이 있습니다.Terminant and Stay Resident(TSR; 터미넌트 앤 스테이 레지던트) 프로그램은 보통 시스템에 제어권을 반환하지만 소프트웨어/하드웨어 인터럽트에 의해 부활할 수 있는 메모리에 상주합니다.이러한 OS에서 작업할 때 "메모리 부족! 일부 TSR을 언로드해 보십시오"와 같은 메시지가 나타나는 것은 정상입니다.

따라서 엄밀히 말하면 프로그램은 종료되지만 아직 메모리에 존재하기 때문에 프로그램을 언로드하지 않는 한 메모리 누수는 발생하지 않습니다.

OS가 메모리를 재할당하지 않는 것도 버그가 원인이거나 내장 OS가 메모리를 재할당하도록 설계되어 있기 때문이라고 생각할 수 있습니다.

한 가지 예를 더 기억합니다.주로 IBM 메인프레임에서 실행되는 트랜잭션 서버인 CICS(Customer Information Control System)는 의사 변환 방식입니다.실행 시 사용자가 입력한 데이터를 처리하고 사용자를 위해 다른 데이터 세트를 생성하여 사용자 터미널 노드로 전송한 후 종료합니다.주의 키를 활성화하면 다시 활성화되어 다른 데이터 세트를 처리합니다.엄밀히 말하면 CICS 트랜잭션서버를 재활용하지 않는 한 OS는 종료된 CICS 프로그램에서 메모리를 회수하지 않습니다.

다른 운영체제가 말했듯이 대부분의 운영체제는 프로세스 종료 시 할당된 메모리(및 네트워크 소켓, 파일 핸들 등 기타 리소스)를 회수합니다.

그렇다고 (원래 malloc/free가 아니라) 신규/삭제 처리 시 메모리만 신경 쓸 필요는 없을지도 모릅니다.새로 할당된 메모리가 회수될 수 있지만 개체의 소멸자에서 수행될 수 있는 작업은 발생하지 않습니다.일부 클래스의 소멸자는 파괴 시 파일에 sentinel 값을 쓸 수 있습니다.프로세스가 종료되면 파일 핸들이 플러시되고 메모리가 재확보될 수 있지만 이 sentinel 값은 기록되지 않습니다.

본말이 전도된 이야기지만, 항상 뒷정리를 해라.물건이 흔들리지 않도록 해라.OS 청소에 의존하지 마세요.뒷정리를 하세요.

이것은 언어보다 운영체제에 의존할 가능성이 높습니다.최종적으로, 어느 언어의 프로그램이라도, operating system으로부터 메모리를 취득할 수 있습니다.

프로그램이 종료/크래시 되었을 때 메모리를 재활용하지 않는 운영체제는 들어본 적이 없습니다.따라서 프로그램이 할당해야 하는 메모리의 상한을 가지고 있다면 할당만 하고 해방은 하지 않는 것이 지극히 합리적입니다.

프로그램이 다른 프로그램의 주소 공간에 로드되는 동적 컴포넌트("플러그인")로 변환되면 메모리 관리가 깔끔한 운영 체제에서도 문제가 발생합니다.성능이 떨어지는 시스템으로 코드가 이식되는 것은 생각할 필요도 없습니다.

한편, 모든 메모리를 해제하면, 프로그램 청소의 퍼포먼스에 영향을 줄 수 있습니다.

제가 작업하고 있던 프로그램 중 하나는 프로그램을 종료하는 데 30초 이상이 걸렸습니다. 왜냐하면 모든 다이내믹 메모리의 그래프에서 반복되어 하나씩 해제되었기 때문입니다.

합리적인 솔루션은 기능을 갖추고 테스트 케이스로 커버하되, 프로덕션 코드에서 꺼서 애플리케이션을 빠르게 종료하는 것입니다.

타이틀이 필요한 모든 운영체제는 종료 후 발생한 프로세스를 정리합니다.그러나 예기치 않은 이벤트는 항상 있습니다. 만약 어떤 식으로든 접근이 거부되고 어떤 서투른 프로그래머가 그 가능성을 예측하지 못했기 때문에 잠시 후에 다시 시도하지 않는다면 어떻게 될까요?메모리 누설이 미션 크리티컬한 경우에는 항상 청소하는 것이 안전합니다.그렇지 않으면 비용이 많이 든다면 IMO를 할 필요가 없습니다.

편집: 메모리 누수가 축적되는 장소(루프 등)에 있는 경우는, 그것들을 청소할 필요가 있습니다.메모리 누수는 프로그램 진행 중에 지속적으로 축적되는 것으로, 다른 종류의 누수가 있으면 조만간 심각한 문제가 될 가능성이 높습니다.

기술적인 측면에서 누설이 메모리 '복잡성' O(1)인 경우 대부분의 경우 O(logn)는 이미 불쾌(및 경우에 따라서는 치명적)이며 O(N)+는 견딜 수 없습니다.

POSIX 준거 시스템의 공유 메모리는 shm_unlink가 호출되거나 시스템이 재부팅될 때까지 유지됩니다.

프로세스 간 통신이 있는 경우 프로토콜에 따라 다른 프로세스가 완료되지 않고 리소스를 소비할 수 있습니다.

예를 들어, 저는 Java에서 PDF 프린터로 인쇄하는 실험을 한 적이 있습니다.프린터 작업 중에 JVM을 종료했을 때 PDF 스풀링 프로세스가 활성화되어 있기 때문에 인쇄를 재시도하기 전에 태스크 매니저에서 종료해야 했습니다.

언급URL : https://stackoverflow.com/questions/15467298/how-far-can-memory-leaks-go

반응형