Java上传大文件报空指针,内存溢出错误java.lang.OutOfMemoryError解决方案

最近项目上在实现大文件上传时一直报空指针然后跟踪代码发现,在实现上传时,I/O流报了java.lang.OutOfMemoryError的错误,也就是内存溢出的问题。
具体报错的位置:

while ((length = is.read(buffer)) != -1) {
    
    
                ds.write(buffer, 0, length);
            }

图示:
在这里插入图片描述
遇见这种情况要一一排查,首先要排查SpringMvc的配置文件中对文件上传大小的限制是否过于小,未达到要求。

<bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
         <!-- maxUploadSize 允许上传的最大文件 200M(200*1024*1024)b为单位 -->
         <property name="maxUploadSize" value="209715200"/>
          <!-- maxInMemorySize允许的最大内存大小 -->
         <property name="maxInMemorySize" value="4096"/>
           <!-- defaultEncoding上传文件编码 -->
         <property name="defaultEncoding" value="UTF-8"/>
          <!-- 设置是否在时惰性地解析多部分,用来抛异常用的,可有可无 -->
         <property name="resolveLazily" value="true"/>
     </bean>

如果排查过配置文件没有问题后,那就去排查是否是tomcat的JVM内存设置过小导致内存溢出。
本人经过排查后发现,我的tomcat的JVM内存设值过小,导致大文件上传时,出现了内存溢出的问题。
我的方案是;增加tomcat的JVM内存
修改apache-tomcat_8082\apache-tomcat-8.0.53\bin里的catalina.bat内容
内存拉高到1024M
注意:tomcat8.0.5里面的默认是:

set "JAVA_OPTS=%JAVA_OPTS% -server -Xms256m -Xmx256m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=256m"

修改为:

set "JAVA_OPTS=%JAVA_OPTS% -server -Xms1024m -Xmx1024m -XX:PermSize=512M -XX:MaxNewSize=512m -XX:MaxPermSize=512m"

图示:
在这里插入图片描述
在解决这个问题时,有两位开发者的博客给予很大的启发,给问题的定位也比较准确,虽然没有解决我的问题,但是很有借鉴意义。
https://blog.csdn.net/dongbang111/article/details/43919731
https://blog.csdn.net/magiccity/article/details/83008285

猜你喜欢

转载自blog.csdn.net/Acompanys/article/details/105434370
今日推荐