下载大文件时内存溢出情况分析解决

基于SpringBoot和阿里的OSS实现了一个下载文件的功能。

大概原理是这样的:

用户请求下载资源,服务端接收到请求之后从OSS中将用户需要的资源捞出来,然后以流的方式写给客户端。

遇到一个这样的问题:

下载小文件没有问题,在超过100M左右时会报错org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.OutOfMemoryError: Java heap space

猜想

1、怀疑可能是资源没有关闭造成(不是)
2、堆配置太小(治标不治本)
3、代码问题(原因)

排查过程:

首先观察发送请求,请求下载一个大文件(2G);此时使用JavaVisualVM观察内存情况,会直观的看到有个byte数组的大小直线上升;
请求前:
在这里插入图片描述
可以看到byte[]仅占内存2%左右;
请求后:
在这里插入图片描述
可以看到byte[]数组内存占用达到了90%左右;

确定是这个数组的问题,检查代码,可以看到在代码中的做法是先将请求的文件从OSS中拿到,然后赋值给一个InputStream流

...
  // 从oss对象上获取文件内容
  InputStream is = ossObject.getObjectContent();
...

然后将is流中的内容再写到OutputStream实现类的输出流中

...
   os.write(buffer, 0, bytesRead);
...

最后将输出流中的内容通过OutputStream实现类的toByteArray()方法转换成字节数组;然后返回给客户端

...
   byte[] fileOut = os.toByteArray();
   return fileOut;
...

经过检查确定是byte数组的问题,当OSS中文件太大时byte数组的大小会持续顶内存,直到GC处理不过来,抛出 Handler dispatch failed; nested exception is java.lang.OutOfMemoryError: Java heap space异常。

解决

去掉中间变量,直接从Response中获取OutputStream流对象;从OSS中获取到文件之后直接通过从Response中获取OutputStream流对象写给客户端;这样我们的服务端只相当于提供了一个通道功能,我们服务端只负责通道的对接,而不用做文件的中转站,大大节省服务器资源;也解决了标题中的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/349507.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言刷题系列】水仙花数的打印及进阶

1.水仙花数问题 水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number) 水仙花数是指一个 3 位数&a…

去中心化人工智能迸发应用潜力,或给 Web3 带来无限畅想

​ 原文:https://www.caseycaruso.com/thoughts/decentralized-ai 作者:Casey|Paradigm 投资合伙人 编译:TinTinLand 编者注:本文对于去中心化 Web3 技术和人工智能领域之间的交叉应用进行了梳理,并列举了…

springboot130社团管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考, 不得用于商业或者非法用途,否则,一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

什么是框架 确定伦敦金的框架为何重要?

在伦敦金投资中,我们要进行分析或者交易,都要将伦敦金走势置于一个框架内。什么才是框架呢?笔者认为,在当前伦敦金走势的上方和下方画出支撑阻力位,这就是框架。但我们要注意框架得能够立得起来,那才算是好…

理顺 QR 分解算法

咱们网站的这个公式编辑器,估计是后台生成图片后贴回来的,固定分辨率而且分辨率不高。 还不如先离线 latex 生成 pdf 后再截图上来 1. Why QR When A and b are known, to solver the minimization of , where . The reduction of A to various canoni…

Spring5学习笔记

Spring5 框架概述IOC(Inversion Of Control)IOC基本过程:IOC接口(BeanFactory)IOC接口实现类IOC操作Bean管理一、什么是Bean管理?二、什么是DI?三、Bean管理的两种实现方式1.基于XML配置文件方式实现基于XML方式创建对象基于XML方式注入属性常规属性注入特殊属性值的注入…

文本检索性能提升 40 倍,Apache Doris 倒排索引深度解读

在 OLAP 领域,Apache Doris 已成为高性能、高并发以及高时效性的代名词。在面向海量数据的复杂查询需求时,除硬件配置、集群规模、网络带宽等因素外,提升性能的核心在于如何最大程度地降低 SQL 执行时的 CPU、内存和 IO 开销,而这…

记 Rxjava zip操作符遇到的问题

