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();
结论
以后在写代码的时候一定要注意分页操作。