java - Java Servlet 中的内存泄漏

标签 java linux tomcat servlets out-of-memory

我正在尝试使用 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 是否分配了太多内存?

最佳答案

Am I running tomcat with too much memory allocated?

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

关于java - Java Servlet 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50918353/

相关文章:

java - 使用 Tomcat 将 Java 应用程序连接到数据库

java - 如何使用 Webflux 上传多个文件?

java - 如何将多个 <input type =“checkbox”/> 作为数组发送到 Java servlet?

java - Android 中如何将数据从一个页面移动到另一页面

linux - 使用 "cat > text.txt"写入文本文件时如何退格?

linux - 如何在 linux 上监控进程创建和退出以及模块加载?

linux - 在windows上查看laSTLog文件

spring - 反向代理后面的 Thymeleaf 模板(在 Spring 引导应用程序中)未正确形成 url

java - linux环境下tomcat 6.0版本共享库怎么办?

java - Servlet 加载图片/jpg 不起作用