前言
早上九点多,群里说生产上出现OOM,也定位到了出现异常的代码,读取Excle导致的,问了Excle里面有六万多条数据,生产上先加大了堆内存然后重启服务
问题确定
因为我们已经能大概确定问题代码了,但是我们还是想确认一下
登录服务器,首先要查找到对应的java进程
ps -ef|grep java
发现服务启动的参数类似下面的,生产设置的堆内存最大为512M
-Xms50m -Xmx50m -XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=C:\Users\xxx\Desktop\temp
这就很舒服了,根据HeapDumpPath找到对应hprof,生成的hprof文件例如:java_pid9436.hprof,如果多个java进程的hprof文件都在一个目录下的话,要根据对应java进程的pid来获取到hprof文件
如果启动没有设置**-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:\Users\xxx\Desktop\temp**
因为这里已经能定位到问题,可以在本地上模拟出来,设置好启动的JVM参数就好了
这里借助MAT这一类的分析工具
可以看到有个超级大的对象占用了421.9M的内存