如何在读取 >50mb 文件时减少 java 堆使用?
How to reduce java heap usage when reading >50mb files?
我正在开发一个网络应用程序,它可以读取超过 50MB 的超大文件并显示它。 Java Spring 后端将使用 CXF 读取这些文件及其内容。我的问题是,在读取一个 50 兆字节的文件后,已用堆的大小增加了 500 兆字节。我将这个文件读作一个字符串,这个字符串将被发送到前端。有什么想法,技巧可以减少 Java 堆的使用吗?我尝试了 nio,spring 的资源 class,但没有任何帮助。
一个肮脏的方法是让 Spring @Controller
方法接受一个 OutputStream
或 Writer
参数——框架将提供原始输出流HTTP 响应,你可以直接写入它。这回避了内容类型管理等所有好的逻辑。
更好的方法是定义一个将从控制器方法返回的自定义类型和一个匹配的 HttpMessageConverter
,它将(例如)使用该对象中的信息打开适当的文件并写入其内容到输出流。
在这两种情况下,您都不会将文件读入RAM;您将使用单个固定大小的缓冲区将数据直接从磁盘传输到 HTTP 响应。
我正在开发一个网络应用程序,它可以读取超过 50MB 的超大文件并显示它。 Java Spring 后端将使用 CXF 读取这些文件及其内容。我的问题是,在读取一个 50 兆字节的文件后,已用堆的大小增加了 500 兆字节。我将这个文件读作一个字符串,这个字符串将被发送到前端。有什么想法,技巧可以减少 Java 堆的使用吗?我尝试了 nio,spring 的资源 class,但没有任何帮助。
一个肮脏的方法是让 Spring @Controller
方法接受一个 OutputStream
或 Writer
参数——框架将提供原始输出流HTTP 响应,你可以直接写入它。这回避了内容类型管理等所有好的逻辑。
更好的方法是定义一个将从控制器方法返回的自定义类型和一个匹配的 HttpMessageConverter
,它将(例如)使用该对象中的信息打开适当的文件并写入其内容到输出流。
在这两种情况下,您都不会将文件读入RAM;您将使用单个固定大小的缓冲区将数据直接从磁盘传输到 HTTP 响应。