我正在运行一个现场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
,令人惊讶的是缓存根本没有下降,但命令成功完成。
我删除了大量旧日志(从 aufs / 应该在 RAM 中),运行命令来清除缓存 - 仍然什么也没有。
文件系统的其余部分仅占用约 9Gb。如何强制清除缓存?
答案1
您有 19GB 的可用 RAM 供程序使用。无需清除磁盘缓存:如果系统需要内存用于其他目的(例如运行程序),系统将回收它。通过清除磁盘缓存唯一可以做的就是让你的机器变慢。
磁盘空间无关。删除文件对你没有帮助。
您有 19GB RAM,但程序声称无法分配 26MB。计算一下:26MB < 19GB。这是程序中的一个错误,无论是在分配内存的方式上还是在报告错误的方式上。检查/tmp/hs_err_pid50274.log
一下是否有更多线索。
答案2
Shmem: 19327344 kB
您有 19GBtmpfs
或其他共享内存对象。
经常是这样tmpfs
。查看df -h -t tmpfs
。
System V 共享内存可以通过 来显示ipcs -m
。
一些(但不是全部)其他共享内存可以通过扫描找到/proc
。我的回答中有一个小Python脚本:我可以看到分配为 GEM 缓冲区的内存量吗?
编辑:就您而言,您可能有一些东西打开了已删除的文件。这意味着空间使用情况将显示在 中df
,但不会显示在 中du
。可以扫描/proc/
已删除的文件...我没有这样方便的脚本,但也许您可以这样做,并使用的命令ls -lR /proc | less
搜索字符串。您似乎可能会看到已删除的日志文件仍被某些进程保持打开状态。(deleted)
/
less