如果说读一行处理一行的话,用BufferedReader的readLine是不会报OOM的,除非你读完每行数据又保存在内存里? 贴上代码看看吧。。######@丨丨丨 可现在如果要写入,也是要先能读取的,对吧。现在是文件大小上到200M就直接读不了######@丨丨丨 是的,我每行进来后只取三个字段然后放入list。内存早已在异常最初处理就加了######回复 @八月长安 : 指导谈不上,看样子msg应该是个List,这样无限放下去肯定会OOM的。根据业务能不能在msg里面的数据到达一定数量之后,就写到文件或者写到数据库,分批处理。实在不行就-Xmx适当加大点内存,-Xmx1024m,要改至少能处理个几百m的文件######代码已帖 如有这方面经验 请指导######BufferedReader不适合读写几百兆的文件,按理说设置好BufferedReader的缓存大小按行读取不会出现内存溢出,但是当读写到几万行设置更大的时候就会出内存溢出。可能跟readLine的巨量String操作引起内存泄露GC来不及回收。要么试着把JVM内存参数调大一点,更好的方法是用字节读写或者用NIO操作吧。网上应该有蛮多例子的。######回复 @八月长安 : http://www.oschina.net/code/snippet_54100_7938?p=1#comments看这个可以不######字节流一开始就是看文件过大而放弃使用######NIO我没接触过,早上也尝试着去用,但恕我愚钝,并未能写出demo,你方便给我一个,如果你用过的话######
@八月长安 : 光读取不可能是OOM的,下面这个代码读取几个G的文件都没问题。 所以原因还是msg的List放的东西太多了,读200M内存就满了,如果需要跟踪内存变化可以加参数-XX:+PrintGCDetails
public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("e:\\TEST.20150528150817776"))); int count = 0; for (String line = br.readLine(); line != null; line = br.readLine()) { count++; if (count % 10000 == 0) { System.out.printf("read line count: %d%n", count); } } System.out.printf("read line count: %d%n", count); br.close(); }
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。