java.lang.OutOfMemoryError:[内存耗尽]

时间:2012-03-22 18:22:40

标签: android

我遇到以下异常:

    03-22 23:34:23.775: E/dalvikvm-heap(563): Out of memory on a 216-byte allocation.
    03-22 23:34:23.775: I/dalvikvm(563): "main" prio=5 tid=1 RUNNABLE
    03-22 23:34:23.775: I/dalvikvm(563):   | group="main" sCount=0 dsCount=0 obj=0x409c1460 self=0x12810
    03-22 23:34:23.775: I/dalvikvm(563):   | sysTid=563 nice=0 sched=0/0 cgrp=default handle=1074082952
    03-22 23:34:23.775: I/dalvikvm(563):   | schedstat=( 185232190544 11744128421 6399 ) utm=18163 stm=360 core=0
    03-22 23:34:23.775: I/dalvikvm(563):   at java.lang.Throwable.nativeFillInStackTrace(Native Method)
    03-22 23:34:23.775: I/dalvikvm(563):   at java.lang.Throwable.fillInStackTrace(Throwable.java:160)
    03-22 23:34:23.775: I/dalvikvm(563):   at java.lang.Throwable.<init>(Throwable.java:83)
    03-22 23:34:23.775: I/dalvikvm(563):   at java.lang.Error.<init>(Error.java:37)
    03-22 23:34:23.775: I/dalvikvm(563):   at java.lang.VirtualMachineError.<init>(VirtualMachineError.java:35)
    03-22 23:34:23.775: I/dalvikvm(563):   at java.lang.OutOfMemoryError.<init>(OutOfMemoryError.java:33)
    03-22 23:34:23.785: I/dalvikvm(563):   at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:-1)
    03-22 23:34:23.785: I/dalvikvm(563):   at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:145)
    03-22 23:34:23.785: I/dalvikvm(563):   at java.lang.StringBuffer.append(StringBuffer.java:219)
    03-22 23:34:23.785: I/dalvikvm(563):   at com.swabunga.spell.engine.DoubleMeta.transform((null):-1)
    03-22 23:34:23.785: I/dalvikvm(563):   at com.swabunga.spell.engine.SpellDictionaryASpell.getCode((null):-1)
    03-22 23:34:23.785: I/dalvikvm(563):   at com.swabunga.spell.engine.SpellDictionaryHashMap.putWord((null):-1)
    03-22 23:34:23.785: I/dalvikvm(563):   at com.swabunga.spell.engine.SpellDictionaryHashMap.createDictionary((null):-1)
    03-22 23:34:23.785: I/dalvikvm(563):   at com.swabunga.spell.engine.SpellDictionaryHashMap.<init>((null):-1)
    03-22 23:34:23.785: I/dalvikvm(563):   at com.spellchecker.SpellCheckerService.<init>(SpellCheckerService.java:49)
    03-22 23:34:23.785: I/dalvikvm(563):   at com.dict.SearchDict.handleIntent(SearchDict.java:150)
    03-22 23:34:23.785: I/dalvikvm(563):   at com.dict.SearchDict.onNewIntent(SearchDict.java:87)
    03-22 23:34:23.785: I/dalvikvm(563):   at android.app.Instrumentation.callActivityOnNewIntent(Instrumentation.java:1123)
    03-22 23:34:23.785: I/dalvikvm(563):   at android.app.ActivityThread.deliverNewIntents(ActivityThread.java:2042)
    03-22 23:34:23.785: I/dalvikvm(563):   at android.app.ActivityThread.performNewIntents(ActivityThread.java:2055)
    03-22 23:34:23.785: I/dalvikvm(563):   at android.app.ActivityThread.handleNewIntent(ActivityThread.java:2064)
    03-22 23:34:23.785: I/dalvikvm(563):   at android.app.ActivityThread.access$1400(ActivityThread.java:123)
    03-22 23:34:23.785: I/dalvikvm(563):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1194)
    03-22 23:34:23.795: I/dalvikvm(563):   at android.os.Handler.dispatchMessage(Handler.java:99)
    03-22 23:34:23.795: I/dalvikvm(563):   at android.os.Looper.loop(Looper.java:137)
    03-22 23:34:23.795: I/dalvikvm(563):   at android.app.ActivityThread.main(ActivityThread.java:4424)
    03-22 23:34:23.795: I/dalvikvm(563):   at java.lang.reflect.Method.invokeNative(Native Method)
    03-22 23:34:23.795: I/dalvikvm(563):   at java.lang.reflect.Method.invoke(Method.java:511)
    03-22 23:34:23.795: I/dalvikvm(563):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    03-22 23:34:23.795: I/dalvikvm(563):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    03-22 23:34:23.795: I/dalvikvm(563):   at dalvik.system.NativeStart.main(Native Method)
         java.lang.OutOfMemoryError: [memory exhausted]
         at dalvik.system.NativeStart.main(Native Method)

在下面的代码中:

        File wordList=new File(Environment.getExternalStorageDirectory() + File.separator + "wordlist.0");
        if(!wordList.exists())
        {
            wordList.createNewFile();
            BufferedReader reader = new BufferedReader(new InputStreamReader(SearchDict.context.getResources().openRawResource(R.raw.wordlist)));
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(wordList)));
            String line;                
            while ((line = reader.readLine()) != null) 
            {
                writer.write(line);
                writer.newLine();
            }
        }
        SpellDictionaryHashMap spelldictionaryhashmap = new SpellDictionaryHashMap(wordList, null);
        spellCheck = new SpellChecker(spelldictionaryhashmap);
        spellCheck.addSpellCheckListener(this);
        spellCheck.checkSpelling(new StringWordTokenizer(s));

我正在开发一个字典,其中我使用JAZZY API实现了拼写检查。上面的代码是它的一部分,它通常从raw文件夹中的单词列表中读取单词并写入文件。因为我需要将单词列表作为java.io.File传递给com.swabunga.spell.engine.SpellDictionaryHashMap以创建单词列表的哈希码。

当进程正在进行时,此异常被抛出。

2 个答案:

答案 0 :(得分:3)

这段代码运行的频率是多少?那里有很多分配。

new File
new BufferedReader
new InputStreamReader
new BufferedWriter
new OutputStreamWriter
new SpellDictionaryHashMap
new SpellChecker
new StringWordTokenizer

如果不止一次调用它,你真的应该找到一种方法来尽可能多地提取这些对象并保留它们,以便你可以重复使用它们。

答案 1 :(得分:0)

我怀疑你正在尝试加载一个非常大的字典,因为异常暗示只是内存不足。如果是这种情况,则不应使用SpellDictionaryHashMap。相反,应该使用不会将整个字典加载到内存中但从磁盘读取的不同实现。