@jonasas

Почему выбрасывается StackOverflowError?

На устройстве пользователя выбрасываются странные исключения:
java.lang.StackOverflowError: stack size 8MB
    at android.os.MessageQueue.nativePollOnce(Native Method)
    at android.os.MessageQueue.next(MessageQueue.java:143) 
    at android.os.Looper.loop(Looper.java:195) 
    at android.app.ActivityThread.main(ActivityThread.java:5373) 
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)

и
java.lang.StackOverflowError: stack size 8MB
    at android.view.ThreadedRenderer.nInitialize(Native Method)
    at android.view.ThreadedRenderer.initialize(ThreadedRenderer.java:147) 
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1649) 
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1065) 
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5901) 
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) 
    at android.view.Choreographer.doCallbacks(Choreographer.java:580) 
    at android.view.Choreographer.doFrame(Choreographer.java:550) 
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:211) 
    at android.app.ActivityThread.main(ActivityThread.java:5373) 
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)

В трассировках видно, что нету большой вложенности методов. Также все методы принадлежат Android SDK.
На моих устройствах эти исключения не повторяются.
В чём может быть дело и как установить причину этих выбросов?
Так как память в Java -- куча, значит в стек большие данные попасть не могут. Только если большое количество ссылок или примитивов.
  • Вопрос задан
  • 646 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Moiaposhta
На разных устройствах stack разный
Такая ошибка возникает когда функция вызывает сама себя рекурсивно (очень много раз или постоянно). Вы можете также, создавать много элементов интерфейса, ошибка будет та же. Простейший способ избавится от ошибки (рекурсивной функции), реализовать вообще без рекурсивных функций. Т.е. заменить их вложенными в друг в друга циклами. Работать будет отлично. Если вы создаете много элементов интерфейса можно увеличить stack. Наберите в поисковике Android Studio - как увеличить размер выделенной кучи
Обратите внимание также на Handler, при неправильной реализации может быть утечка памяти
Посмотрите правильно ли вы завершаете все потоки
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы