고쳐 쓰다

고쳐 쓰다

새 VM에서 top에는 내 프로세스 중 하나가 100GB의 가상 메모리를 소비하는 것으로 표시됩니다. 나는 그것을 읽었다.아마도 과도한 사용으로 인해하지만 조금 너무 많습니다. 특히 실제 메모리가 6GB, 스왑 공간이 2GB, 단일 40GB 하드 드라이브 파티션만 있는 가상 머신에서는 이런 것을 본 적이 없습니다.

팬텀 메모리

101GB VIRT를 사용하는 흥미로운 프로세스는 Eclipse IDE(몇 분 전에 시작됨)이고 또 다른 프로세스는 98GB VIRT를 사용하는 WebKitWebProcess입니다. 다른 모든 프로세스의 VIRT 값은 약 1~2GB로 동일합니다. 세 가지 도구 모두 이에 동의하는 것 같습니다: top, htopps.

  • 프로세스가 너무 많은 가상 메모리를 요청하는 타당한 이유가 있습니까?
  • 그러한 행동은 시스템에 해롭지 않습니까?
  • 현재 총 가상 메모리 양의 제한은 얼마입니까?

고쳐 쓰다

세부 정보:
Linux 4.15.0-38-generic x86_64 GNU/Linux, Linux Mint 19 Tara
Java HotSpot(TM) 64비트 서버 VM(빌드 25.191-b12, 혼합 모드)
버전: 2018-09(4.9.0) 내부 버전 ID: 20180917-1800

/proc//maps의 내용은 다음으로 끝납니다.

00400000-00401000 r-xp 00000000 08:01 132092                             /usr/lib/jvm/java-8-oracle/jre/bin/java
00600000-00601000 r--p 00000000 08:01 132092                             /usr/lib/jvm/java-8-oracle/jre/bin/java
00601000-00602000 rw-p 00001000 08:01 132092                             /usr/lib/jvm/java-8-oracle/jre/bin/java
014fc000-02ebe000 rw-p 00000000 00:00 0                                  [heap]
c0000000-d0000000 rw-p 00000000 00:00 0 
d0000000-100000000 ---p 00000000 00:00 0 
100000000-1012c6000 rw-p 00000000 00:00 0 
1012c6000-140000000 ---p 00000000 00:00 0 
7ef800000000-7ef800004000 rw-p 00000000 00:00 0 
7ef800004000-7ef8000ec000 rw-p 00000000 00:00 0 
7ef8000ec000-7ef800100000 rw-p 00000000 00:00 0 
7ef800100000-7f0800000000 rw-p 00000000 00:00 0 
7f0800000000-7f1000000000 ---p 00000000 00:00 0 

표시된 마지막 두 줄이 범인인 것으로 보입니다 0x7f0800000000 - 0x7ef800100000 ≈ 68.7e9. 내가 아는 한 이것은 권한이 없는 매핑되지 않은 개인 영역입니다. 그게 내가 말할 수 있는 전부야...

답변1

색인할 수 있는 모든 파일을 매핑할 가능성이 높습니다. 수천 개의 파일이 포함된 유사한 Kafka 매핑을 본 적이 있지만 일반적으로 가상 공간이 훨씬 더 높습니다(~10x). 다음을 실행할 수 있습니다.

cat /proc/{PID}/maps

(여기서 {PID}는 Eclipse 프로세스 ID입니다.) 이 경우인지 확인하세요. 그렇다면 가상 공간이 너무 크면 인상해야 할 수도 있습니다 vm.max_map_count.sysctl

답변2

파일이 매핑될 때마다 운영 체제는 연속적인 가상 페이지 집합을 할당합니다.

나는 Java를 잘 모르지만 각각의 새 파일을 최소한 1Mb 경계(대부분 확실하게는 2Mb)에 정렬된 새 주소에 매핑할 가능성이 높습니다.

따라서 아주 작은 파일(예: 64Kb)이 메모리에 매핑되면 인접한 가상 페이지에서 2Mb의 메모리를 사용하게 됩니다. 충분히 작은 파일로 이 작업을 수행하면 기본 입력보다 훨씬 빠르게 성장하므로 잠재적으로 디스크 및 RAM보다 커질 수 있습니다.


또한 일부 디버그 모드에서 실행하면 대부분의 메모리 할당이 훨씬 커집니다. 귀하의 경우는 그렇지 않을 수도 있습니다. C/C++의 경우 Google에서 이를 수행하는 sanitizer라는 시스템을 개발했습니다. 이를 통해 메모리 오버플로(예: 블록 시작 전후 쓰기)를 감지할 수 있으며 이를 달성하기 위해 MMU를 사용합니다(예: 잘못된 위치의 메모리에 쓸 때 하드웨어 인터럽트가 발생하고 읽기가 별로 좋지 않습니다). 우수한 보호), Intel 프로세서의 버퍼는 최소 4K 제한이 필요합니다. 이러한 프로세스는 일반적으로 시작 시 20Tb와 같은 많은 양의 메모리를 사용합니다.

관련 정보