【问题标题】:Java heap space error, delegating a stream in a jax-rs responseJava 堆空间错误,在 jax-rs 响应中委派流
【发布时间】:2021-03-12 10:01:03
【问题描述】:

在我们的系统中,我们调用的是 S3 服务器的后端。并尝试通过 java 服务将文件流式传输到客户端。问题是对于大文件(> 2 GiB),我们得到一个 java 堆错误。该流适用于较小的文件,但不适用于最大的文件。我们正在使用 minio 客户端获取数据,然后在响应中将其流式传输。

    final InputStream is = s3client()
            .getObject(GetObjectArgs.builder().bucket(bucket)
                    .object(path).build());
    StreamingOutput fileStream = output -> {
        try {
            int nRead;
            byte[] data = new byte[8 * 1024];
            while ((nRead = is.read(data)) != -1) {
                output.write(data, 0, nRead);
            }
            is.close();
            output.flush();
        } catch (IOException e) {
            throw new WebApplicationException("IOException while streaming data!", e);
        }
    };
    return Response
            .ok(fileStream, contentType)
            .build();

我不认为数据应该提供堆空间错误,因为我们(希望在我看来)正在覆盖 while 循环中所有条目的分配。所以我想知道隐藏的输出或输入流中是否存在增加堆空间的东西。

【问题讨论】:

  • 您确定问题出在 S3 部分而不是您的输出吗??
  • @MrR:我目前还不确定。当我在 chrome 中测试常规 Web 窗口中的链接时会发生错误,这可能意味着它没有正确使用输出。我只是难倒atm。因为我认为一旦接收客户端在响应中调用写入,写入就开始了。
  • 什么是output - 如果它在内存中,您正在将一个完整的内容写入内存..如果它是 2GiB 文件大小并且您的虚拟机没有分配足够的堆,您将收到一个堆外错误。

标签: java jax-rs streaming minio


【解决方案1】:

所以这是我在胡思乱想。我没有使用流,而是在返回之前尝试写入文件的另一个函数。那时堆会严重死亡是有道理的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 2013-07-26
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多