有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

javaservlet中的linux内存泄漏

我试图使用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;

应答器是来自另一台服务器的缓冲读取器。我不知道为什么这会占用很多内存。这些行只有10个字符长

皱纹:无-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时是否分配了太多内存


共 (1) 个答案

  1. # 1 楼答案

    Am I running tomcat with too much memory allocated?

    。你的free命令说你的系统有1G内存,你想用5G运行Tomcat。4G交换并没有帮助,您只需要显著增加RAM。一旦完成,如果您只需要将一些文件从一个缓冲区发送到另一个缓冲区,就可以将Xmx和MaxPermSize都减少50%