首先感谢您的帮助。 我知道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
答案 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条记录如果有帮助请告诉我