摘要:本文主要分析了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