gpt4 book ai didi

java - 使用 Vert.x 和 Netty 下载大文件时如何处理直接内存不足的情况?

转载 作者:行者123 更新时间:2023-12-02 09:08:08 24 4
gpt4 key购买 nike

我有一个 Vert.x Web 服务,偶尔会从 AWS S3 下载大型 ZIP 文件。下载后,存档将被解压缩,各个文件将重新上传到 AWS S3。该 Web 服务作为 t2.large(8GB 内存)实例托管在 AWS Elastic Beanstalk 中。 Java 应用程序当前配置有 2-4GB 的堆空间,ZIP 文件的大小最多为 10GB(但大多数最多接近 2-4GB)。

当应用程序尝试下载大小 >2GB 的 ZIP 文件时,ZIP 文件的初始下载或单个文件的重新上传总是失败,并出现类似于以下内容的堆栈跟踪:

原因:io.netty.util.internal.OutOfDirectMemoryError:无法分配 16777216 字节的直接内存(已使用:1895825439,最大值:1908932608)

经过一些研究,Vert.x 似乎使用 Netty 来加速网络 I/O,而网络 I/O 又利用直接内存来提高下载性能。看来直接内存没有足够快地释放,这导致了如上所述的内存不足异常。

最简单的解决方案是将实例大小增加到 16GB t2.xlarge 并在运行时分配更多直接内存(例如 -XX:MaxDirectMemorySize),但是我想先探索其他解决方案。有没有办法以编程方式强制 Netty 在不再使用直接内存后释放它?我可以添加额外的 Vert.x 配置来缓解这个问题吗?

最佳答案

请检查一下

github.com/aws/aws-sdk-java-v2/issues/1301

we have identified an issue within the SDK where it could cause excessive buffer usage and eventually OOM when using s3 async client to download a large object to a file. The fix #1335 is available in 2.7.4. Could you try with the latest version? Feel free to re-open if you continue to see the issue. " – AWS PS 21 hours ago Delete

关于java - 使用 Vert.x 和 Netty 下载大文件时如何处理直接内存不足的情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59635078/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com