유출 된 메모리가 kernel_task에 malloced로 나타나는 이유는 무엇이며, 왜 OS X이 가비지를 수집하지 못하는가 프린트에서 갑자기 예상치 못한

이전에 일부 응용 프로그램에서 메모리 누수가 발생했다는 신호 kernel_task는 일반적으로 기가 바이트 정도의 큰 메모리 공간을 차지 한다는 것 입니다. 잘못 kext이이 메모리 사용을 야기한 경우 , 할당 된 메모리와 할당 될 것으로 예상되는 메모리 간의 불일치가 예상됩니다.

diff <(kextstat|tr -s ' ' | cut -d ' ' -f 5) <(kextstat| tr -s ' ' | cut -d ' ' -f 6)

‘유선’및 ‘이름’이외의 단어를 반환합니다.

논문을 쓰면서 미리보기에서 열려있는 pdf를 변경하면 종종 나쁜 일이 발생하는 것을 발견했습니다. 때로는 메모리 사용량이 kernel_task약 8 기가 바이트 이상으로 증가 할 수 있습니다. 미리보기를 종료하면 즉시 정상으로 돌아갑니다 . 따라서 분명히 무언가 잘못되었습니다. 이러한 조건에서 미리보기에서 메모리가 누출됩니다.

그래서, 내 질문은 이것이다 : 만약 내가 프로세스의 풋 프린트에서 갑자기 예상치 못한 증가를 통해 램을 유출했다고 알 kernel_task수없는 이유, OS X 뭔가가 사라 잘못이 알고있다. Preview를 종료하면 누락 된 malloc()‘d 메모리가 복원되면 Darwin이 가비지 수집을 자동으로 수행 하지 않는 이유 무엇입니까?

메모리 관리 작동 방식에 대한 근본적인 오해가 있습니까?

편집 : (15/9/15)

여기 내가 말하는 것에 대한 데모가 있습니다. 우선, 메모리 사용량이 높다는 것을 알았습니다 kernel_task(미리보기가 열려 있으며 333 MiB의 램을 사용하여 활동 모니터의 맨 아래에 표시됩니다).

높은 커널 메모리 사용량

아래 Ashley의 유용한 발언에 따라 각 kext가 얼마나 많이 사용하는지 알아 보겠습니다.

$ kextstat | awk 'NR==1{ printf "%10s %s\n", $5, $6; } NR!=1{ printf "%10d %s\n", $5, $6; }' | sort -n

...
...
...
   1249280 com.apple.driver.DspFuncLib
   1769472 com.apple.nvidia.driver.NVDAGK100Hal
   2629632 com.apple.nvidia.driver.NVDAResman
   6184960 com.apple.driver.AirPort.Brcm4360
$

따라서 큰 금액은 아닙니다. 내 컴퓨터에는 개별 GPU와 통합 GPU가 있습니다. 드라이버는 몇 MiB의 유선 램만 사용하고 있습니다. 내 직감에서 미리보기를 종료하고 메모리 풋 프린트가 어떻게되는지 봅시다 kernel_task.

살인 미리보기가 도움이됩니다

미리보기가 사라지고 커널의 메모리 사용량이 크게 줄었습니다. kext 사용법의 변경에 대한 증거는 여전히 없습니다. 위 명령의 출력은 변경되지 않습니다.

편집 : 버그가 22701036으로보고되었습니다. 여전히 사과의 응답을 기다리고 있습니다. ActivityMonitor에서 프로세스를 검사하면 특별히 흥미로운 것은 없지만 뭔가 빠진 것 같습니다.



답변

OS X핵심은 가비지 수집되지 않습니다. IOKit의 libkern C ++ Runtime 은 개발자가 자신의 메모리를 관리해야합니다.

맥 메모리 관리

에서 어떻게 맥 OS X에서 메모리 관리 작동합니까?

Apple 은 개발자 문서의 일부로 웹 에서 가장 낮은 수준의 Mach Kernel 및 가상 메모리 하위 시스템을 문서화합니다.

그 커널은 Carnegie Mellon University에 의해 개발되었으므로 , 이를 쉽게 설명하는 수십 개의 논문을 찾을 수 있습니다.

다른 출처

가비지 콜렉션

가비지 콜렉션은 사용자 또는 애플리케이션 계층에 존재합니다. 이 계층에서도 가비지 수집은 응용 프로그램이 메모리에 대한 모든 클레임을 해제 한 경우에만 도움이됩니다. 순환 종속성은 가비지 수집을 무효화 할 수 있습니다. 가비지 콜렉션 자체는 계속 발전하고있는 연구 분야이며 제대로 이해하기가 어렵습니다 .

버그 및 메모리 누수보고

OS X의 버그는 메모리 누수입니다. 코드베이스의 크기를 감안할 때 이것은 거의 확실합니다.

재현 가능한 버그를 Apple에 직접보고 하십시오 . 모든 버그 보고서는 도움이되며 아마도 여러분의 사례는 Apple 엔지니어가 원인을 찾아내는 데 도움이 될 것입니다.


답변

Mac에 통합 GPU (예 : Intel Iris Graphics)가 있다고 가정합니다.

논문을 미리보기에서 열면 그래픽 카드 메모리를 사용하여 미리보기 창의 이미지 ( “텍스처”)와 논문에서 화면을 벗어나 디코딩되지 않은 페이지를 보관할 수 있습니다.

통합 그래픽 카드를 사용하면 비디오 메모리는 실제로 CPU와 GPU간에 공유되는 시스템 RAM에 있습니다 (부분적으로?). 일부 통합 그래픽 카드에서 사용되는 시스템 RAM의 양은 동적으로 할당됩니다 ( Apple HT204349 참조 ).

그래픽 카드 드라이버 및 / 또는 미리보기에 간헐적으로 버그가 표시되는데 미리보기에서 논문 PDF를 다시로드 할 때 시스템 메모리가 올바르게 해제되지 않습니다. (그러나이 버그는 OS X / 드라이버가 미리보기가 종료 될 때 메모리를 올바르게 해제함으로써 완화됩니다.)

결과를 kextstat보고 Size문제가 발생하면 열의 숫자가 증가하는지 확인할 수 있습니다. 내 이론은 당신이 언급 한 8GB 증가는 그래픽 카드 드라이버 때문일 것입니다.

다음 명령 ( 이 관련 있고 흥미로운 답변 에 대한 주석에서 ) kextstat은 어떤 kext가 가장 많은 메모리를 사용하고 있는지 쉽게 알 수 있도록 출력을 정렬합니다 ( Wired열에 따라 정렬되어 있음에도 불구 하고 유사하고 간단한 incantation 이 있습니다) 이것을 조정하고 싶다면 설명으로 대답 하십시오).

kextstat | awk 'NR==1{ printf "%10s %s\n", $5, $6; } NR!=1{ printf "%10d %s\n", $5, $6; }' | sort -n


답변