위: DATA = RES + 스택 + 무엇입니까?

위: DATA = RES + 스택 + 무엇입니까?

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()

관련 정보