Java故障記錄——OutOfMemoryError

Java故障記錄——OutOfMemoryError

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

相關文章
相關標籤/搜索