我有两个文件,一个包含长度3到6的单词字典,另一个包含长度为7的单词字典。这些单词存储在文本文件中,用换行符分隔。该方法加载文件并将其插入到ArrayList中,然后存储在应用程序类中。
文件大小分别为386KB和380KB,每个文件包含不到200k个单词。
private void loadDataIntoDictionary(String filename) throws Exception {
Log.d(TAG, "loading file: " + filename);
AssetFileDescriptor descriptor = getAssets().openFd(filename);
FileReader fileReader = new FileReader(descriptor.getFileDescriptor());
BufferedReader bufferedReader = new BufferedReader(fileReader);
String word = null;
int i = 0;
MyApp appState = ((MyApp)getApplicationContext());
while ((word = bufferedReader.readLine()) != null) {
appState.addToDictionary(word);
word = null;
i++;
}
Log.d(TAG, "added " + i + " words to the dictionary");
bufferedReader.close();
}
在运行2.3.3版本的模拟器上,64MB的SD卡程序崩溃。
使用logcat报告错误。
堆大小超过24 MB。然后我看到将目标GC堆从25.XXX
减小到24.000 MB。
GC_FOR_MALLOC释放了0K,12%可用,外部1657k/2137K,暂停208ms。
GC_CONCURRENT释放了XXK,14%可用
分配24字节内存时内存不足,随后发生致命错误。
如何在不获取如此大的堆的情况下加载这些文件?
在MyApp中:
private ArrayList<String> dictionary = new ArrayList<String>();
public void addToDictionary(String word) {
dictionary.add(word);
}
addToDictionary()
函数的代码,它是查找内存泄漏最显然的地方。 - Dan Hulme