상단의 가상 메모리 크기는 무엇을 의미합니까? 1GB의 스왑을 가지고 있으며 0 % 사용을

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

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

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

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



답변

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

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

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

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


답변

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


답변

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

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

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

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


답변

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

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


답변

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

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

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

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

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


답변

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

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

추가 정보 참조


답변

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