이전에 일부 응용 프로그램에서 메모리 누수가 발생했다는 신호 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 은 개발자가 자신의 메모리를 관리해야합니다.
맥 메모리 관리
Apple 은 개발자 문서의 일부로 웹 에서 가장 낮은 수준의 Mach Kernel 및 가상 메모리 하위 시스템을 문서화합니다.
그 커널은 Carnegie Mellon University에 의해 개발되었으므로 , 이를 쉽게 설명하는 수십 개의 논문을 찾을 수 있습니다.
다른 출처
-
Wikipedia는 Mac OS 메모리 관리에 대해 설명 합니다 .
-
Apple의 지원 정보 : Activity Monitor를 사용하여 시스템 메모리를 읽고 사용중인 RAM의 양을 결정하십시오.
가비지 콜렉션
가비지 콜렉션은 사용자 또는 애플리케이션 계층에 존재합니다. 이 계층에서도 가비지 수집은 응용 프로그램이 메모리에 대한 모든 클레임을 해제 한 경우에만 도움이됩니다. 순환 종속성은 가비지 수집을 무효화 할 수 있습니다. 가비지 콜렉션 자체는 계속 발전하고있는 연구 분야이며 제대로 이해하기가 어렵습니다 .
버그 및 메모리 누수보고
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