2017-02-09 78 views
0

我有一个文本文件,我需要逐行阅读并在每行上做一些处理。字符串的垃圾回收

ConcurrentMap<String, String> hm = new ConcurrentHashMap<>(); 
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("filename.txt"); 

InputStreamReader stream = new InputStreamReader(is, StandardCharsets.UTF_8); 
BufferedReader reader = new BufferedReader(stream); 

while(true) 
{ 
    line = reader.readLine(); 
    if (line == null) { 
     break; 
    } 
    String text = line.substring(0, line.lastIndexOf(",")).trim(); 
    String id = line.substring(line.lastIndexOf(",") + 1).trim(); 
    hm.put(text,id); 
} 

我需要知道,当将在substring()trim()操作创建的字符串是垃圾回收? 另外,字符串line呢?

+0

请编辑您的问题,并向我们展示您如何使用在'while'循环中填充的地图。 –

回答

3

这些字符串本身将在垃圾回收完成后立即进行垃圾回收,这些垃圾回收会在每次循环的迭代结束时发生。但从内存使用的角度来看,这是一个有争议的问题,因为您正在将这些数据存储到地图中,这样而不是超出了范围。

如果您包含有关您如何使用此地图的信息,也许可以给出解决方案,避免必须将所有内容存储在内存中。

+0

感谢您的回答,但您可以使用我给出的变量名称来解释哪些字符串将被垃圾收集,哪些不会。我需要知道是否有任何不需要的字符串会浪费内存泄漏。我相信字符串文本,id不会被垃圾回收,但字符串行应该和每次迭代后使用trim()操作创建的字符串一样。我对么 ? – ak0817

+0

这些字符串不是“泄漏”内存。他们出生,然后在循环的每次迭代中死亡。但是,你的地图'hm'会随着循环的每次迭代而继续增长。如果有的话,地图就是实际的“泄漏”。 –

+0

@ ak0817你不能真的在java中创建内存泄漏,因为内存已经被管理,因此为什么首先有一个垃圾收集器。 – px06