在java中上传文件出现内存溢出怎么解决

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在java中上传文件出现内存溢出怎么解决相关的知识,希望对你有一定的参考价值。

当我在做上传的时候,文件超过20兆左右,就会报java.lang.OutOfMemoryError内存溢出的错误,请问一下该怎么解决呢?麻烦高手前来

具体问题具体处理。
你最起码应该说明是哪种数据库
是用JDBC还是ODBC还是hibernate。

一般这种情况都是分批插入。

每个会话插入50条,然后关闭,再重新做一次连接。
然后再插。
或者中间多做几次commit
参考技术A 服务器是什么tomcat?程序没有问题的话,把JVM开大点.JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true 参考技术B SmartUpload只适合用于小文件的上传,在上传大文件时,失败的概率很高.
我想知道楼主现在采用的什么上传方式.

我在做上传的时候使用的是org.apache.common.FileUpload,效果还可以.
不过我的系统中的文件也不太大.楼主可以尝试一下
参考技术C 将服务器内存调大些。 参考技术D 大文件上传不用http这种方式,而是使用ftp方式上传

Java 出现内存溢出的定位以及解决方案

在上一节中Java虚拟机内存分布   说了Java虚拟机中分为五个区域,而且也知道了在Java程序计数器区域不会出现OOM(OutOfMemeryError),那么以下就对除了程序计数器以外的四个区域出现OOM的原理以及解决方案进行解说。


1.Java虚拟机栈与本地方法栈

栈的大小控制參数时 -Xss。

Java虚拟机在栈中定义了两种异常,StrackOverFlowError和OutOfMemeryError。当请求栈的深度大于java虚拟机所同意的最大深度则抛出StrackOverFlowError;假设Java虚拟机在栈扩展时。没有申请到足够的空间时,则抛出OutOfMemeryError。

StrackOverFlowError:Java虚拟机在执行中,调用方法时,都要创建栈帧,当栈的空间不够时就会产生StrackOverFlowError。那么相应的解决方法就仅仅能是调节-Xss參数,或者降低方法的调用,减小栈帧的大小两种方式。

OutOfMemeryError:在栈上出现OOM通常是多线程的情形。

首先咋们解析一下栈使用的空间能够有多大,拿32位操作系统来举例。 最大内存2G - Xmx(最大堆容量)- MaxPermSize(最慷慨法区容量)- 虚拟机本身耗费的内存和程序计数器使用的内存。

剩下的内存就是栈能够使用的空间,当Xss配置的參数一定时,那么在不断的创建线程过程中。遇到不能申请到栈空间的时候就会抛出OOM。那么相应的解决方案就是,调节-Xss參数减少栈大小,或者调节-Xmx以及MaxPermSize的大小扩大留给栈的空间。


2.方法区内存溢出

方法区的大小通过-PermSize和-MaxPermSize控制。


由于类常量和执行时常量也存储在方法区中,所以执行时常量过多也可导致方法区的OOM,可是没有直接控制常量池大小的參数,仅仅能通过-PermSize和-MaxPermSize来间接控制。

在Spring以及Hibernate。Mybatis中都会使用GeneratedConstructorAccessor、动态代理以及CGLib字节码增强技术的等动态生成类,那么就须要强大的方法区来支撑。


3.堆内存的溢出

堆内存的溢出比較复杂,须要调节GC等多种參数,我们在后面的章节中会进行解说。








以上是关于在java中上传文件出现内存溢出怎么解决的主要内容,如果未能解决你的问题,请参考以下文章

解决java读取大文件内存溢出问题,如何在不重

java读取大文件时内存溢出问题

你好,java 向数据库添加大量数据时内存溢出 在不改变内存的情况下如何解决? 你当时是怎么解决的

java jdbc 批处理会造成内存溢出吗

java 读取大容量文件,内存溢出?怎么分段读取(按一定容量读取)

java内存溢出怎么解决?