现象
策划反应服务器进不去,远程看了一下进程消失了(crash),有时候也会出现能登录,但是无法执行操作(进程还在),无法被正常shutdown,进程根目录下出现了java_pid16298.hprof
文件,一看到就是内存溢出了,觉得奇怪,应该不会是堆内存溢出,因为人数不多,初步怀疑是永久区溢出(Java8#Metaspace),下面果然得到验证,因为启动参数加了-XX:+HeapDumpOnOutOfMemoryError
,还出现了hs_err_pid.log
,即JVM致命错误日志。
日志查询(vim/grep/less/more)
-
vim std.log
esc /OutOfMemoryError ?OutOfMemoryError
n/N 下一个 -
less std.log | grep OutOfMemoryError
Caused by: java.lang.OutOfMemoryError: Metaspace -
grep OutOfMemory std.log -A 50 -B 50 | less
/OutOfMemoryError n 下一个 q退出 -
less std.log
出现冒号 /OutOfMemoryError 搜索 q退出 也可以?OutOfMemoryError -
more std.log
/OutOfMemoryError 搜索 q退出 只能/Caused by: java.lang.OutOfMemoryError: Metaspace at java.lang.ClassLoader.defineClass1(Native Method) ~[na:1.8.0_40] at java.lang.ClassLoader.defineClass(ClassLoader.java:760) ~[na:1.8.0_40] at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) ~[na:1.8.0_40] at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) ~[na:1.8.0_40] at java.net.URLClassLoader.access$100(URLClassLoader.java:73) ~[na:1.8.0_40] at java.net.URLClassLoader$1.run(URLClassLoader.java:368) ~[na:1.8.0_40] at java.net.URLClassLoader$1.run(URLClassLoader.java:362) ~[na:1.8.0_40] at java.security.AccessController.doPrivileged(Native Method) ~[na:1.8.0_40] at java.net.URLClassLoader.findClass(URLClassLoader.java:361) ~[na:1.8.0_40] at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_40] at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_40]
从日志输出上看是: Metaspace内存溢出,我这边启动参数设置的大小是48M-XX:MaxMetaspaceSize=48m
从致命日志的输出看:也是jvm在Metaspace::allocate时出现了致命错误Metaspace used 47519K
, capacity 48950K
, committed 49152K
, reserved 1093632K
…也能看到类似日志 发现确实