이것은 정말보기 흉한 질문입니다.forking에 의한 메모리 누수 완화
가 나는 루프에서 다음을 수행하는 C++ 프로그램이 : JMS 메시지
- 대기를 일부 데이터
- 는
응답 JMS 메시지를 보냅니다 계산 내 프로그램 ("Bob"이라고 부름)은 다소 심각한 메모리 누수가 있습니다. 메모리 누수는 다른 사람이 작성한 공유 라이브러리에 있습니다.이 라이브러리는 사용해야하지만 액세스 권한이없는 소스 코드입니다.
이 메모리 누수로 인해 루프의 "일부 데이터를 계산합니다"단계에서 Bob이 손상됩니다. 이것은 다른 프로그램이 Bob의 응답을 기다리고 있기 때문에 문제이며, 응답을받지 못하면 매우 혼란 스럽습니다.
다양한 제한 사항 (예 : X/Y 문제이므로 내가 못생긴다고 말씀 드렸습니다) 만 수행 가능한 전략은 루프에서 다음을 수행하도록 Bob을 수정하는 것입니다.
JMS 메시지- 대기가이 경우에 "너무 많은"메모리
- 를 사용하여 위험의 여부를 확인하기 위해 응답
- 확인을
- 가 JMS 메시지를 보냅니다 일부 데이터를 계산하므로, 포크와 간부 사람 같아 자체 복사하고 우아하게
내 질문은 다음과 같다 종료 :
우리는 "너무 많은"메모리를 사용하고 있는지 여부를 감지하는 가장 좋은 (신뢰할하지만 너무 비효율적 인) 방법은 무엇입니까? 내 생각은 getrlimit(RLIMIT_AS) rlim_cur
을 getrusage(RUSAGE_SELF) ru_maxrss
과 비교하는 것입니다. 그 맞습니까? 그렇지 않다면 더 좋은 방법이 무엇입니까? Bob은 다양한 호스트 컴퓨터의 Linux VM에서 실행됩니다. 모두 다른 양의 메모리를 사용합니다.
"일부 데이터 계산"단계에서 메모리 누수가 발생한다고 가정하고, 별도의 프로그램으로 해당 부분을 리팩터링하고 별도의 메모리 공간에서 실행하도록 포크 아웃하는 것이 더 합리적인지 궁금합니다. 그렇게하면 문제가되는 코드를 분리하고 나중에 메모리를 거의 사용하지 않을 때 프로그램을 다시 시작함으로써 문제를 마스킹하지 않고 나중에 코드를 쉽게 대체 할 수 있습니다. 그것은 단지 생각입니다. 코드를 보지 않고도 그것이 코드가 실행 가능한 옵션인지 여부는 말할 수 없습니다. 해결 방법은 –
입니다. 계산이 완료 될 때마다 종료하지 않고 매번 프로그램을 다시 시작하는 것이 어떻습니까? –
진, 가능한 극단적 인 끝에. 엄격하게 필요한 경우에만 다시 시작하여 오버 헤드를 줄이는 것이 가능한지 궁금합니다. – Arandur