见代码:FileReader fr=new FileReader(path);
char[] c=new char[10240];
String fileString="";
int length=0;
while((length=fr.read(c))!=-1)
{
fileString+=new String(c,0,length);
}报,Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
目标文件是23MB的文本文件
如果我换成一个2MB的文本文件就正常
我想是不是 String的大小是不是有一定的限制,我换成StringBuffer也报一样的错误
char[] c=new char[10240];
String fileString="";
int length=0;
while((length=fr.read(c))!=-1)
{
fileString+=new String(c,0,length);
}报,Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
目标文件是23MB的文本文件
如果我换成一个2MB的文本文件就正常
我想是不是 String的大小是不是有一定的限制,我换成StringBuffer也报一样的错误
2、你把23M的文件读到内存做啥?不能切成小文件处理吗?
3、等楼下说明
23M的文件是我从网站抓取的数据,然后用正则表达式进行分析把有用的数据提取出来
我加了JVM的内存,但还是不行
char[] c=new char[10240];
String fileString="";
int length=0;
while((length=fr.read(c,0,c.length))!=-1)
{
fileString+=new String(c,0,length);
}
你改成上面那样的试试看,给读的时候也设置个缓存,
我在写快速复制文件的小软件时也遇到过这样的错误,楼上说的也有道理,但我没改JVM,
我最大把c设置成1048576,后面再大的数就会报这个错了
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space。
char[] c = new char[10240];
String fileString = "";
int length = 0;
while((length = fr.read(c,0,c.length)) != -1) / 这里也设置个缓存c
{
fileString += new String(c,0,length);
}
while((length=fr.read(c))!=-1)改成了while((length = fr.read(c,0,c.length)) != -1)
JVM的内存加到了256m,终于读出这个23M的文本文件如果我要读到一个230M的文本文件,我要把内存加到多少呀
有点晕
你的思路一直停留在原来的代码上,不做修改永远解决不了问题的。
没必要一次性的把所有字节全部读都到一个数组中,API是你最好的助手。
还有用String效率太低,建议用StringBuilder;
办法:
1、设置环境变量:
set JAVA_OPTS= -Xms32m -Xmx512m
可以根据自己机器的内存进行更改,但本人测试这种方法并没有解决问题。可能是还有哪里需要设置。2、java -Xms32m -Xmx800m className:
就是在执行JAVA类文件时加上这个参数,其中className是需要执行的确类名。(包括包名)
这个解决问题了。而且执行的速度比没有设置的时候快很多。如果在测试的时候可能会用Eclispe 这时候就需要在Eclipse ->run -arguments 中的VM arguments 中输入-Xms32m -Xmx800m这个参数就可以了。不知是否正确,建议试一下。