向列表

时间:2016-06-11 14:15:35

标签: java arraylist reference garbage-collection overhead

首先感谢您的帮助。 我知道java的Reference传递机制,我需要从文本文件中读取一百万行(一行+ a_list_of_integers每行)并将它们放在一些类属性,一个hashmap和两个arraylist的结构中。 / p>

问题在于,使用下面的代码,为了节省内存重用列表“termine_frequenza”,当我尝试从“频率”arraylist或“dictionaryMarTD”hashmap获取和元素时,返回的列表始终是我添加的最后一个列表。 将“Arraylist termine_frequenza”的声明添加到While虽然明显解决了问题,但由于多次声明,我收到了可预见的“超出GC开销限制”错误(我试图增加堆o禁用它,但GC填充cpu容量试图自由记忆。

问题很简单:如何节省内存并同时阅读正确?感谢。

        //Class attributes
        private HashMap<String, ArrayList> dictionaryMapTD; 
        private ArrayList<String> words;
        private ArrayList<ArrayList> frequency;          

        //This is the code of a method of the class that reads from a file
        br = new BufferedReader(new FileReader("dictionary.txt")); 
        s = br.readLine(); 

        String[] splitted;
        ArrayList<Integer> termine_frequenza = new ArrayList<>();

        while(s!=null)
        {
            termine_frequenza.clear(); 
            splitted = s.split(" ");
            words.add(splitted[0]);
            for (int i = 1; i < splitted.length; i++) 
            {   
                termine_frequenza.add(Integer.valueOf(splitted[i]));
            }               
            frequency.add(termine_frequenza); 
            dictionaryMapTD.put(splitted[0], termine_frequenza);
            s = br.readLine();
        }
        //END

1 个答案:

答案 0 :(得分:0)

更改eclips.ini文件中的XMS / XMX参数。 我将它设置为-Xms256m-Xmx7024m为3000000 如果它没有效果,那么尝试修改应用程序的参数 在你的eclips去  RunConfigurations-&gt; Arguments-&gt; VM Arguments 为您的申请和投入 -Xms256m -Xmx7024m

然后在你的代码中移动 termine_frequenza = new ArrayList&lt;&gt;(); 在里面,然后删除 termine_frequenza.clear();

GC不应该抱怨 就我而言,它运行7000000条记录

如果有帮助请告诉我