在while循环中创建新对象时,Java大量内存消耗/泄漏

时间:2016-07-04 17:59:24

标签: java memory-leaks while-loop

我有以下程序在大小为2GB且带有80M行的txt文件上运行。 txt文件的每一行都具有以下格式:

word1_POSTAG word2_POSTAG频率

例如:

academy_NN award_NN 200

我逐行读取文件并从每行提取和存储信息的while循环非常快地耗尽了我所有的16GB内存(在35M左右)。 我似乎没有发现问题。我试图强制垃圾收集,并在每次迭代使用后使elementstmp为null,但这些都不起作用。

     BufferedReader tagged = new BufferedReader(
                new InputStreamReader(
                        new FileInputStream(p2_POSTagged_bigrams), "UTF8"));

     HashMap<String,TaggedNgram_v2> taggedEtFreq = new HashMap();


     int linecount = 0;
     String s1 = "";
     while((s1=tagged.readLine()) != null){
         linecount++;

         if(linecount % 1000000 == 0){
             System.out.println("processing line: "+linecount);
         }

         String[] elements =s1.split("[ _]");//s1 format: academy_NN award_NN 254           

        if(!taggedEtFreq.containsKey(elements[0].concat(" ").concat(elements[2])) ){

             TaggedNgram_v2 tmp = new TaggedNgram_v2();
             tmp.addTags(elements[1].concat(" ").concat(elements[3]));
             tmp.addTagFrequency(Integer.parseInt(elements[4]));
             taggedEtFreq.put(elements[0].concat(" ").concat(elements[2]), tmp);

         }else{

             TaggedNgram_v2 tmp = taggedEtFreq.get(elements[0].concat(" ").concat(elements[2]));
             tmp.addTags(elements[1].concat(" ").concat(elements[3]));
             tmp.addTagFrequency(Integer.parseInt(elements[4]));
             taggedEtFreq.put(elements[0].concat(" ").concat(elements[2]), tmp);

         }  
     }

我定义TaggedNgram_v2类如下。

class TaggedNgram_v2 {

private List<String> tags = new ArrayList();
private List<Integer> tagFrequencies = new ArrayList();

public List<String> getTags() {
    return tags;
}

public void addTags(String tag) {
    tags.add(tag);
}

public List<Integer> getTagFrequency() {
    return tagFrequencies;
}

public void addTagFrequency(int tagFrequency) {
    tagFrequencies.add(tagFrequency);
}

}

0 个答案:

没有答案