1、问题描述
Linux服务器cpu过高,修改堆内存配置也无法解决,日志仍在报错ORA-12155
2、问题分析及处理
这次问题出现真的是踩了很多坑折腾许久,原因还是不怎么会分析JVM内存,不会进行问题定位。中间还更换了一台应用服务器,又修改服务器的性能参数,终未解决。在排查了应用服务器和数据库配置无误后,木有办法了,请教大佬同事,最终经过一番排查后定位到有问题的那段代码,反馈给开发,开发最终确定是数据库表数据过多引起的,将数据删除后,压测通过,这个问题才算成功解决。
事后多方查找资料及验证,总结这类问题的定位方法。显然,这是个内存泄漏的问题,但因CPU刚开始异常就查看日志,此时内存还未溢出,所以并未抛出Out Of Memory的异常,程序再运行一段时间,就会内存溢出了。问题定位步骤如下:
1)top命令 实时监控CPU占用情况,当CPU慢慢升高逐渐异常之前,打印此时的堆使用情况和jstack日志;
2)Jmap -heap 进程号 打印堆使用情况,如图:
图1 堆使用情况
连续快速多打印几次,发现都是这种结果,说明Eden区对象未经过YGC,直接晋升到Old区了,说明很可能存在内存泄漏。也可使用jstat -gcutil PID 2000 1000 打印出实时GC统计信息,如图: