Java 偶尔内存不足在Android中构建trie

Java 偶尔内存不足在Android中构建trie,java,android,out-of-memory,Java,Android,Out Of Memory,我的应用程序要做的第一件事就是读取一个充满单词的文本文件,并从中构建一个trie。在旧款手机Droid X上进行测试,该手机内存为512MB,在构建trie时,有时会因“160字节分配内存不足”而崩溃 奇怪的是,它并不是每次都崩溃。使用80K字表,它每隔一次启动时就会崩溃。该应用程序每四次启动一次,就会有20000个单词的列表崩溃。我不明白发生了什么会影响多个发布中的内存分配,但这是可以预测的 我能做些什么来释放或预先分配内存,使它每次都能工作吗 我可能在做一些愚蠢/浪费的事情来构建trie,所

我的应用程序要做的第一件事就是读取一个充满单词的文本文件,并从中构建一个trie。在旧款手机Droid X上进行测试,该手机内存为512MB,在构建trie时,有时会因“160字节分配内存不足”而崩溃

奇怪的是,它并不是每次都崩溃。使用80K字表,它每隔一次启动时就会崩溃。该应用程序每四次启动一次,就会有20000个单词的列表崩溃。我不明白发生了什么会影响多个发布中的内存分配,但这是可以预测的

我能做些什么来释放或预先分配内存,使它每次都能工作吗

我可能在做一些愚蠢/浪费的事情来构建trie,所以我会发布相关的信息。以下是读取文件并添加到trie的部分:

public void LoadText(Activity a) {
    InputStream is = a.getResources().openRawResource(dictfile); 
    BufferedReader br = new BufferedReader(new InputStreamReader(is));
    String readLine = null;
    int wordsadded = 0, timeslogged = 0;
    try {
        while ((readLine = br.readLine()) != null) {
            trie.insert(readLine.toUpperCase(Locale.US));
        }
        is.close();
        br.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
这是trie的insert方法:

protected void insert(String word) {
    int n = word.charAt(0) - 'A';
    if (c[n] == null)
        c[n] = new TrieNode();
    if (word.length() == 1) {
        c[n].end = true;
    } else {
        c[n].insert(word.substring(1));
    }
}

你能澄清你所说的“跨多个发布”是什么意思吗?从您描述的行为来看,听起来您只是简单地按下Home键,然后重新进入应用程序-这可能不会将其从内存中删除,而且听起来您每次都在构建trie(可能是从
onResume
onStart
某个地方)。你能描述一下你多次启动应用程序所采取的步骤吗?我将用Back退出应用程序,然后点击图标重新启动它。如果我使用Home退出应用程序,然后重新启动它,你是对的,它只会让仍在运行的应用程序回到最前沿。澄清一下,在其他情况下,应用程序在启动时偶尔会失败——这正是我让它可靠地发生的方式。我的猜测是,周期性的故障与Android用于其他后台活动的内存量有关,可以通过强制Android释放足够的内存来解决。您是否将这些数据存储在某个单独的位置?您可以在Eclipse的DDMS视图中检查正在运行的进程;如果您将此数据存储在创建此数据的活动范围之外的某个位置,则即使该活动已被终止,该数据仍会随应用程序进程继续存在。当然,这似乎是正在发生的事情。我已经检查了一些应用程序,它们将数据存储在自定义的
应用程序
类中-即使我使用“后退”按钮退出,该过程仍然持续,并且尽管重新创建了
活动
,但旧数据仍然存在于
应用程序
类中。