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

标签 java amazon-s3 jvm netty vert.x

我有一个 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/

相关文章:

Java 以编程方式导入

java - 如果所有嵌套字段都为空,Jackson 将忽略顶级字段的序列化

java - 调试随机 SIGSEGV 崩溃

java - 区域设置 ES_PE 未正确呈现数字

android - Amazon Kindle Fire 中的应用程序问题

java - 为什么JDK的jps命令没有列出JBoss实例的进程?

java - Swiftkey 就像 Java 中的文本预测(下一个单词预测)

java - 使用startsWith() 搜索数组

java - 转换 AmazonS3 发送到 RX android observable

amazon-web-services - AWS CloudFront 使用查询字符串返回来自 S3 源的访问被拒绝