在项目中遇到了类似下面这样的代码 本意是希望当zip操作符中三个Observable执行完毕之后,将他们返回的数据统一进行处理 Observable.zip(startFirst(), startSecond(), startThird(),(first, second, third) -> {Log.i("Rxjava", "handle all dat…

外包干了一个月,技术退步明显。。。。。

先说一下自己的情况,本科生,19年通过校招进入南京某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

基于springboot+vue旅游网站

摘要 旅游网站的开发是一个综合性的项目,涉及到前端和后端的技术,而基于Spring Boot和Vue.js的组合是一种常见的选择,因为它们可以很好地配合,提供高效且现代化的开发体验。首先,我们使用Spring Boot作为后端框架。Spr…

编码神仙插件Machinet AI GPT-4 Chat and Unit Tests

最近发现一个神仙插件Machinet AI GPT-4 Chat and Unit Tests,支持多个编译器安装使用。 我下载安装到Android Studio上,不需要登录直接可以使用。 可以直接提问,支持中文。

Ansible自动化运维(三)Playbook 模式详解

👨‍🎓博主简介 🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 🐋 希望大家多多支…

H.264与H.265的主要差异

H.265仍然采用混合编解码,编解码结构域H.264基本一致, H.265与H.264的主要不同 编码块划分结构:采用CU (CodingUnit)、PU(PredictionUnit)和TU(TransformUnit)的递归结构。 并行工具:增加了Tile以及WPP等并行工具集以提高编码速…

【数据结构和算法】--- 二叉树(4)--二叉树链式结构的实现(2)

目录 一、二叉树剩余函数1.1二叉树的层序遍历1.2判断二叉树是否为完全二叉树1.3二叉树销毁 二、二叉树的构建及遍历OJ题 一、二叉树剩余函数 1.1二叉树的层序遍历 层序遍历: 除了先序遍历、中序遍历、后序遍历外,还可以对二叉树进行层序遍历。设二叉树…

GoZero微服务个人探究之路(九)api文件编写总结

参考来源go-zero官方文档https://go-zero.dev/docs/tutorials 前言 go-zero是目前star最多的go语言微服务框架,api 是 go-zero特殊的语言,类型文件,go-zero自带的goctl可以通过.api文件生成http服务代码 api文件内容编写 不可使用关键字 …

webug存在的越权漏洞-水平越权以及垂直越权的漏洞复现(超详解)

越权漏洞-webug、 1.登录 账号:admin 密码:admin 2.进入逻辑漏洞 3.进入越权修改密码靶场 (1)输入账号密码 进入进去会发现没有权限进入 方法一: 这里我们只需要将 127.0.0.1:8080/control/a/auth_cross/cross_a…

小迪安全23WEB 攻防-Python 考点CTF 与 CMS-SSTI 模版注入PYC 反编译

#知识点: 1、PYC 文件反编译 2、Python-Web-SSTI 3、SSTI 模版注入利用分析 各语言的SSIT漏洞情况: SSIT漏洞过程: https://xz.aliyun.com/t/12181?page1&time__1311n4fxni0Qnr0%3DD%2FD0Dx2BmDkfDCDgmrYgBxYwD&alichlgrefhtt…

Angular响应式表单表单验证触发另一个字段校验

Angular响应式表单校验联动 前言表单字段日期校验函数效果 前言 在某些业务场景中,校验某表单字段的同时也需要校验另外一个与之相关的字段,例如开始时间和结束时间,要求结束时间必须晚于开始时间。在angular 响应式表单中改如何实现该需求呢…

云组态监控平台:开启智能监控新时代

在数字化浪潮中,物联网技术正逐渐成为各行业转型升级的核心驱动力。而云组态监控平台作为物联网技术的重要组成部分,正在开启智能监控的新时代。HiWoo Cloud的云组态监控平台,凭借其强大的功能和创新能力,致力于推动智能监控技术的…

uniapp app更新

uniapp app更新 这个版本要随之增加,不然刚更新时直接用app, 新包增加的那些页面跳转会有问题,不能跳新的页面 //app更新检测 updataApp(){const that this;uni.showLoading({title:加载中...})plus.runtime.getProperty(plus.runtime.appid, functio…