在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 向数据库添加大量数据时内存溢出 在不改变内存的情况下如何解决? 你当时是怎么解决的