2016-01-21 2 views
1

я заметил, пользователи приложения получили ошибку:Почему разбор StackOverflowException вызывает OOM?

Fatal Exception: java.lang.OutOfMemoryError: OutOfMemoryError thrown while trying to throw OutOfMemoryError; no stack available 

Итак, я написал довольно простое приложение:

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Log.d("TAG", "" + getFoo()); 
    } 

    private int getFoo() { 
     return getBar(); 
    } 

    private int getBar() { 
     return getFoo(); 
    } 
} 

Кто бросает OOM при разборе StackOverflowException я не в состоянии получить трассировку стека в журнале:

01-20 13:51:06.250 8134-8134/lt.neworld.java E/art: Throwing OutOfMemoryError "Failed to allocate a 16482048 byte allocation with 12515386 free bytes and 11MB until OOM" 
01-20 13:51:06.250 8134-8134/lt.neworld.java E/AndroidRuntime: Error reporting crash 
    java.lang.OutOfMemoryError: Failed to allocate a 16482048 byte allocation with 12515386 free bytes and 11MB until OOM 
     at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:95) 
     at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:125) 
     at java.lang.StringBuffer.append(StringBuffer.java:278) 
     at java.io.StringWriter.write(StringWriter.java:123) 
     at com.android.internal.util.FastPrintWriter.flushLocked(FastPrintWriter.java:358) 
     at com.android.internal.util.FastPrintWriter.appendLocked(FastPrintWriter.java:303) 
     at com.android.internal.util.FastPrintWriter.write(FastPrintWriter.java:625) 
     at com.android.internal.util.FastPrintWriter.append(FastPrintWriter.java:658) 
     at java.io.PrintWriter.append(PrintWriter.java:691) 
     at java.io.PrintWriter.append(PrintWriter.java:31) 
     at java.lang.Throwable.printStackTrace(Throwable.java:324) 
     at java.lang.Throwable.printStackTrace(Throwable.java:300) 
     at android.util.Log.getStackTraceString(Log.java:340) 
     at com.android.internal.os.RuntimeInit.Clog_e(RuntimeInit.java:59) 
     at com.android.internal.os.RuntimeInit.access$200(RuntimeInit.java:43) 
     at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:85) 
     at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693) 
     at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690) 

Есть идеи, как я могу исправить этот OOM или как я могу получить stacktrace в prod?

+0

что же вы хотите сделать с этим классом? :) – gio

+0

Я хочу получить StackOverflowException – neworld

+0

Как вам помочь принудительное использование SO вместо исключения OOM в примерном проекте? Чтобы сделать то же самое в своем сложном продукте, вам нужно знать, куда бросается OOM, и если бы вы знали, что можете это исправить. Я не понимаю ваш вопрос. –

ответ

1

Update:

ThreadGroup group = new ThreadGroup("threadGroup"); 
new Thread(group, new Runnable() { 
    private void stackOverflow() { 
     stackOverflow(); 
    } 
    @Override 
    public void run() { 
     stackOverflow(); 
    } 
}, "name", 20).start(); 
+0

Still OOM. Я попытаюсь объяснить снова. Я хочу получить 'StackOverflowException' вместо' OutOfMemoryException'. Без трассировки стека я не могу узнать, где приложение рушится для пользователей. – neworld

+0

@neworld Похоже, что стек попытается развернуть себя до бесконечности, пока не закончится память. Это означает, что вы не можете получить SO. И если бы вы могли, это не было бы надежным. –

+0

Несколько лет назад у меня были исключения StackOverflow. Может быть, возможно ограничить глубину рекурсии или что-то еще? – neworld

Смежные вопросы