я заметил, пользователи приложения получили ошибку:Почему разбор 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?
что же вы хотите сделать с этим классом? :) – gio
Я хочу получить StackOverflowException – neworld
Как вам помочь принудительное использование SO вместо исключения OOM в примерном проекте? Чтобы сделать то же самое в своем сложном продукте, вам нужно знать, куда бросается OOM, и если бы вы знали, что можете это исправить. Я не понимаю ваш вопрос. –