나는라이브 CDLinux 배포판에서 메모리 부족 예외가 발생했습니다.
>java -version
#Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000646e00000, 264241152, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 264241152 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /tmp/hs_err_pid50274.log
free -m
명령을 실행 하면 ~250Mb의 여유 RAM과 캐시에 사용된 19GB가 표시됩니다.
>free -m
total used free shared buffers cached
Mem: 24128 23827 301 0 15 18929
-/+ buffers/cache: 4881 19247
Swap: 0 0 0
메모리 덤프는 다음과 같습니다.
--------------- S Y S T E M ---------------
OS:RapidLinux 20151103
uname:Linux 3.18.22 #1 SMP Fri Oct 9 19:28:11 UTC 2015 x86_64
libc:glibc 2.21 NPTL 2.21
rlimit: STACK 8192k, CORE infinity, NPROC 96487, NOFILE 4096, AS infinity
load average:2.08 1.73 1.30
/proc/meminfo:
MemTotal: 24708040 kB
MemFree: 307572 kB
MemAvailable: 173696 kB
Buffers: 15612 kB
Cached: 19383916 kB
SwapCached: 0 kB
Active: 3784768 kB
Inactive: 19327244 kB
Active(anon): 3742084 kB
Inactive(anon): 19303520 kB
Active(file): 42684 kB
Inactive(file): 23724 kB
Unevictable: 15016 kB
Mlocked: 15016 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 96 kB
Writeback: 0 kB
AnonPages: 3727472 kB
Mapped: 55972 kB
Shmem: 19327344 kB
Slab: 671580 kB
SReclaimable: 116376 kB
SUnreclaim: 555204 kB
KernelStack: 23664 kB
PageTables: 24588 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 12354020 kB
Committed_AS: 28666748 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 738156 kB
VmallocChunk: 34346400260 kB
HardwareCorrupted: 0 kB
AnonHugePages: 0 kB
DirectMap4k: 11748 kB
DirectMap2M: 2072576 kB
DirectMap1G: 23068672 kB
Memory: 4k page, physical 24708040k(307572k free), swap 0k(0k free)
온전성 검사를 실행하여 캐시 지우기를 시도했는데 sync ; echo 3 | sudo tee /proc/sys/vm/drop_caches
놀랍게도 캐시가 전혀 다운되지 않았지만 명령이 성공적으로 완료되었습니다.
RAM에 있어야 하는 aufs/에서 오래된 로그를 삭제하고 캐시를 지우는 명령을 실행했지만 여전히 아무것도 없습니다.
나머지 파일 시스템은 약 9GB만 차지합니다. 캐시를 강제로 지우는 방법은 무엇입니까?
답변1
프로그램에서 사용할 수 있는 여유 RAM은 19GB입니다. 디스크 캐시를 지울 필요가 없습니다. 시스템이 다른 목적(예: 프로그램 실행)을 위해 메모리가 필요한 경우 시스템은 이를 회수합니다. 디스크 캐시를 지워서 할 수 있는 유일한 일은 컴퓨터 속도를 느리게 만드는 것입니다.
디스크 공간은 중요하지 않습니다. 파일을 삭제해도 도움이 되지 않습니다.
19GB의 RAM이 있지만 프로그램에서는 26MB를 할당할 수 없다고 주장합니다. 계산해 보세요: 26MB < 19GB. 이는 메모리가 할당되는 방식과 오류가 보고되는 방식 모두에서 프로그램의 버그입니다. /tmp/hs_err_pid50274.log
혹시 더 많은 단서가 있는지 확인해보세요 .
답변2
Shmem: 19327344 kB
tmpfs
19GB 또는 기타 공유 메모리 개체 가 있습니다 .
이런 경우가 종종 있습니다 tmpfs
. 확인하다 df -h -t tmpfs
.
System V 공유 메모리는 를 통해 표시할 수 있습니다 ipcs -m
.
를 스캔하면 일부(전부는 아님) 다른 공유 메모리를 찾을 수 있습니다 /proc
. 내 대답에는 작은 Python 스크립트가 있습니다.GEM 버퍼로 할당된 메모리 양을 확인할 수 있나요?
편집: 귀하의 경우 삭제된 파일을 여는 것이 있을 수 있습니다. 이는 공간 사용량이 에는 표시되지만 df
에는 표시되지 않음을 의미합니다 du
. 삭제된 파일을 검색하는 것이 가능합니다 /proc/
. 이에 대한 편리한 스크립트는 없지만 그렇게 하고 ls -lR /proc | less
명령을 사용하여 문자열을 검색할 수 있을 것입니다. 일부 프로세스에 의해 삭제된 로그 파일이 여전히 열려 있는 것을 볼 수 있는 것 같습니다.(deleted)
/
less