【发布时间】:2018-06-18 22:37:13
【问题描述】:
我正在尝试使用 Java Servlet,但我最终使用了所有系统内存,并且 tomcat 被内核杀死并出现以下错误:
2018-06-18T17:55:49.238505+00:00 myserver kernel: Out of
memory: Kill process 26117 (java) score 247 or sacrifice child
2018-06-18T17:55:49.238937+00:00 myserver kernel: Killed
process 26117 (java) total-vm:6298824kB, anon-rss:710520kB, file-rss:0kB,
shmem-rss:0kB
2018-06-18T17:55:49.241307+00:00 myserver systemd:
tomcat.service: main process exited, code=killed, status=9/KILL
有时我必须为最终用户提供的文件很大(~200 MB)。如果我要求其中的多个,或者有时只要求一个,我会遇到上述崩溃。
case "xml":
response.addHeader("Content-Disposition","attachment;filename=\"igrfgridData.xml\"");
response.setContentType("text/xml");
String line = "";
while ((line = cResponse.readLine()) != null) {
if(!line.startsWith("comment") && !line.isEmpty())
printWriter.print(line.toLowerCase() +"\n");
}
cResponse.close();
break;
cResponse 是来自另一台服务器的缓冲读取器。我不知道为什么这应该使用非常多的内存。这些行只有 10 个字符长。
皱纹:free -m 给:
total used free shared buff/cache available
Mem: 925 416 73 3 435 323
Swap: 4095 174 3921
Tomcat 使用以下内存参数运行: -Xmx4096M -Xms4096M -XX:MaxPermSize=1024M -XX:PermSize=1024M
我在运行 tomcat 时分配了太多内存吗?
【问题讨论】:
-
如果只从上游服务器读取,还会出现这种情况吗?如果使用分块传输模式会变得更好吗?你能发布堆栈跟踪吗?
-
如果内核内存不足,告诉Java少用,例如
-Xmx3g -Xms3g。您也可以尝试升级到已删除 PermGen 的 Java 8,这样您就不必为其预留 1 GB。 -
@EJP 如何使用分块传输模式?如何获取堆栈跟踪?
-
1.
HttpURLConnection.setChunkedStreamingMode(0),但是这只适用于上游请求主体:为响应设置它将由 Tomcat 自动完成。 2. 哎呀,没有堆栈跟踪,这是内核消息,我的错误。
标签: java linux tomcat servlets out-of-memory