日期:2014-05-16  浏览次数:20868 次

Linux内存cached过大的原因以及出现java.lang.OutOfMemoryError问题

?

最近进行上线前的压力测试,突然有天早上上班来,发现测试服务器JAVA进程挂掉了,查找原因发现:

A fatal error has been detected by the Java Runtime Environment:
#
# java.lang.OutOfMemoryError: requested 4092 bytes for char in /BUILD_AREA/jdk6_23/hotspot/src/share/vm/utilities/stack.inlin
e.hpp. Out of swap space?
#
#  Internal Error (allocation.inline.hpp:39), pid=8116, tid=619821968
#  Error: char in /BUILD_AREA/jdk6_23/hotspot/src/share/vm/utilities/stack.inline.hpp
#
# JRE version: 6.0_23-b05
# Java VM: Java HotSpot(TM) Server VM (19.0-b09 mixed mode linux-x86 )
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp

?

这个实际上不只是物理内存不够了,可能还是硬盘不够了。差了一下机器是日志造成硬盘空间快满了,同时造成物理内存也不够了。
使用free -m used cached都很大,free 只剩下90多M了,因为cached读取缓存文件才会增大cached区,
所以 echo '' > access.log? echo '' > error.log 清空nginx log日志后硬盘空间也释放了30%,再用free -m查询内存used ,cached也释放出来了,
说明 就是因为读取并写入nginx日志文件,而日志文件过大造成cached区内存增大把内存占用完,cached主要负责缓存文件使用。同时硬盘空间也不够了。


Free中的buffer和cache:(它们都是占用内存):
buffer : 作为buffer cache的内存,是块设备的读写缓冲区
cache: 作为page cache的内存, 文件系统的cache
如果 cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的读IO 必会非常小。