【问题标题】:How to reduce java heap usage when reading >50mb files?读取> 50mb文件时如何减少Java堆使用量?
【发布时间】:2015-08-02 19:56:26
【问题描述】:

我正在开发一个网络应用程序,它可以读取 > 50MB 的超大文件并显示它。 Java Spring 后端将使用 CXF 读取这些文件及其内容。我的问题是,在读取一个 50 兆字节的文件后,已用堆的大小增加了 500 兆字节。我将此文件作为字符串读取,此字符串将被发送到前端。有什么想法,技巧如何减少Java堆的使用?我尝试了 spring 的 Resource 类 nio,但没有任何帮助。

【问题讨论】:

  • 您是否尝试过操纵虚拟机选项?
  • 如果您只是读取文件并将其发送到前端,那么要么使其静态可访问,要么使用读写循环而不是填充字符串。如果没有,那么您需要发布您的程序的要点,以便我们了解您的问题。

标签: java spring file-io heap-memory


【解决方案1】:

一个肮脏的方法是让 Spring @Controller 方法接受 OutputStreamWriter 参数 - 框架将提供 HTTP 响应的原始输出流,您可以直接写入它。这回避了内容类型管理等所有好的逻辑。

更好的方法是定义一个从控制器方法返回的自定义类型和一个匹配的HttpMessageConverter,它将(例如)使用该对象中的信息打开适当的文件并将其内容写入输出流。

在这两种情况下,您都不会将文件读入 RAM;您将使用单个固定大小的缓冲区将数据直接从磁盘传输到 HTTP 响应。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 2020-03-31
    • 1970-01-01
    • 2017-08-21
    • 2016-04-25
    相关资源
    最近更新 更多