Java故障记录——OutOfMemoryError

Java故障记录——OutOfMemoryError

摘要:本文主要分析了OutOfMemoryError的产生原因。

没有分页导致占用大量内存

查看进程

使用 jps 命令查看当前运行的Java进程和进程号:

1 [root@VM_40_24_centos ~]# jps
2 25953 Bootstrap
3 7832 Jps

根据进程号查看实例的运行情况

使用 jmap 命令查看当前占用内存最高的实例:

 1 [root@VM_40_24_centos ~]# jmap -histo:live 25953 | grep 'xxx.xxx' | head -10
 2    4:        784043       75268128  xxx.xxx.XxxXxxxxx
 3   19:         15435         987840  xxx.xxx.Xxxx
 4   48:          2000         208000  xxx.xxx.Xxx
 5   52:           451         180400  xxx.xxx.XxxxXxx
 6  111:           646          51680  xxx.xxx.XxxXxxxxx
 7  316:           104           9984  xxx.xxx.XxxXxxxxxXxxx
 8  476:           282           4512  xxx.xxxxxxx.XxxxxxxXxxxxxxxxx
 9  496:           267           4272  xxx.xxxxxxx.XxxxxxxXxxxxxxxxxxxxxxXxxxxxxx
10  877:            47            752  xxx.xxxxxxx.XxxxxXxxxxxxxxxxXxxxxxxx
11  878:            47            752  xxx.xxxxxxx.XxxxxxXxxxXxxxxxxxxXxxxxxxxXxxxxxxxx

在日志里找到第一次出现的地方

根据在Linux中找到的占用内存的实例,去日志查看是因为什么操作导致的:

1 2019-06-15 10:34:35.398  INFO 10369 --- [askExecutor-818] c.i.ide.engine.task.XxxxXxxxxxXxxx   : send message is success!
2 Exception in thread "http-nio-8080-Acceptor-0" java.lang.OutOfMemoryError: GC overhead limit exceeded
3     at java.nio.ByteBuffer.allocate(ByteBuffer.java:335)
4     at org.apache.tomcat.util.net.SocketBufferHandler.<init>(SocketBufferHandler.java:41)
5     at org.apache.tomcat.util.net.NioEndpoint.setSocketOptions(NioEndpoint.java:404)
6     at org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:502)
7     at java.lang.Thread.run(Thread.java:748)

查看代码

根据日志文件和实例名称,查看相关代码,发现是因为查询数据的时候没有分页,导致查询了全部数据,大概有一百万条:

1 List<XxxXxxxxx> xxx = service.listXxx();

结论

以后在写代码的时候一定要注意分页操作。

点赞