StackOverflowError просто сигнализирует о том, что памяти больше нет. Он расширяет класс VirtualMachineError, что указывает на то, что JVM (виртуальная машина Java) повреждена или у нее закончились ресурсы и она не может работать.
Если у вас есть такая функция, как:
int myFunction() < // ваш код myFunction(); >
В приведенном выше коде myFunction() будет продолжать называть себя, все глубже и глубже, и когда пространство, используемое для отслеживания того, какие функции вы находитесь, заполнено, вы получаете ошибку stackoverflow. Общей причиной переполнения стека является плохой рекурсивный вызов. Как правило, это вызвано, когда ваши рекурсивные функции не имеют правильного условия завершения, поэтому он заканчивается тем, что навсегда называет себя.
Причина использования StackOverflowError
Параметры и локальные переменные выделяются в стеке. Стек обычно находится в верхнем конце вашего адресного пространства, и, поскольку он используется, он направляется к нижней части адресного пространства. У вашего процесса также есть куча, которая живет в нижней части вашего процесса.
Перезапись буфера на стеке (Stackoverflow) | Защита Stack Canary | Протекция стека
Когда вы выделяете память, эта куча может расти в верхнем конце вашего адресного пространства. Как вы можете видеть, существует вероятность того, что куча «столкнется» со стеклом. Если нет места для нового стека кадров, StackOverflowError вызывается виртуальной машиной Java (JVM).
Если стек заполнен, вы не можете нажать, если вы это сделаете, вы получите ошибку переполнения стека.
Если стек пуст, вы не можете поп, если вы это сделаете, вы получите ошибку стека стека.
Что такое stacktrace?
Столбец — очень полезный инструмент для отладки. Это список вызовов метода, в которых приложение было посередине, когда было выбрано исключение. Это очень полезно, потому что оно не только показывает вам, где произошла ошибка, но также и то, как программа оказалась в этом месте кода.
Столбец — очень полезный инструмент для отладки. Это список вызовов метода, в которых приложение было посередине, когда было выбрано исключение. Это очень полезно, потому что оно не только показывает вам, где произошла ошибка, но также и то, как программа оказалась в этом месте кода.
Источник: programmera.ru
Ошибка StackOverflowError в Java
Узнайте, как происходит одна из наиболее распространенных ошибок Java – StackOverflowError – и как ее устранить.
1. Обзор
StackOverflowError может раздражать разработчиков Java, так как это одна из самых распространенных ошибок во время выполнения, с которой мы можем столкнуться.
В этой статье мы рассмотрим, как может возникнуть эта ошибка, рассмотрев различные примеры кода, а также то, как мы можем с ней справиться.
2. Кадры стека и как происходит ошибка StackOverflowError
Давайте начнем с основ. При вызове метода в стеке вызовов создается новый кадр стека. Этот кадр стека содержит параметры вызываемого метода, его локальные переменные и адрес возврата метода, т. е. точку, из которой выполнение метода должно продолжаться после возврата вызванного метода.
Stack Overflow — Секретная ачивка в моде OpenBlocks
Создание фреймов стека будет продолжаться до тех пор, пока не будет достигнут конец вызовов методов, найденных внутри вложенных методов.
Во время этого процесса, если JVM столкнется с ситуацией, когда нет места для создания нового кадра стека, он выдаст StackOverflowError .
Наиболее распространенной причиной, по которой JVM сталкивается с этой ситуацией, является unterminated/бесконечная рекурсия – в описании Javadoc для StackOverflowError упоминается, что ошибка возникает в результате слишком глубокой рекурсии в конкретном фрагменте кода.
Однако рекурсия-не единственная причина этой ошибки. Это также может произойти в ситуации, когда приложение продолжает вызывать методы из методов до тех пор, пока стек не будет исчерпан . Это редкий случай, поскольку ни один разработчик не будет намеренно следовать плохим методам кодирования. Другой редкой причиной является наличие огромного количества локальных переменных внутри метода .
Ошибка StackOverflowError также может быть вызвана, когда приложение предназначено для циклических отношений c между классами . В этой ситуации конструкторы друг друга вызываются повторно, что приводит к возникновению этой ошибки. Это также можно рассматривать как форму рекурсии.
Другой интересный сценарий, который вызывает эту ошибку, заключается в том, что экземпляр класса создается в том же классе, что и переменная экземпляра этого класса . Это приведет к тому, что конструктор одного и того же класса будет вызываться снова и снова (рекурсивно), что в конечном итоге приведет к ошибке StackOverflowError.
В следующем разделе мы рассмотрим некоторые примеры кода, демонстрирующие эти сценарии.
3. Ошибка StackOverflowError в действии
В примере, показанном ниже, StackOverflowError будет вызван из-за непреднамеренной рекурсии, когда разработчик забыл указать условие завершения для рекурсивного поведения:
public class UnintendedInfiniteRecursion < public int calculateFactorial(int number) < return number * calculateFactorial(number — 1); >>
Здесь ошибка возникает во всех случаях для любого значения, переданного в метод:
Однако в следующем примере указано условие завершения, но оно никогда не выполняется, если значение -1 передается в метод calculateFactorial () , который вызывает нескончаемую/бесконечную рекурсию:
public class InfiniteRecursionWithTerminationCondition < public int calculateFactorial(int number) < return number == 1 ? 1 : number * calculateFactorial(number — 1); >>
Этот набор тестов демонстрирует этот сценарий:
В данном конкретном случае ошибки можно было бы полностью избежать, если бы условие завершения было просто сформулировано как:
public class RecursionWithCorrectTerminationCondition < public int calculateFactorial(int number) < return number >
Вот тест, который показывает этот сценарий на практике:
Теперь давайте рассмотрим сценарий, в котором StackOverflowError возникает в результате циклических отношений между классами. Давайте рассмотрим ClassOne и classstwo , которые создают экземпляры друг друга внутри своих конструкторов, вызывая циклическую связь:
public class ClassOne < private int oneValue; private ClassTwo clsTwoInstance = null; public ClassOne() < oneValue = 0; clsTwoInstance = new ClassTwo(); >public ClassOne(int oneValue, ClassTwo clsTwoInstance) < this.oneValue = oneValue; this.clsTwoInstance = clsTwoInstance; >>
public class ClassTwo < private int twoValue; private ClassOne clsOneInstance = null; public ClassTwo() < twoValue = 10; clsOneInstance = new ClassOne(); >public ClassTwo(int twoValue, ClassOne clsOneInstance) < this.twoValue = twoValue; this.clsOneInstance = clsOneInstance; >>
Теперь предположим, что мы попытаемся создать экземпляр Class One , как показано в этом тесте:
Это заканчивается StackOverflowError , так как конструктор Class One создает экземпляр Class Two, и конструктор classwo снова создает экземпляр ClassOne. И это повторяется до тех пор, пока он не переполнит стек.
Далее мы рассмотрим, что происходит, когда экземпляр класса создается в том же классе, что и переменная экземпляра этого класса.
Как видно из следующего примера, Владелец счета создает экземпляр в качестве переменной экземпляра Владелец совместного счета :
public class AccountHolder
Когда Владелец учетной записи класс создается , a StackOverflowError выбрасывается из-за рекурсивного вызова конструктора, как показано в этом тесте:
4. Работа С Ошибкой StackOverflowError
Лучшее, что можно сделать при обнаружении StackOverflowError , – это осторожно проверить трассировку стека, чтобы определить повторяющийся шаблон номеров строк. Это позволит нам найти код, который имеет проблемную рекурсию.
Лучшее, что можно сделать при обнаружении || StackOverflowError||, – это осторожно проверить трассировку стека, чтобы определить повторяющийся шаблон номеров строк. Это позволит нам найти код, который имеет проблемную рекурсию.
Эта трассировка стека создается Бесконечной рекурсией С ручным тестом условия завершения , если мы опустим объявление ожидаемого исключения:
java.lang.StackOverflowError at c.b.s.InfiniteRecursionWithTerminationCondition .calculateFactorial(InfiniteRecursionWithTerminationCondition.java:5) at c.b.s.InfiniteRecursionWithTerminationCondition .calculateFactorial(InfiniteRecursionWithTerminationCondition.java:5) at c.b.s.InfiniteRecursionWithTerminationCondition .calculateFactorial(InfiniteRecursionWithTerminationCondition.java:5) at c.b.s.InfiniteRecursionWithTerminationCondition .calculateFactorial(InfiniteRecursionWithTerminationCondition.java:5)
Здесь можно увидеть повторение строки № 5. Именно здесь выполняется рекурсивный вызов. Теперь это просто вопрос изучения кода, чтобы увидеть, правильно ли выполняется рекурсия.
Вот трассировка стека, которую мы получаем, выполняя ручной тест циклической зависимости (опять же, без ожидаемого исключения):
java.lang.StackOverflowError at c.b.s.ClassTwo.(ClassTwo.java:9) at c.b.s.ClassOne.(ClassOne.java:9) at c.b.s.ClassTwo.(ClassTwo.java:9) at c.b.s.ClassOne.(ClassOne.java:9)
Эта трассировка стека показывает номера строк, которые вызывают проблему в двух классах, находящихся в циклической связи.
Строка номер 9 класса Два и строка номер 9 класса Один указывают на местоположение внутри конструктора, где он пытается создать экземпляр другого класса.
После тщательной проверки кода и если ни одно из следующих действий (или любая другая логическая ошибка кода) не является причиной ошибки:
- Неправильно реализованная рекурсия (т. е. без условия завершения)
- Циклическая зависимость между классами
- Создание экземпляра класса в том же классе, что и переменная экземпляра этого класса
Было бы неплохо попытаться увеличить размер стека. В зависимости от установленной JVM размер стека по умолчанию может варьироваться.
Флаг -Xss можно использовать для увеличения размера стека либо из конфигурации проекта, либо из командной строки.
5. Заключение
В этой статье мы более подробно рассмотрели StackOverflowError , включая то, как Java-код может вызвать его, а также как мы можем диагностировать и исправить его.
Исходный код, связанный с этой статьей, можно найти на GitHub .
- Метки stack, stackoverflowerror
Источник: javascopes.com
Ошибка сервера Minecraft [закрыт]
Скорее всего, данный вопрос не соответствует тематике Stack Overflow на русском, согласно правилам описанным в справке.
Закрыт 7 лет назад .
Друзей выкидывает с сервера Minecraft выдает:
Internal exception: Java.net.SocketTimeoutExcpetion:Red Timed out. А я остаюсь. Что делать?
Отслеживать
50.8k 80 80 золотых знаков 259 259 серебряных знаков 495 495 бронзовых знаков
задан 20 июл 2011 в 8:34
Никита Пережогин Никита Пережогин
27 1 1 серебряный знак 2 2 бронзовых знака
Вопрос не имеет отношения к программированию или системному администрированию.
9 янв 2016 в 11:25
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
- Проверьте настойки сервера, отключен ли онлайн мод online-mode=false
- Включен ли white-list=true
- Используете ли вы и ваши друзья идентичные версии сервера и клиентов
- Для установки имён используйте MinecraftSP.exe
- Если пытаетесь сделать локальный сервер через интеренет используйте Hamachi. Вашим друзья нужно будет вводить id Hamachi, который получмте после создания группы-локальных пользователей.
Это исключительно для локального сервера, к которому можно подключаться через интернет.
Да, запустив файл сервера он создаст файлы настороек и файл white-list. Сделайте в них изменения и перезапустите сервер.
В white-list введите ники ваших друзей и вас. Через Enter :
Источник: ru.stackoverflow.com