상단의 가상 메모리 크기는 무엇을 의미합니까?


124

top서버 성능을 모니터링하기 위해 실행 중이며 Java 프로세스 중 2 개가 최대 800MB-1GB의 가상 메모리를 보여줍니다. 그게 나쁜가요?

가상 메모리는 무엇을 의미합니까?

그리고 btw, 나는 1GB의 스왑을 가지고 있으며 0 % 사용을 보여줍니다. 그래서 혼란스러워합니다.

Java 프로세스 = 1 Tomcat 서버 + 내 Java 데몬 서버 = Ubuntu 9.10 (karmic)


답변:


142

가상 메모리는 반드시 메모리 일 필요는 없습니다. 예를 들어, 프로세스가 큰 파일을 메모리에 매핑하면 파일은 실제로 디스크에 저장되지만 프로세스에서 "주소 공간"을 차지합니다.

주소 공간 (즉, 프로세스 목록의 가상 메모리)에는 비용이 들지 않습니다. 진짜 아니에요 실제로는 상주 메모리 인 RSS (RES) 열이 있습니다. 그것은 프로세스가 차지하는 실제 메모리의 양입니다.

그러나 그조차도 완전한 대답은 아닙니다. 프로세스가 fork ()를 호출하면 프로세스는 두 부분으로 나뉘며 둘 다 처음에 모든 RSS를 공유합니다. 따라서 RSS가 처음에 1GB 인 경우에도 분기 후 결과는 각각 RSS가 1GB 인 두 개의 프로세스가되지만 여전히 1GB의 메모리 만 사용하게됩니다.

아직 혼란스러워? 실제로 알아야 할 사항은 다음과 같습니다. free명령을 사용 하여 프로그램 시작 전후에 결과를 확인하십시오 ( +/- buffers/cache라인에서). 그 차이는 새로 시작한 프로그램이 사용한 새로운 메모리 양 입니다.


2
"프로그램 시작 전후의 결과 확인"또는에서 반환 한대로 USS (Unique Set Size)를 사용하십시오 smem.
Hubert Kario

실제 사용되는 메모리 양을 제공하는 도구, 타사가 아닌 도구가 있습니다.
CMCDragonkai

@CMCDragonkai 예, 무료입니다.
deviantfan

1
Java 프로세스에 java -Xmx16g RunLong16Gb 메모리를 예약하는을 통해 Java 프로세스를 시작하면 VIRT맨 위에 16Gb가 계산됩니다. 이 경우이 16Gb 메모리의 유형은 매핑 된 메모리 또는 ..?입니다.
Eric Wang

1
@EricWang, 그 메모리는 매핑되지 않았습니다. 나중에 필요할지도 모르는 메모리를 예약하라는 것은 OS에 대한 요청 일뿐입니다. (적어도) Linux에서는 MAP_NORESERVE 및 PROT_NONE 플래그를 사용하는 mmap 호출입니다 (os :: pd_reserve_memory는 anon_mmap를 호출 함 : github.com/AdoptOpenJDK/openjdk-jdk11u/blob/… ); 실제로 메모리는 기본적으로 할당되지 않습니다. 나중에 프로그램이 객체 할당 요청을 충족시키기 위해 메모리가 실제로 필요한 시점에서만 수행됩니다.
Juraj Martinka

23

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에 표시되지만 실제로는 메모리를 소비하지 않습니다.


2
잘 흥미로운 점은 VIRT = SWAP + RES입니다 .2 Java 프로세스의 가상 메모리는 1GB에 가깝지만 SWAP 사용량은 어떻게 0입니까?
kapso

기본적으로 톱 쇼 .... 스왑 : 총 1048568k, 0k 사용됨, 1048568k 무료, 505728k 캐시 됨
kapso

15
@ user42159이 답변은 잘못되었습니다! 맨 탑에는 'VIRT = SWAP + RES'가 없습니다! -m : VIRT/USED toggle Reports USED (sum of process rss and swap total count) instead of VIRT. 이 답변을 공감할 수없는 것은 유감입니다.
duleshi

3
이 답변은 잘못되었습니다. USED ​​= 해상도 + 교체 크기
Jason S

14

나는 Mugurel Sumanariu 에서이 설명을 매우 분명하게 발견했습니다 .

VIRT프로세스의 가상 크기 (실제로 사용중인 메모리, 자체적으로 매핑 된 메모리 (예 : X 서버의 비디오 카드 RAM), 매핑 된 디스크의 파일 (대부분))를 나타냅니다. 특히 공유 라이브러리) 및 다른 프로세스와 공유되는 메모리. VIRT는 현재 프로그램이 액세스 할 수있는 메모리 양을 나타냅니다.

RES상주 크기를 나타내며 프로세스가 소비하는 실제 물리적 메모리의 양을 정확하게 나타냅니다. 대부분의 프로그램은 C 라이브러리에 의존하기 때문에 사실상 항상 VIRT 크기보다 작습니다.

SHR실제로 공유 할 수있는 VIRT 크기 (메모리 또는 라이브러리)의 양을 나타냅니다. 라이브러리의 경우 반드시 전체 라이브러리가 상주한다는 것을 의미하지는 않습니다. 예를 들어, 프로그램이 라이브러리에서 함수를 몇 개만 사용하는 경우 전체 라이브러리가 맵핑되고 VIRT 및 SHR로 계산되지만 사용중인 함수를 포함하는 라이브러리 파일의 일부만 실제로로드되어 계산됩니다. RES.


