如何读取大文件并在最后释放内存?

时间:2016-06-14 19:13:02

标签: java file

我有一个" .txt"文件大小为6.29mb和11234行。
我尝试在java中读取该文件。

使用此代码:

File file = new File(path);
FileInputStream fis = new FileInputStream(file);
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
String line;
while( (line=br.readLine()) != null ){

}
br.close();
fis.close();

这种方式很快,
但问题是当它运行时,它在内存中需要大约700mb 什么时候 BufferedReader关闭我的java程序仍然需要~700mb
我不明白为什么?

清除记忆的解决方案是什么?

请帮忙。

感谢。

2 个答案:

答案 0 :(得分:2)

JVM在询问后不一定会将内存释放回操作系统。它可以快速扩展以满足您的需求,最高可达到最大值。一旦它有记忆,它往往会长时间保持它。即使你的程序现在只使用50MB,JVM仍然可以容纳另外650MB。

答案 1 :(得分:1)

显然你不能,但你可以

  • 您可以将null分配给您想要从GC
  • 释放的对象

enter image description here

  • 您可以使用WeakReferences
  

简单地说,弱引用是一个不够强大的引用   强制对象保留在内存中。弱引用允许您   利用垃圾收集器确定可达性的能力   你,所以你不必自己动手。您创建一个弱引用   像这样:

     

WeakReference weakWidget = new WeakReference(widget);然后   在代码中的其他地方,您可以使用weakWidget.get()来获取实际值   小部件对象。当然,弱参考不够强大   防止垃圾收集,所以你可能会发现(如果没有强大的   对widget的引用)weakWidget.get()突然启动   返回null。

如果GC发现某个对象弱可达(只能通过弱引用访问),则会清除该对象的{em>弱引用 {{ 1}}。

immediately

以一般方式,您使用HashMap<StringBuilder, Integer> map = new HashMap<>(); WeakReference<HashMap<StringBuilder, Integer>> aMap = new WeakReference<>(map); map = null; while (null != aMap.get()) { aMap.get().put(new StringBuilder("abbas"), new Integer(123)); System.out.println("Size of aMap " + aMap.get().size()); System.gc(); } System.out.println("Its garbage collected"); //Size of aMap 1 //Its garbage collected 创建Object但您没有权力来释放它或运行new