精华内容
下载资源
问答
  • 下面小编就为大家带来一篇完美解决java读取大文件内存溢出的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • springboot大文件上传导致内存溢出,如何解决?
  • 上传文件内存溢出错误OutOfMemory

    万次阅读 2015-02-23 23:20:27
    本来以前的项目框架里已经有现成的代码了,是用的springMVC文件上传下载的框架,但是以前都传的小文件,没什么问题,这次需要上传大文件,就老是报错了。 搜索原因的时候,发现好像这套框架是网络里面流传得比较...


    最近一个项目要做大的视频文件的上传和下载。本来以前的项目框架里已经有现成的代码了,是用的springMVC文件上传下载的框架,但是以前都传的小文件,没什么问题,这次需要上传大文件,就老是报错了。


    搜索原因的时候,发现好像这套框架是网络里面流传得比较广的,也算是bug吧,所以贴出来了。


    可惜,看不到上传文件的源码,(因为源码在领导那里,他老人家太忙)。反正最后就是各种折腾,然后找到原因了的。


    原因:


    看了代码,FileManagerAction里面的上传方法,应该是先将文件传到tomcat服务器的一个临时文件里面,再通过spring包内置的FileCopyUtils.copy(srcMFile.getBytes(), descFile)方法,将它复制到所要上传到的目标文件夹去。


    这个copy方法调用了commons-fileupload包里DiskFileItem类的get()方法,其中有一句代码是

    byte[] fileData = new byte[(int) getSize()];

    而这其中的getSize()方法的返回值是上文提到的copy方法的第一个参数srcMFile.getBytes()的值,也就是整个文件的大小的字节数。以前文件比较小的时候倒没什么关系,new了一个比较小长度的byte[]还能撑住,可是文件大了的时候,就不行了,就内存溢出了。


    找到原因了要怎么解决呢,反正脑子是不够用了,所以就索性yahoo了一把。(没了谷歌,也就只有yahoo了)。然后看到了这篇问答,多少有点启发。

    http://stackoverflow.com/questions/1693810/how-can-i-avoid-outofmemoryerrors-when-using-commons-fileuploads-diskfileitem-t  


    解决办法:

    FileCopyUtils的copy方法有几个重载的方法,选择用参数为IO流的方法就不会报错。即是改为:

    FileCopyUtils.copy(srcMFile.getInputStream(),new FileOutputStream(destFile));

    就OK 了。


    问题:

    虽然这样解决了大文件上传的问题,但是因为文件比较大,copy的耗时可能会比较长,用户体验度有待改善。


    ============================================================================================

    另外,之前还遇到过一个报错SizeLimitExceedException,这个和配置文件里设置的文件大小有关系。在multipartResolver那个bean里配置的。


    搜索原因的时候,发现好像这套框架是网络里面流传得比较广的,也算是bug吧,所以贴出来了。
    展开全文
  • springboot上传文件内存溢出的可能解决办法 在springboot中上传文件时要考虑内存的情况,一般我们会通过在执行服务时加入-Xms512m -Xmx512m等参数加大堆内存,但这是指标不治本的,关键还是看代码处理的...

    springboot上传大文件时内存溢出的可能解决办法

    • 在springboot中上传大文件时要考虑内存的情况,一般我们会通过在执行服务时加入-Xms512m -Xmx512m等参数加大堆内存,但这是指标不治本的,关键还是看代码处理的时候有无导致内存泄漏的原因。
      例如:
      java -Xms512m -Xmx512m -jar rent_web-1.0.0.jar
      
    • 有时候我们会需要把上传的文件再调用其他服务进行上传,即a把文件上传给b,b再把文件上传给c,那么在中间的这个转发服务如果处理不好就会导致内存溢出。
    • 下面是导致内存溢出的代码,这里溢出的原因是RequestBody的创建用了file.getBytes(),如果你继续跟进RequestBody.create就会发现最终会调用System.arraycopy来拷贝file.getBytes(),这相当于拷贝了一份,如果本来是512M,一拷贝就变成了1024M,内存肯定吃不消,于是就抛出内存溢出。
     public ApiResult<UploadResult> storeFile(MultipartFile file) throws IOException {
          	...
          	
            String originalName= URLEncoder.encode(file.getOriginalFilename(),"utf8");
            RequestBody rb = RequestBody.create(MediaType.parse("multipart/form-data"), file.getBytes());
            MultipartBody.Part part = MultipartBody.Part.createFormData("file",originalName, rb);
            EFSService efsService = getRandEFSService();
            Response<ApiResult<UploadResult>> res = efsService.upload(part, module).execute();
         	...
        }
    
    • 经过自己实践,我的思路是先把文件存到本地临时目录(其实上传文件大小超过10KB就已经会被存在本地临时目录,但由于是私有对象不可访问,当然你高兴可以用反射获得,但既然官方不开放这样的接口,那还是不要使用反射去获取了,避免以后官方实现发现了变化,那先前的反射也就会报错了),再将file置空让gc能够回收原来MultipartFile指向的内存,这样子没有拷贝多一份数据,大文件就不会多加一倍内存而溢出了。
     public ApiResult<UploadResult> storeFile( MultipartFile file) throws IOException {
           ...
            File tempFile = File.createTempFile("video", null);
            Log.info("临时文件目录:" + tempFile.getCanonicalPath());
            file.transferTo(tempFile);
            String originalName= URLEncoder.encode(file.getOriginalFilename(),"utf8");
            file=null;//file置为null是为了告诉gc此块内存可以回收
            RequestBody rb = RequestBody.create(MediaType.parse("multipart/form-data"), tempFile);
            MultipartBody.Part part = MultipartBody.Part.createFormData("file",originalName, rb);
            EFSService efsService = getRandEFSService();
            Response<ApiResult<UploadResult>> res = efsService.upload(part, module).execute();
           ...
        }
    
    • 本人测试过程中发现上传文件有时会出现以下这个错误,重启后会消失,奇怪的是出现这个问题时下断点发现竟然都没执行到,不知在哪里就抛出了这个异常(原因暂时不详,可能是springboot上传文件用到了临时目录,而这个临时目录又很容易被系统删除)。
    Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [C:\Users\HuWeiJian\AppData\Local\Temp\tomcat.4476717864971067098.8101\work\Tomcat\localhost\ROOT] is not valid
    

    解决办法是通过

     /**
         * 自定义临时文件目录,确保目录不会被系统删除导致抛异常
         * @return
         */
        @Bean
        public MultipartConfigElement multipartConfigElement(){
            MultipartConfigFactory factory=new MultipartConfigFactory();
            String location =System.getProperty("user.dir")+tempFileDir;
            Log.info("location="+location);
            File tmpDir=new File(location);
            if(!tmpDir.exists()){
                tmpDir.mkdirs();
    
            }
            factory.setLocation(location);
            return factory.createMultipartConfig();
        }
    
    • 或者在配置文件中增加:server.tomcat.basedir: /yourDir
    • 本人能力有限,如有错误请不吝指教。

    后话

    • MultipartFile其实只是一个接口,真正实现在org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.StandardMultipartFile,
    • StandardMultipartFile里面有个javax.servlet.http.Part对象,
    • Part也是一个接口,真正实现在org.apache.catalina.core.ApplicationPart,
    • ApplicationPart里有个org.apache.tomcat.util.http.fileupload.FileItem接口和File,
    • .FileItem实现是org.apache.tomcat.util.http.fileupload.disk.DiskFileItem,File表示上传的文件(是一个临时存放文件)
    • DiskFileItem是由org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory创建出来的,
    • 从DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD = 10240可以得知如果文件大小在10KB以内,则直接放在内存,如果大于10KB,则存储在本地磁盘中(注意是存在临时目录中,意味着这个文件如果你不持久化那这个文件随时会被系统清除)

    参考

    Java中OutOfMemoryError(内存溢出)的三种情况及解决办法 - chen_lay的博客 - CSDN博客
    https://blog.csdn.net/chen_lay/article/details/52209748
    SpringBoot项目优化和Jvm调优(楼主亲测,真实有效) - 熊本同学 - CSDN博客
    https://blog.csdn.net/wd2014610/article/details/82182617

    展开全文
  • 上传接口: @RequestMapping("uploadFile") public Boolean uploadFile(@RequestParam("file") MultipartFile file) { String rootPath = System.getProperty("user.dir"); String filePath = rootPath + "/...

    背景
    最近在做公司的文件服务,遇到有关文件上传下载的内存溢出问题。导致内存溢出的原因是,上传下载时,将文件流转成了字节数组,导致程序大量使用内存。后来改成文件流方式避免了内存的溢出。

    接口实现

    上传接口:

        @RequestMapping("uploadFile")
        public Boolean uploadFile(@RequestParam("file") MultipartFile file) {
    		String rootPath = System.getProperty("user.dir");
            String filePath = rootPath + "/files/test.mp4";
            try {
                File newFile = new File(filePath);
                if (!newFile.exists()) {
                    newFile.getParentFile().mkdirs();
                    newFile.createNewFile();
                }
                // 会覆盖原文件
                file.transferTo(newFile);
                return true;
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }
    	}
    

    下载接口:

    
        @RequestMapping("downloadFile")
        public void downloadFile(HttpServletRequest request, HttpServletResponse response) {
    
    		String rootPath = System.getProperty("user.dir");
            String filePath = rootPath + "/files/test.mp4";
            
            File file = new File(filePath);
            InputStream is = null;
            if (file.exists()) {
                is = new FileInputStream(file);
            }
            
            if (is != null) {
    
                String fileName = filePath.substring(filePath.lastIndexOf('/') + 1);
    			// 设置下载文件名
                String userAgent = request.getHeader("User-Agent");
                userAgent = userAgent == null ? "" : userAgent.toLowerCase();
                // 针对IE或者以IE为内核的浏览器:
                if (userAgent.contains("msie") || userAgent.contains("trident")) {
                    fileName = URLEncoder.encode(fileName, "UTF-8");
                    fileName = fileName.replace("+", " ");
                } else {
                    fileName = new String(fileName.getBytes(), "iso-8859-1");
                }
                
                response.reset();
                response.setContentType("application/octet-stream; charset=UTF-8");
                response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");
    
                long length = is.transferTo(response.getOutputStream());
                response.addHeader("Content-Length", "" + length);
                is.close();
            } else {
                response.setContentType("text/plain;charset=UTF-8");
                response.getWriter().write("未能找到资源文件");
                response.setStatus(404);
                return;
            }
        }
    
    

    你可能感兴趣的文章:

    展开全文
  • 查看服务器文件内存溢出 内容精选换一换DNS服务器用于解析弹性文件服务中文件系统的域名。DNS服务器东北区IP地址为100.125.6.250,其它区域详情请参见华为云内网DNS地址。默认情况下,用于解析文件系统域名的DNS...

    查看服务器文件内存溢出 内容精选

    换一换

    c8a5a5028d2cabfeeee0907ef5119e7e.png

    DNS服务器用于解析弹性文件服务中文件系统的域名。DNS服务器东北区IP地址为100.125.6.250,其它区域详情请参见华为云内网DNS地址。默认情况下,用于解析文件系统域名的DNS服务器的IP地址会在创建ECS时自动配置到ECS上,不需要人工配置。除非默认的DNS服务器的IP地址被修改,导致域名解析失败,才需要配置DNS的IP地址。

    外部镜像文件在从原平台导出前,没有按照“Linux操作系统的镜像文件限制”的要求完成初始化操作,推荐您使用弹性云服务器完成相关配置。流程如图1所示。云服务器的正常运行依赖于XEN和KVM驱动,未安装会对云服务器运行时的性能产生影响,云服务器的部分功能会有缺失。请确保外部镜像文件在从原平台导出前,已安装这些驱动,否则云服务器因启动不成功而无

    查看服务器文件内存溢出 相关内容

    您需要将编译后的可执行文件拷贝到目标服务器,并构造相关输入数据,从而运行工程。对于本文档的应用示例,查看$HOME/tools/projects/Custom_Engine/main.cpp中所需输入数据如下所示:以ascend用户登录DDK所在服务器。执行如下命令,拷贝后的目录结构请见表1。cp -r $HOME/tools/proje

    弹性云服务器创建成功后,如果发现系统盘分区的容量大小和实际创建的系统盘大小不一致,可以通过手动调整系统盘分区,扩容系统盘的空白空间。扩容的方法有如下两种:将空白分区划分成新分区,并将新分区格式化后挂载到root根分区的某个目录下。具体方法请参见本节内容。将扩容的空白分区直接扩容到根分区。具体方法请参见FAQ:如何将扩容系统盘的空白分区在线

    查看服务器文件内存溢出 更多内容

    39119fac39059b64817699818002d26a.png

    DNS服务器用于解析弹性文件服务中文件系统的域名。DNS服务器东北区IP地址为100.125.6.250,其它区域详情请参见华为云内网DNS地址。默认情况下,用于解析文件系统域名的DNS服务器的IP地址会在创建ECS时自动配置到ECS上,不需要人工配置。除非默认的DNS服务器的IP地址被修改,导致域名解析失败,才需要配置DNS的IP地址。

    d57a9c4df2ad6d5977a2dea882116132.png

    远程连接Linux云服务器报错:Module is unknown修改此问题需要重启进入救援模式,请评估风险后进行操作。本节操作涉及云服务器重启操作,可能会导致业务中断,请谨慎操作。由于错误修改/etc/pam.d/目录下的文件导致。进入云服务器的单用户模式。以CentOS 7操作系统为例:重启云服务器,单击“远程登录”。按上方向键,阻止

    784dc64e49dbbf1bc7916486d97eab2c.png

    对于相同的输入,应用软件经过计算后,有相同的输出,可以将运算结果保存,在下次有相同的输入时,返回上次执行的结果。目前部分开源软件已经实现这种机制,举例如下:Nginx缓冲基于局部性原理,Nginx使用proxy_cache_path等参数将请求过的内容在本地内存建立一个副本,这样对于缓存中的文件不用去后端服务器取。基于局部性原理,Ngin

    6fc16b91fddf423fbce11d0989b79e5d.png

    该任务指导用户使用Loader将数据从SFTP服务器导入到Spark。创建或获取该任务中创建Loader作业的业务用户和密码。确保用户已授权访问作业中指定的Spark表的权限。获取SFTP服务器使用的用户和密码,且该用户具备SFTP服务器上源文件的读取权限。若源文件在导入后文件名要增加后缀,则该用户还需具备源文件的写入权限。检查磁盘空间,

    c8670e33c445c10cd2a0fcb5ca15332b.png

    当创建文件系统后,您需要使用云服务器来挂载该文件系统,以实现多个云服务器共享使用文件系统的目的。本章节以Windows 2012版本操作系统为例进行CIFS类型的文件系统的挂载。同一SFS容量型文件系统不能同时支持NFS协议和CIFS协议。已完成创建文件系统,并获取到文件系统的挂载地址。存在至少一台与文件系统所属VPC相同的云服务器。云服

    22d5e09c1bd36dc697ac56f0e92512a6.png

    在性能优化时,需要遵循一定的原则,主要有以下几个方面:对性能进行分析时,要多方面分析系统的资源瓶颈所在,如CPU利用率达到100%时,也可能是内存容量限制,导致CPU忙于处理内存调度。一次只对一个性能指标参数进行调整。分析工具本身运行可能会带来资源损耗,导致系统某方面的资源瓶颈情况更加严重,应避免或降低对应用程序的影响。调优分析思路如下:

    b7d83a2380c86c6f5139c7b0f3df6b7a.png

    该任务指导用户使用Loader将数据从HDFS/OBS导出到SFTP服务器。创建或获取该任务中创建Loader作业的业务用户和密码。确保用户已授权访问作业执行时操作的HDFS/OBS目录和数据。获取SFTP服务器使用的用户和密码,且该用户具备SFTP服务器数据导出目录的写入权限。检查磁盘空间,确保没有出现告警且余量满足导入、导出数据的大小

    631651361fa2e5698f6a9d681fb5668c.png

    从本地上传日志文件,是指从浏览器所在机器选择日志文件并上传。目前只支持选择*.log的日志文件,如果日志文件中包含其他格式文件,则导入时会提示格式错误,如图2所示,单击Upload,则只会上传*.log的日志文件。您若要选择多个文件,直接选择多个文件即可,每次导入最大可选择50个文件,如图3所示。选择多个文件日志文件上传成功后,在File

    8eb70d4a37fe864f82daefa0aeaaa61c.png

    从本地上传日志文件,是指从浏览器所在机器选择日志文件并上传。目前只支持选择*.log的日志文件,如果日志文件中包含其他格式文件,则导入时会提示格式错误,如图2所示,单击Upload,则只会上传*.log的日志文件。您若要选择多个文件,直接选择多个文件即可,每次导入最大可选择50个文件,如图3所示。选择多个文件日志文件上传成功后,在File

    4a3dbebf52c74fe713408ff26033c570.png

    本章节介绍镜像服务产品功能的使用限制。云服务器因欠费而处于冻结状态,此时无法创建私有镜像,您必须先续费,解冻资源后再进行创建。通过x86 CPU架构的云服务器创建的私有镜像,不能用于创建鲲鹏CPU架构的云服务器,也不能在鲲鹏CPU架构云服务器切换操作系统时使用。通过外部镜像文件创建私有镜像时,若架构类型选择“x86”,则该私有镜像不能用于

    b80c406dd1bff1336ad2b20072f4b1ca.png

    本节操作介绍本地MacOS系统主机通过安装“Microsoft Remote Desktop for Mac”工具向Windows云服务器传输文件的操作步骤。本地主机已安装Microsoft Remote Desktop for Mac或其他Mac OS系统适用的远程连接工具。下载Microsoft Remote Desktop for

    展开全文
  • 完美解决java读取excel内存溢出问题,希望可以帮到大家
  • 图片上传,是网站开发常见的需求。... 好吧,大家都知道,这是内存溢出了。完事我们修改配置文件中的相关参数来解决,成效很明显,大部分情况下我们完事了,成功了。但是不知道大家注意没,它默认的上传限制...
  • 每次我上传带有部分数据的excel时,上传文件都会损坏,并且我无法在aspose工作簿中使用此上传文件(在某些情况下它也可以工作,我不知道为什么)。 甚至在我打开的同时,excel也会显示损坏的文件消息。 这是片段...
  • 今天小编就为大家分享一篇解决Java导入excel大量数据出现内存溢出的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 上传文件内存溢出,因为在上传文件时,将文件读入了内存中,文件过大时导致了内存溢出。 因为httpServletRequest中的流只能读取一次的原因 如果在拦截器中需要对post参数进行处理的话,就会报Required request ...
  • 分虽然多了点,但是项目...图片过大内存溢出:在图片读取是处理里图片,解决了溢出问题 项目下载后,直接导入就可以运行,是2.2的版本,有个插件android-async-http-1.4.4.jar,可能要配置下,还有服务器,端口是8080
  • 解决方法:httpConnection.setChunkedStreamingMode(0);//不使用HttpURLConnection的缓存机制,直接将流提交到服务器上。
  • 记录一下生产环境上传文件 发生的一次内存溢出问题 管理平台在上传 大文件时抛出错误 OOM异常(jvm 内存溢出,就是内存不够用了),除了上传文件以外,其它操作没有什么问题 经过排查发现,后端controller接口 ...
  • 尝试在服务器文件夹中上传多个文件,文件名在数据库中,但是服务器抛出以下错误-HTTP状态500类型例外报告信息描述服务器遇到内部错误(),导致服务器无法满足此请求。例外java.io.IOException:java.io....
  • 上传功能一直很正常,直到上传了个500多兆的文件,报错提示: “System.OutOfMemoryException”类型的异常在 mscorlib.dll 中发生,但未在用户代码中进行处理 对于内部用途和新的托管对象,确保要有足够的内存可.....
  • 我试图将大文件上传到服务器(支持的最大文件大小为128Mb)。 如果我正确理解,则服务器可以接收大文件(例如500Mb),但前提是这些文件以块发送。 我写了下面的方法,希望它可以将视频文件分块上传到服务器。 但是,我...
  • 最近在学习python的过程中接触到了python对文件的读取。python读取文件一般情况是利用open...但是如果是将一个10G大小的日志文件读取,即文件大于内存的大小,这么处理就有问题了,会造成MemoryError ... 也就是发生...
  • 项目中由于用到附件上传,在提交测试时发现文件附件过大导致java虚拟机内存溢出,就在后台添加限制 fileupload.getSize(); if(fileupload.getSize()&amp;amp;gt;1024*1024*10){ result.setCode(StatusCode...
  • HttpURLConnection上传文件内存溢出

    千次阅读 2019-06-14 09:08:02
    最近在做一个HttpURLConnection上传问题发现上传时,发现上传速度非常快,但是很快内存溢出。 查HttpURLConnection api发现其有缓存机制,数据并没有实时发送到网络,而是先缓存再发送,导致内存溢出。 解决办法:...
  • set_time_limit(0);//去除请求时间限制 ini_set('memory_limit', '-1');//配置临时内存上限,防止内存不足 注意代码位置最好防止逻辑代码前面,因为请求数据过大,数据库也会内存不足
  • 最近在做一个HttpURLConnection上传问题发现上传时,发现上传速度非常快,但是很快内存溢出。 查HttpURLConnection api发现其有缓存机制,数据并没有实时发送到网络,而是先缓存再发送,导致内存溢出。 解决办法:...
  • 利用SpringMVC下载大文件内存溢出的处理 文件上传和下载是Web系统中的一个很普通的功能,实现的方式也有很多种,如利用java.io下面的各种IO类自己实现,或者利用Commons IO1包中的FileUtils、IOUtils类中封装好...
  • 对我来说很好class VideoStream{private $path = "";private $stream = "";private $buffer = 102400;private $start = -1;private $end = -1;private $size = 0;function __construct($filePath){$this->...
  • 今天模拟一些数据,需要将一些大文件我用的是755M(可以更大)...貌似Mysql 的JDBC总是先将stream中的数据读成byte[]然后再往数据库中存,所以总是内存溢出,不知哪位高人可有解决方案?!我的代码:ApplicationCont...
  • C# 上传文件(防止内存溢出

    千次阅读 2015-05-27 21:09:53
    上传文件,之前使用WebClient的上传方法,UploadFile方法容易造成内存溢出,UploadData方法又一直没搞定,所以借鉴下网友的方法 文章主要内容源自...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,060
精华内容 8,824
关键字:

文件上传造成内存溢出

友情链接: EbookofLisp.rar