Linux Mint에서 Java 프로그램의 메모리 소비를 분석했습니다. 나는 top
메모리 통계(프로그램에서 사용하는 메모리와 total_mem_used 및 mem_free와 같은 시스템 전체 측정항목)를 캡처하는 데 사용했습니다. 결과는 놀랍습니다.
- "사용된 물리적 메모리"(
RAM_USE_DELTA
차트에서)는 증가하고 "사용 가능한 물리적 메모리"(차트에서 복구됨 )RAM_FREE_DELTA
는 RES(차트에서) 증가와P_RSS
동일한 양만큼 감소합니다. 이것이 제가 예상한 것입니다. - DATA(
P_DATA
차트의) 필드(top
맨에서 "실행 코드 이외의 전용 물리적 메모리 양"으로 설명됨)는 RES보다 150MB 더 높습니다. - 스왑(
SWAP_USE_DELTA
차트에서)은 항상 0입니다. - SHR(공유 메모리,
P_SHR
차트)은 15MB 미만입니다.
문제는 앞서 언급한 150MB가 정확히 무엇인지입니다. 가상(예약되었지만 할당되지 않음) 스택이 있습니까? 메모리 매핑 파일? 전에 썼던 것처럼 RES
~ RAM_USED_DELTA
그래서 사용 가능한 메모리 양이 150MB만큼 줄어들지 않아서 가상 메모리를 의미할 수도 있지만 메모리 표시가 상주 세트와 가상 메모리 양의 합이면 이상할 것 같은데...
(이 다이어그램에서 묘사된 선은 *_DELTA
프로그램의 시작 부분을 기준으로 합니다. 즉, 빨간색이 시작되는 왼쪽 근처에 있습니다 P_RSS
.)
답변1
DATA 필드는 실행 불가능한 코드, 즉 데이터에 할당되는 프로세스의 가상 메모리입니다. 여기에는 정적 데이터, 스택 및 동적으로 할당된 메모리가 포함되며 CODE 필드와 함께 전체 가상 메모리에 포함됩니다. RESident 크기는 RAM에 있는 가상 메모리의 실제 양입니다. 이는 부분 코드, 부분 데이터 및 기타 부분(예: 메모리 매핑 파일)으로 구성됩니다.
VIRT, CODE, DATA 및 RES 사이에는 직접적인 관계가 없다는 것을 알 수 있습니다. CODE는 컴파일러에서 제공됩니다. VIRT 및 DATA는 프로세스( , 등)에 의해 제어됩니다 . malloc()
RES 부분은 운영 체제에 의해 제어됩니다.free()
mmap()