最近进行上线前的压力测试,突然有天早上上班来,发现测试服务器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 必会非常小。