"VIRT는 현재 프로그램이 얼마나 많은 메모리에 액세스 할 수 있는지를 나타냅니다." "VIRT는 현재 현재 주소 지정 가능한 전체 공간의 크기를 나타냅니다." 그래, 그것은 여전히 ​​광택을 사용할 수 있습니다. 그러나 요점은 VIRT가 RAM 공간과 아무 관련 이 없을 때 "메모리 용량"이 RAM에 대해 이야기하고 있다는 인상을 줄 수 있다는 것 입니다. 실제로, 큰 프로그램은 종종 전체 시스템 RAM 크기의 여러 MULTIPLE 인 VIRT 크기를 갖습니다. VIRT는 거의 완전히 파일 백업 주소 영역 (일명 "RAM이 아닌 디스크")이기 때문입니다.
FeRD

5

ps / top 출력의 VIRT 열은 메모리 사용량을 측정하는 데 거의 관련이 없습니다. 걱정하지 마십시오. 아파치 과부하 VIRT vs RES 메모리

https://stackoverflow.com/questions/561245/virtual-memory-usage-from-java-under-linux-too-much-memory-used


스왑 사용량이 0 % 인 동안 가상 메모리 열이 매우 높기 때문에 걱정하고 혼란스러워했습니다. 또한 총 2.7GB의 실제 메모리 중 1.7GB 만 사용하고 가상 메모리는 높습니까?
kapso

2

Linux는 가상 메모리를 지원합니다. 즉, 디스크를 RAM 확장으로 사용하여 사용 가능한 메모리의 유효 크기가 그에 따라 증가합니다. 커널은 메모리를 다른 용도로 사용할 수 있도록 현재 사용하지 않는 메모리 블록의 내용을 하드 디스크에 씁니다. 원본 내용이 다시 필요할 때 메모리로 다시 읽습니다. 이것은 모두 사용자에게 완전히 투명하게 만들어졌습니다. Linux에서 실행되는 프로그램은 더 많은 양의 메모리 만 사용할 수 있으며 일부는 때때로 디스크에 상주합니다. 물론 하드 디스크를 읽고 쓰는 것이 실제 메모리를 사용하는 것보다 느리기 때문에 (천 배 정도 느리므로) 프로그램이 빠르게 실행되지 않습니다. 가상 메모리로 사용되는 하드 디스크 부분을 스왑 공간이라고합니다.

Linux는 파일 시스템의 일반 파일 또는 스왑 공간을위한 별도의 파티션을 사용할 수 있습니다. 스왑 파티션은 빠르지 만 스왑 파일의 크기를 변경하는 것이 더 쉽습니다 (전체 하드 디스크를 다시 파티션 할 필요가 없으며 처음부터 모든 것을 설치할 필요가 없습니다). 스왑 공간이 얼마나 필요한지 알면 스왑 파티션을 사용해야하지만 확실하지 않은 경우 스왑 파일을 먼저 사용하고 잠시 동안 시스템을 사용하여 스왑 크기를 느낄 수 있습니다. 그런 다음 크기에 대해 확신 할 때 스왑 파티션을 만드십시오.

또한 Linux에서는 여러 개의 스왑 파티션 및 / 또는 스왑 파일을 동시에 사용할 수 있습니다. 즉, 때때로 특별한 양의 스왑 공간 만 필요한 경우에는 전체 할당량을 항상 할당하지 않고 해당 시간에 추가 스왑 파일을 설정할 수 있습니다.

운영 체제 용어에 대한 참고 사항 : 컴퓨터 과학은 일반적으로 스와핑 (공간을 스왑하기 위해 전체 프로세스 작성)과 페이징 (고정 크기의 파트 (일반적으로 한 번에 몇 킬로바이트) 만 작성)을 구분합니다. 페이징은 일반적으로 더 효율적이며 Linux가하는 일이지만 전통적인 Linux 용어는 스와핑에 대해 이야기합니다.

출처 : http://www.faqs.org/docs/linux_admin/x1752.html


1
이 답변은 가상 메모리가 스왑 또는 페이징과 동일하다는 오해를 퍼뜨립니다. 디스크를 RAM 확장으로 사용하면 가상 메모리보다 먼저 사용됩니다. 그리고 가상 메모리는 있지만 디스크를 RAM의 확장으로 사용하지 않는 많은 시스템 (예 : 대부분의 SoHo 라우터)이 있습니다. (그리고 이것은 스왑을 사용하지 않기 때문에 OP의 질문에 대한 대답도 아닙니다.)
David Schwartz

2

VIRtual맨 위 열은 프로세스가 실제로 런타임에 사용하지 않을 수있는 프로세스의 슈퍼 스페이스 (슈퍼 소비 스페이스)를 나타냅니다. RESident런타임에 프로세스가 할당 한 실제 물리적 메모리 / 공간을 나타내는 또 다른 열이 있습니다 .

두 프로세스의 차이점에 대한 이유는 예제를 통해 이해할 수 있습니다. 프로세스가 특정 라이브러리를 사용하는 경우 라이브러리 크기도 도움이됩니다 virtual-size. 그러나 라이브러리의 일부만 사용되므로 (즉, 사용중인 일부 메소드) 도움이 될 것입니다 resident-size.

추가 정보 참조


0

"VIRT"는 단지 공간을 처리하며 RES는 "실제"메모리이지만 "SHR"(= 공유) 양 "RES"는 다른 프로세스와 공유되는 RES의 일부입니다. 따라서 대부분의 프로세스에서 RES에서 SHR을 빼면이 특정 프로세스에 실제로 기여할 수있는 메모리 양이 제공됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.