답변:
가상 메모리는 반드시 메모리 일 필요는 없습니다. 예를 들어, 프로세스가 큰 파일을 메모리에 매핑하면 파일은 실제로 디스크에 저장되지만 프로세스에서 "주소 공간"을 차지합니다.
주소 공간 (즉, 프로세스 목록의 가상 메모리)에는 비용이 들지 않습니다. 진짜 아니에요 실제로는 상주 메모리 인 RSS (RES) 열이 있습니다. 그것은 프로세스가 차지하는 실제 메모리의 양입니다.
그러나 그조차도 완전한 대답은 아닙니다. 프로세스가 fork ()를 호출하면 프로세스는 두 부분으로 나뉘며 둘 다 처음에 모든 RSS를 공유합니다. 따라서 RSS가 처음에 1GB 인 경우에도 분기 후 결과는 각각 RSS가 1GB 인 두 개의 프로세스가되지만 여전히 1GB의 메모리 만 사용하게됩니다.
아직 혼란스러워? 실제로 알아야 할 사항은 다음과 같습니다. free
명령을 사용 하여 프로그램 시작 전후에 결과를 확인하십시오 ( +/- buffers/cache
라인에서). 그 차이는 새로 시작한 프로그램이 사용한 새로운 메모리 양 입니다.
smem
.
java -Xmx16g RunLong
16Gb 메모리를 예약하는을 통해 Java 프로세스를 시작하면 VIRT
맨 위에 16Gb가 계산됩니다. 이 경우이 16Gb 메모리의 유형은 매핑 된 메모리 또는 ..?입니다.
top (1) 매뉴얼 페이지에서 :
o: VIRT -- Virtual Image (kb)
The total amount of virtual memory used by the task. It
includes all code, data and shared libraries plus pages that
have been swapped out.
VIRT = SWAP + RES.
여기서 RES는 RESident memory (실제 메모리 사용)를 의미합니다.
사실 그것은 정확하지 않습니다 (더 이상). "스왑"이라고 표시되면 프로그램이 해당 주소 공간에 매핑 한 파일도 포함하며 실제로 실제 RAM을 사용하거나 사용하지 않을 수 있습니다. 이 메모리는 파일 백업이지만 실제로 교체되지는 않습니다.
VIRT에는 할당되었지만 아직 아무것도 사용하지 않은 페이지도 포함됩니다. 이 상태의 모든 페이지는 커널 Zero Page (매우 훌륭한 개념-찾아야 함)에 매핑되므로 VIRT에 표시되지만 실제로는 메모리를 소비하지 않습니다.
-m : VIRT/USED toggle Reports USED (sum of process rss and swap total count) instead of VIRT
. 이 답변을 공감할 수없는 것은 유감입니다.
나는 Mugurel Sumanariu 에서이 설명을 매우 분명하게 발견했습니다 .
VIRT
프로세스의 가상 크기 (실제로 사용중인 메모리, 자체적으로 매핑 된 메모리 (예 : X 서버의 비디오 카드 RAM), 매핑 된 디스크의 파일 (대부분))를 나타냅니다. 특히 공유 라이브러리) 및 다른 프로세스와 공유되는 메모리. VIRT는 현재 프로그램이 액세스 할 수있는 메모리 양을 나타냅니다.
RES
상주 크기를 나타내며 프로세스가 소비하는 실제 물리적 메모리의 양을 정확하게 나타냅니다. 대부분의 프로그램은 C 라이브러리에 의존하기 때문에 사실상 항상 VIRT 크기보다 작습니다.
SHR
실제로 공유 할 수있는 VIRT 크기 (메모리 또는 라이브러리)의 양을 나타냅니다. 라이브러리의 경우 반드시 전체 라이브러리가 상주한다는 것을 의미하지는 않습니다. 예를 들어, 프로그램이 라이브러리에서 함수를 몇 개만 사용하는 경우 전체 라이브러리가 맵핑되고 VIRT 및 SHR로 계산되지만 사용중인 함수를 포함하는 라이브러리 파일의 일부만 실제로로드되어 계산됩니다. RES.
ps / top 출력의 VIRT 열은 메모리 사용량을 측정하는 데 거의 관련이 없습니다. 걱정하지 마십시오. 아파치 과부하 VIRT vs RES 메모리
Linux는 가상 메모리를 지원합니다. 즉, 디스크를 RAM 확장으로 사용하여 사용 가능한 메모리의 유효 크기가 그에 따라 증가합니다. 커널은 메모리를 다른 용도로 사용할 수 있도록 현재 사용하지 않는 메모리 블록의 내용을 하드 디스크에 씁니다. 원본 내용이 다시 필요할 때 메모리로 다시 읽습니다. 이것은 모두 사용자에게 완전히 투명하게 만들어졌습니다. Linux에서 실행되는 프로그램은 더 많은 양의 메모리 만 사용할 수 있으며 일부는 때때로 디스크에 상주합니다. 물론 하드 디스크를 읽고 쓰는 것이 실제 메모리를 사용하는 것보다 느리기 때문에 (천 배 정도 느리므로) 프로그램이 빠르게 실행되지 않습니다. 가상 메모리로 사용되는 하드 디스크 부분을 스왑 공간이라고합니다.
Linux는 파일 시스템의 일반 파일 또는 스왑 공간을위한 별도의 파티션을 사용할 수 있습니다. 스왑 파티션은 빠르지 만 스왑 파일의 크기를 변경하는 것이 더 쉽습니다 (전체 하드 디스크를 다시 파티션 할 필요가 없으며 처음부터 모든 것을 설치할 필요가 없습니다). 스왑 공간이 얼마나 필요한지 알면 스왑 파티션을 사용해야하지만 확실하지 않은 경우 스왑 파일을 먼저 사용하고 잠시 동안 시스템을 사용하여 스왑 크기를 느낄 수 있습니다. 그런 다음 크기에 대해 확신 할 때 스왑 파티션을 만드십시오.
또한 Linux에서는 여러 개의 스왑 파티션 및 / 또는 스왑 파일을 동시에 사용할 수 있습니다. 즉, 때때로 특별한 양의 스왑 공간 만 필요한 경우에는 전체 할당량을 항상 할당하지 않고 해당 시간에 추가 스왑 파일을 설정할 수 있습니다.
운영 체제 용어에 대한 참고 사항 : 컴퓨터 과학은 일반적으로 스와핑 (공간을 스왑하기 위해 전체 프로세스 작성)과 페이징 (고정 크기의 파트 (일반적으로 한 번에 몇 킬로바이트) 만 작성)을 구분합니다. 페이징은 일반적으로 더 효율적이며 Linux가하는 일이지만 전통적인 Linux 용어는 스와핑에 대해 이야기합니다.
VIRtual
맨 위 열은 프로세스가 실제로 런타임에 사용하지 않을 수있는 프로세스의 슈퍼 스페이스 (슈퍼 소비 스페이스)를 나타냅니다. RESident
런타임에 프로세스가 할당 한 실제 물리적 메모리 / 공간을 나타내는 또 다른 열이 있습니다 .
두 프로세스의 차이점에 대한 이유는 예제를 통해 이해할 수 있습니다. 프로세스가 특정 라이브러리를 사용하는 경우 라이브러리 크기도 도움이됩니다 virtual-size
. 그러나 라이브러리의 일부만 사용되므로 (즉, 사용중인 일부 메소드) 도움이 될 것입니다 resident-size
.
추가 정보 참조