最近一个项目需要数据库同步所以文件都要存储到数据库中而且文件大小不限制,试了好多办法上传大文件最后用ActiveX解决了可是数据库存储还是交给Java,大概过程是这样ActiveX将用户上传的文件保存到web服务器后通知后台调用一个响应程序并将文件路径当作参数传过去java程序读取文件后将文件合并转换为byte[]存入数据库,可是问题出现了如果文件够大比如300M左右服务器就会报错OutOfMemoryError:java heap space。找了半天解决的办法只找到获得文件时用循环分段获得文件可是不管怎么样最后存入数据库时不可能用循环一点一点的插入到数据库一定是把所有byte[]拼起来再执行插入的操作。可是就在把所有byte[]拼起来的时候又出现了OutOfMemoryError:java heap space......哎,折腾了几天也没结果 哪位高人给指点一下啊 谢谢了
java.lang.OutOfMemoryError: Java heap space
在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出此异常信息。
JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。
解决办法:
tomcat_home/bin下catalina.bat(windows系统)
catalina.sh(linux系统)执行代码前加上:
set JAVA_OPTS=%JAVA_OPTS% -Xms128m -Xmx512m windows 更改系统环境变量
加上JAVA_OPTS=-Xms64m -Xmx512m
建立两张表 一张保存文件的属性信息,文件名,类别,备注什么的 另一张存文件的内容 是一对多的关系。将得到的文件没10M分割一次存到文件内容表中,获得的时候再去按顺序拼就OK了~~~