摘要:本文主要分析了OutOfMemoryError的产生缘由。java
使用 jps 命令查看当前运行的Java进程和进程号:apache
1 [root@VM_40_24_centos ~]# jps 2 25953 Bootstrap 3 7832 Jps
使用 jmap 命令查看当前占用内存最高的实例:centos
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中找到的占用内存的实例,去日志查看是由于什么操做致使的:tomcat
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)
根据日志文件和实例名称,查看相关代码,发现是由于查询数据的时候没有分页,致使查询了所有数据,大概有一百万条:ide
1 List<XxxXxxxxx> xxx = service.listXxx();
之后在写代码的时候必定要注意分页操做。spa