Java 处理从文本文件读取的字符串时内存使用效率低下

Java 处理从文本文件读取的字符串时内存使用效率低下,java,string,garbage-collection,heap,Java,String,Garbage Collection,Heap,我有一个大约1.7GB的大文件,由2500万行组成,每行的格式如下:text,number 问题是文本可以在多行中相同,即 我是一个男孩,34岁 我是一个男孩,56岁 我在while循环中读取文件的每一行,并将字符串和数字放入hashmap中 代码: InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("filename.txt"); InputStreamReader st

我有一个大约1.7GB的大文件,由2500万行组成,每行的格式如下:text,number

问题是文本可以在多行中相同,即

我是一个男孩,34岁

我是一个男孩,56岁

我在while循环中读取文件的每一行,并将字符串和数字放入hashmap中

代码:

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);
}
其中hm是一个hashmap

我之所以使用子字符串lastIndexOf是因为文本本身可能有逗号


我的问题是:我是否使用了太多的字符串?从文本文件中提取的重复字符串是否将作为副本保留在内存中,或者仅显示其中一个。有没有一种方法(使用字符串的intern方法或其他方法)来减少使用的字符串数量。当我使用EclipseMat分析内存使用情况时,它显示使用了大约9GB的堆空间

即使使用intern,也要在插入之前创建中间字符串;一旦它们被拘留,它们就永远不会被gc'd.@AndyTurner,但是如果有多个字符串,只有一个会创建中间形式并放入堆中,对吗?重复的字符串将被垃圾收集,因为它们不会存储在哈希映射中。顺便说一下,你的代码没有多大意义。当您到达第一个
子字符串
调用时,
while
循环将清空文件,
将为
。所以它不应该使用任何内存。@JimMischel我已经编辑了代码。我的错误。我看错了你的密码。我对它进行了格式化,这样其他人就不会犯与我相同的错误;一旦它们被拘留,它们就永远不会被gc'd.@AndyTurner,但是如果有多个字符串,只有一个会创建中间形式并放入堆中,对吗?重复的字符串将被垃圾收集,因为它们不会存储在哈希映射中。顺便说一下,你的代码没有多大意义。当您到达第一个
子字符串
调用时,
while
循环将清空文件,
将为
。所以它不应该使用任何内存。@JimMischel我已经编辑了代码。我的错误。我看错了你的密码。我把它格式化了,这样别人就不会犯和我一样的错误。