解决服务器进程退出问题(metaspace溢出)实战

本文详细记录了服务器进程因Metaspace溢出导致的问题,通过日志分析确认了问题原因,主要涉及到Fastjson和Lambda表达式生成的内部类。通过使用jvisualvm和MAT工具,发现反射调用频繁和Lambda表达式的内部类生成过多。解决方案是增加Metaspace大小,并优化使用Lambda和反射的场景,避免内存泄漏。
摘要由CSDN通过智能技术生成

现象

策划反应服务器进不去,远程看了一下进程消失了(crash),有时候也会出现能登录,但是无法执行操作(进程还在),无法被正常shutdown,进程根目录下出现了java_pid16298.hprof文件,一看到就是内存溢出了,觉得奇怪,应该不会是堆内存溢出,因为人数不多,初步怀疑是永久区溢出(Java8#Metaspace),下面果然得到验证,因为启动参数加了-XX:+HeapDumpOnOutOfMemoryError,还出现了hs_err_pid.log,即JVM致命错误日志。

日志查询(vim/grep/less/more)

  1. vim std.log
    esc /OutOfMemoryError ?OutOfMemoryError
    n/N 下一个

  2. less std.log | grep OutOfMemoryError
    Caused by: java.lang.OutOfMemoryError: Metaspace

  3. grep OutOfMemory std.log -A 50 -B 50 | less
    /OutOfMemoryError n 下一个 q退出

  4. less std.log
    出现冒号 /OutOfMemoryError 搜索 q退出 也可以?OutOfMemoryError

  5. 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 47519Kcapacity 48950Kcommitted 49152Kreserved 1093632K…也能看到类似日志 发现确实

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值