我有一个" .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
我不明白为什么?
清除记忆的解决方案是什么?
请帮忙。
感谢。
答案 0 :(得分:2)
JVM在询问后不一定会将内存释放回操作系统。它可以快速扩展以满足您的需求,最高可达到最大值。一旦它有记忆,它往往会长时间保持它。即使你的程序现在只使用50MB,JVM仍然可以容纳另外650MB。
答案 1 :(得分:1)
显然你不能,但你可以
null
分配给您想要从GC
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
。