Expression error при вычислении возникло переполнение стека продолжение невозможно

I am pulling in to queries from Kusto. I have used filters and sorts to pair down the queries within the query editor. These queries are pulling in data from two 4G controllers we have in the field. Once filtered the atributes of the queries are listed below:   Query 1: 6 columns (3 text, 1 numeric,...

Hello! I am using a recursive function to append 10K results at a time. Do you think the following is affected by this bug?
Function:

let
    RecursiveElasticFetch = (relativepa, relativepa2, batchSize, urlBody, scrollBody, scrollID, counter, scrollEND, apiKey) =>

    let
        Results = if (scrollID = null) then
            //Initial Query
            Json.Document(Web.Contents("https://es:9200", [RelativePath=relativepa, Headers=[#"Authorization"=Text.Combine({"ApiKey ",apiKey,""}), #"Content-Type"="application/json"], Content = Text.ToBinary(urlBody)]))
        else
            //All other queries execute this to gather results from the scroll api even if the scroll id changes.
            Json.Document(Web.Contents("https://es:9200", [RelativePath=relativepa2, Headers=[#"Authorization"=Text.Combine({"ApiKey ",apiKey,""}), #"Content-Type"="application/json", MyHeader=Text.From(counter)], Content = Text.ToBinary(scrollBody&scrollID&scrollEND)])),

        //If this is the first time the function runs, the counter should be null so this will dynamically calcuate how many times this function needs to run.
        counter = if (counter = null) then
            //Dynamically get the counter - Note: You can uncomment the next line for testing and then comment out the Number.RoundUp
            //7
            Number.RoundUp(Results[hits][total][value]/Number.FromText(batchSize))
        else
            counter,

        //Store the hits from the ElasticSearch query into ParsedResults and if results already exist, append more results to generate the full table of events.
        ParsedResults = Table.FromList(Results[hits][hits], Splitter.SplitByNothing(), null, null, ExtraValues.Error),

        Return = if (counter > 0) then
            ParsedResults & RecursiveElasticFetch(relativepa, relativepa2, batchSize, urlBody, scrollBody, Results[_scroll_id], counter-1, scrollEND, apiKey)
        else
            ParsedResults
    in
        Return
in
    RecursiveElasticFetch

 If so, how would one apply a work around?

Here is a snippet of the query starting where the function above is called:

Source = RecursiveElasticFetch(relativepa, relativepa2, batchSize, urlBody, scrollBody, scrollID, counter, scrollEND, apiKey),
    #"Renamed Columns" = Table.RenameColumns(Source,{{"Column1", "es"}}),
    #"Expanded es" = Table.ExpandRecordColumn(#"Renamed Columns", "es", {"_index", "_source"}, {"_index", "_source"}),
    #"Expanded _source" = Table.ExpandRecordColumn(#"Expanded es", "_source", {"_label", "_createdAt", "data", "dataType", "tlp", "sighted", "_createdBy", "message", "ioc", "caseId", "relatedId", "tags"}, {"ObjectType", "DateCreated", "data", "dataType", "tlp", "sighted", "CreatedBy", "message", "ioc", "caseId", "relatedId", "tags"}),
    #"Expanded tags" = Table.ExpandListColumn(#"Expanded _source", "tags"),
    #"Duplicated Column" = Table.DuplicateColumn(#"Expanded tags", "DateCreated", "DateCreated - Copy"),
    #"Renamed Columns1" = Table.RenameColumns(#"Duplicated Column",{{"DateCreated - Copy", "TimeCreated"}}),
    #"Parsed Time" = Table.TransformColumns(#"Renamed Columns1",{{"TimeCreated", each Time.From(DateTimeZone.From(_)), type time}}),
    #"Parsed Date" = Table.TransformColumns(#"Parsed Time",{{"DateCreated", each Date.From(DateTimeZone.From(_)), type date}})
in
    #"Parsed Date"

Содержание

  1. Ошибка переполнения стека при импорте данных в Microsoft Power BI: «Оценка привела к переполнению стека и не может быть продолжена.’
  2. 1 ответ 1
  3. Что такое StackOverflow ошибка: раскрываем тайну
  4. Ошибка « stack overflow »
  5. Бесконечная рекурсия и ошибка «stack overflow»
  6. Глубокая рекурсия и ошибка «stack overflow»
  7. Проблемы с переменными в стеке и ошибка «stack overflow»
  8. Заключение
  9. Что на самом деле вызывает ошибку переполнения стека? [дубликат]
  10. 10 ответов
  11. описание из ошибок виртуальной машины (§6.3)
  12. вторая попытка.
  13. третья попытка.

Ошибка переполнения стека при импорте данных в Microsoft Power BI: «Оценка привела к переполнению стека и не может быть продолжена.’

При попытке импортировать данные из базы данных в Power BI (с использованием поставщика ADO.net Invantive Bridge) я получаю сообщение об ошибке:

Expression.Error: Evaluation resulted in a stack overflow and cannot continue.

Мне нравится знать, почему я получаю эту ошибку. Есть ли способ узнать, откуда исходит ошибка?

1 ответ 1

Это ошибка в Power BI, которая плохо анализирует исключения.

Вы можете найти фактическое сообщение об ошибке, выполнив следующие действия:

В диалоговом окне «Редактор запросов» или на главном экране выберите « Файл» > « Параметры и настройки» > « Параметры».

Перейдите в раздел «Диагностика» и установите флажок « Включить трассировку». Нажмите на кнопку Открыть следы. Закрыть диалоговое окно, нажав кнопку ОК.

Откроется проводник с путем, аналогичным пути C:UsersMeAppDataLocalMicrosoftPower BI DesktopTraces . Вернитесь в Power BI и нажмите « Обновить» на ленте.

Power BI создает несколько файлов журнала в ранее открытой папке. Откройте файл, начиная с Microsoft.Mashup.Container.NetFX40 . Это файл журнала, содержащий фактические сообщения об ошибках.

Найти последнее сообщение об ошибке. Обычно это можно найти, выполнив поиск ValidationException снизу вверх.

Как видите, эта ошибка была вызвана опечаткой в имени таблицы.

Источник

Что такое StackOverflow ошибка: раскрываем тайну

В мире программистов ошибка «stack overflow» очень известн а б лагодаря тому, что этот вид ошибки довольно распространен. А сам термин «stack overflow» известен еще больше , чем ошибка, благодаря одноименному англоязычному ресурсу «StackOverflow». Это сообщество программистов международного масштаба , и еще куча всего интересного. Поэтому не нужно путать ошибку « stack overflow » и веб-ресурс с таким же названием. В нашей статье речь пойдет об ошибке.

Ошибка «stack overflow» связана с переполнением стека. Она появляется в том случае, когда в стеке должно сохранит ь ся больше информации, чем он может уместить. Объем памяти стека задает программист при запуске программы. Если в процессе выполнения программы стек переполняется, тогда возникает ошибка « stack overflow » и программа аварийно завершает работу. Причин возникновения подобной ошибки может быть несколько.

Ошибка « stack overflow »

Нужно отметить, что ошибка « stack overflow » не связана с конкретным языком программирования, то есть она может возникнуть в программах на Java, C++, C, C# и других компилируемых языках.

Причин ее возникновения может быт ь несколько. К самым распространенным причинам относ я тся:

проблемы с переменными в стеке.

Бесконечная рекурсия и ошибка «stack overflow»

Бесконечная рекурсия редко возникает самостоятельно и по неизвестным причинам. Обычно программист:

забывает прописывать условие для выхода из рекурсии;

пишет неосознанную косвенную рекурсию.

Самая частая причина из категории «бесконечной рекурсии» — программист забывает прописывать условия выхода или же прописывает, но условия выхода не срабатывают.

Вот как это выглядит на С:

int factorial (int number)

return number * factorial(number — 1);

В описанном примере прописаны условия выхода из рекурсии, однако они никогда не сработают, если «number» будет отрицательным. Поэтому через несколько миллионов вызовов стек будет переполнен и возникнет ошибка «stack overflow». В некоторых языках программирования предусмотрена «защита» от таких рекурсий. В ни х р екурсия из конца функции конвертируется в цикл, что не будет расходовать стековую память. Н о п одобная «оптимизация» вызовет другую , менее опасную проблему — «зацикливание».

Неосознанная бесконечная рекурсия возникает в том случае, если программист по невнимательности распределяет один и тот же функционал программы между разными нагруженными функциями, а потом делает так, что они друг друга вызывают.

В коде это выглядит так:

int Object::getNumber(int index, bool& isChangeable)

int Object::getNumber(int index)

return getNumber(index, noValue);

Глубокая рекурсия и ошибка «stack overflow»

Глубокая рекурсия — это такая рекурсия, которая имеет свое окончание через определенное время, поэтому она не бесконечная. Однако памяти стека не хватит для завершения такой рекурсии, поэтому ошибка «stack overflow» обеспечена. Обычно такая ситуация заранее просчитывается программистом , п оэтому ее можно решить. Например , можно:

отыскать другой программный алгоритм для решения поставленной задачи, чтобы избежать применени я рекурсии;

«вынести» рекурсию за пределы аппаратного стека в динамический;

Глубокая рекурсия выглядит так:

void eliminateList(struct Item* that)

Проблемы с переменными в стеке и ошибка «stack overflow»

Если взглянуть на популярность возникновения «stack overflow error», то причина с проблемными переменными в стеке стоит на первом месте. Кроется она в том, что программист изначально выделяет слишком много памяти локальной переменной.

В данном случае может возникнуть такая ситуация, что массиву потребуется объем памяти, который стек не способен будет обеспечить, а значит , возникнет ошибка «stack overflow».

Заключение

Ошибка « stack overflow » возникает довольно часто. Каждый конкретный случай ее возникновения требует собственного решения. Одна причина объединяет возникновение такой ошибки — невнимательность программиста. Если « stack overflow error » возникла, значит , программист где-то что-то упустил или не доглядел.

Мы будем очень благодарны

если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.

Источник

Что на самом деле вызывает ошибку переполнения стека? [дубликат]

этот вопрос уже есть ответ здесь:

  • что такое StackOverflowError? 13 ответов

Я искал везде и не могу найти твердого ответа. Согласно документации, Java бросает java.ленг.StackOverflowError ошибка при следующих обстоятельствах:

кинули когда переполнение стека происходит из-за слишком глубокой рекурсии приложения.

но это вызывает два вопроса:

  • разве нет других способов для переполнения стека, не только через рекурсию?
  • происходит ли StackOverflowError до того, как JVM фактически переполняет стек или после?

подробнее о втором вопросе:

когда Java бросает StackOverflowError, можете ли вы с уверенностью предположить, что стек не записал в кучу? Если вы уменьшите размер стека или кучи в try / catch функции, которая вызывает переполнение стека, можете ли вы продолжить работу? Это где-нибудь задокументировано?

ответы, которые я не ищу:

  • StackOverflow происходит из-за плохой рекурсии.
  • StackOverflow происходит, когда куча встречается со стеком.

10 ответов

кажется, вы думаете, что a ошибка stackoverflow похоже на исключение переполнения буфера в собственных программах, когда есть риск записи в память, которая не была выделена для буфера, и, таким образом, повредить некоторые другие места памяти. Это не так.

JVM имеет заданную память, выделенную для каждого стека каждого потока, и если попытка вызвать метод происходит, чтобы заполнить эту память, JVM выдает ошибку. Как это сделать, если вы были попытка записи при индексе N массива длины N. повреждение памяти не может произойти. Стек не может записать в кучу.

StackOverflowError для стека то же, что OutOfMemoryError для кучи: он просто сигнализирует, что больше нет доступной памяти.

описание из ошибок виртуальной машины (§6.3)

StackOverflowError: реализация виртуальной машины Java исчерпала пространство стека для поток, как правило, потому, что поток выполняет неограниченное количество рекурсивных вызовов в результате ошибки в выполняющейся программе.

разве нет других способов переполнения стека, а не только через рекурсию?

конечно. Просто продолжайте вызывать методы, никогда не возвращаясь. Вам понадобится много методов, если вы не позволите рекурсии. На самом деле это не имеет значения: кадр стека-это кадр стека, является ли он одним из рекурсивных методов или нет, то же самое.

ответ на ваш второй вопрос: stackoverflow обнаруживается, когда JVM пытается выделите кадр стека для следующего вызова и найдите, что это невозможно. Таким образом, ничего не будет перезаписано.

нет ли других способов для переполнения стека, а не только через рекурсию?

Вызов принят 🙂 StackOverflowError без рекурсии (вызов не удался, см. комментарии):

компиляция со стандартом javac Test.java и запускать с java -Xss104k Test 2> out . После этого, more out скажу вам:

вторая попытка.

теперь идея еще проще. Примитивы в Java могут храниться на стек. Итак, давайте объявим много двойников, как double a1,a2,a3. . Этот скрипт может писать, компилировать и запускать код о нас:

и. Я получил кое-что неожиданное:

это 100% повторяется. Это связано с вашим вторым вопросом:

происходит ли StackOverflowError до фактического переполнения JVM стопку или после?

Итак, в случае OpenJDK 20.0-b12 мы можем видеть, что JVM во-первых взорванный. Но это похоже на ошибку, возможно, кто-то может подтвердить это в комментариях, потому что я не уверен. Должен ли я сообщить об этом? Возможно, он уже исправлен в какой-то новой версии. Согласно ссылка спецификации JVM (дан ЯБ Nizet в комментарии) JVM должен бросить StackOverflowError , не умирают:

если вычисление в потоке требует большей виртуальной машины Java стек, чем разрешено, виртуальная машина Java бросает StackOverflowError.

третья попытка.

мы хотим создать новый

наиболее распространенной причиной StackOverFlowError является чрезмерно глубокая или бесконечная рекурсия.

здесь two местах в памяти кучи и стека. The stack memory используется для хранения локальных переменных и вызов функции, в то время как heap memory используется для хранения объектов в Java.

если в стеке не осталось памяти для хранения вызова функции или локальной переменной, JVM бросит java.lang.StackOverFlowError

а если больше нет места кучи для создания объекта, JVM будет бросать java.lang.OutOfMemoryError

нет никакого «StackOverFlowException». Вы имеете в виду»StackOverFlowError».

Да, вы можете продолжать работать, если поймаете его, потому что стек очищается, когда вы это делаете, но это будет плохой и уродливый вариант.

когда именно возникает ошибка ? — Когда вы вызываете метод и JVM проверяет, достаточно ли памяти для этого. Конечно, ошибка возникает, если это невозможно.

  • нет, это единственный способ получить эту ошибку: заполняешь свою стопку. Но не только через рекурсию, но и вызывая методы, которые бесконечно вызывают другие методы. Это очень специфическая ошибка, поэтому нет.
  • он выбрасывается до того, как стек заполнен, именно тогда, когда вы его проверяете. Куда бы вы поместили данные, если нет свободного места ? Переопределение другим ? Неа.

есть два основных места, которые можно хранить в Java. Первый-это куча, которая используется для динамически выделенных объектов. new .

кроме того, каждый поток получает свой собственный стек, и он получает объем памяти, выделенной для этого стека.

когда вы вызываете метод, данные помещаются в стек для записи вызова метода, передаваемых параметров и любых локальных переменных. Метод с пятью локальными переменными и тремя параметры будут использовать больше пространства стека, чем void doStuff() метод без локальных переменных.

основными преимуществами стека являются отсутствие фрагментации памяти, все для одного вызова метода выделяется в верхней части стека, и что возврат из методов прост. Чтобы вернуться из метода, вы просто разматываете стек обратно к предыдущему методу, устанавливаете любое значение, необходимое для возвращаемого значения, и все готово.

потому что стек имеет фиксированный размер на поток, (обратите внимание, что спецификация Java не требует фиксированного размера, но большинство реализаций JVM на момент написания используют фиксированный размер), и поскольку пространство в стеке необходимо всякий раз, когда вы делаете вызов метода, надеюсь, теперь должно быть ясно, почему он может закончиться и что может вызвать его. Нет фиксированного количества вызовов методов, нет ничего конкретного о рекурсии, вы получаете исключение, которое вы пытаетесь вызвать метод, и недостаточно памяти.

конечно размер стеки установлены достаточно высоко, что маловероятно в обычном коде. В рекурсивном коде, хотя это может быть довольно легко рекурсировать на огромные глубины, и в этот момент Вы начинаете работать с этой ошибкой.

StackOverflowError возникает из-за приложение рекурсивно вызывает слишком глубоко (это не ответ, который вы ожидаете).

теперь другие вещи, чтобы случиться с StackOverflowError продолжает вызывать методы из методов, пока вы не получите StackOverflowError , но никто не может запрограммировать, чтобы получить StackOverflowError и даже если эти программисты делают это, они не следуют стандартам кодирования для цикломатическая complixity что каждый программист должен понимать во время программирования. Такая причина для «StackOverflowError» будет требует много времени, чтобы исправить это.

но неосознанно кодирование одной строки или двух строк, которые вызывают StackOverflowError понятно, и JVM бросает это, и мы можем исправить это мгновенно. здесь мой ответ с изображением для какого-то другого вопроса.

StackOverflow происходит, когда выполняется вызов функции и стек заполнен.

Как и исключение ArrayOutOfBoundException. Он не может ничего испортить, на самом деле очень возможно поймать его и оправиться от него.

обычно это происходит в результате неконтролируемой рекурсии, но это также может быть вызвано просто очень глубоким стеком вызовов функций.

в c# вы можете достичь переполнения стека другим способом, неправильно определив свойства объекта. Например :

Как вы можете видеть, это навсегда будет продолжать возвращать часы с прописной буквой H, которая сама по себе будет возвращать часы и так далее.

переполнение стека часто происходит также из-за нехватки памяти или при использовании управляемых языков, потому что ваш менеджер языков (CLR, JRE) обнаружит, что ваш код застрял в бесконечном петля.

  1. разве нет других способов переполнения стека, а не только через рекурсию?
  2. происходит ли StackOverflowError до того, как JVM фактически переполняет стек или после?

Это также может произойти, когда мы выделяем размер больше, чем предел стека (например. int x[10000000]; ).

ответ на второй

каждый поток имеет свой собственный стек, который содержит фрейм для каждого метода, выполняющегося в этом потоке. Таким образом, текущий метод выполнения находится в верхней части стека. Новый фрейм создается и добавляется (выталкивается) в верхнюю часть стека для каждого вызова метода. Кадр удаляется (выскакивает), когда метод возвращается нормально или если при вызове метода возникает необработанное исключение. Стек не управляется напрямую, за исключением объектов push и pop frame, и поэтому объекты фрейма могут быть выделены в куче, и память не должна быть смежной.

поэтому, рассматривая стек в потоке, мы можем сделать вывод.

стек может быть динамическим или фиксированным размером. Если поток требует большего стека, чем разрешено StackOverflowError бросается. Если поток требует нового фрейма и недостаточно памяти для его выделения, то OutOfMemoryError бросается.

Источник

When trying to import data from a database into Power BI (using the Invantive Bridge ADO.net provider) I get an error:

Expression.Error: Evaluation resulted in a stack overflow and cannot continue.

Power BI stack overflow Error

I like to know why I get this error. Is there a way to find out where the error is coming from?

Guido Leenders's user avatar

asked Mar 30, 2017 at 13:42

Goombah's user avatar

This is a bug with Power BI not parsing the exceptions well.

You can find the actual error message by performing the following steps:

  1. From the Query Editor dialog or the main screen, go to File > Options and settings > Options.

    dialog 1

  2. Go to Diagnostics and check Enable tracing. Click on Open traces folder. Dismiss the dialog by click on OK.

    dialog 2

  3. Explorer opens with a path similar to C:UsersMeAppDataLocalMicrosoftPower BI DesktopTraces. Go back to Power BI and click on Refresh in the ribbon.

  4. Power BI generates several log files in the folder previously opened. Open the file starting with Microsoft.Mashup.Container.NetFX40. This is the log file containing the actual error messages.

  5. Find the latest error message. Usually you can find that by searching for ValidationException from bottom to top.

    Sample:

    itgeneor028: Unknown table projjects ( Possible alternatives: (Projects, ProjectWBS)
       at Invantive.Data.ValidationException..ctor(String messageCode, String messageText, String kindRequest, String localStackTrace, String nk, Exception innerException)
    

    As you can see, this error was caused by a typo in the table name.

answered Mar 30, 2017 at 14:14

Patrick Hofman's user avatar

2

Что на самом деле вызывает ошибку переполнения стека? [дубликат]

этот вопрос уже есть ответ здесь:

  • что такое StackOverflowError?

    13 ответов

Я искал везде и не могу найти твердого ответа. Согласно документации, Java бросает java.ленг.StackOverflowError ошибка при следующих обстоятельствах:

кинули когда переполнение стека происходит из-за слишком глубокой рекурсии приложения.

но это вызывает два вопроса:

  • разве нет других способов для переполнения стека, не только через рекурсию?
  • происходит ли StackOverflowError до того, как JVM фактически переполняет стек или после?

подробнее о втором вопросе:

когда Java бросает StackOverflowError, можете ли вы с уверенностью предположить, что стек не записал в кучу? Если вы уменьшите размер стека или кучи в try / catch функции, которая вызывает переполнение стека, можете ли вы продолжить работу? Это где-нибудь задокументировано?

ответы, которые я не ищу:

  • StackOverflow происходит из-за плохой рекурсии.
  • StackOverflow происходит, когда куча встречается со стеком.

10 ответов


кажется, вы думаете, что a ошибка stackoverflow похоже на исключение переполнения буфера в собственных программах, когда есть риск записи в память, которая не была выделена для буфера, и, таким образом, повредить некоторые другие места памяти. Это не так.

JVM имеет заданную память, выделенную для каждого стека каждого потока, и если попытка вызвать метод происходит, чтобы заполнить эту память, JVM выдает ошибку. Как это сделать, если вы были попытка записи при индексе N массива длины N. повреждение памяти не может произойти. Стек не может записать в кучу.

StackOverflowError для стека то же, что OutOfMemoryError для кучи: он просто сигнализирует, что больше нет доступной памяти.

описание из ошибок виртуальной машины (§6.3)

StackOverflowError: реализация виртуальной машины Java исчерпала пространство стека для поток, как правило, потому, что поток выполняет неограниченное количество рекурсивных вызовов в результате ошибки в выполняющейся программе.


разве нет других способов переполнения стека, а не только через рекурсию?

конечно. Просто продолжайте вызывать методы, никогда не возвращаясь. Вам понадобится много методов, если вы не позволите рекурсии. На самом деле это не имеет значения: кадр стека-это кадр стека, является ли он одним из рекурсивных методов или нет, то же самое.

ответ на ваш второй вопрос: stackoverflow обнаруживается, когда JVM пытается выделите кадр стека для следующего вызова и найдите, что это невозможно. Таким образом, ничего не будет перезаписано.


нет ли других способов для переполнения стека, а не только
через рекурсию?

Вызов принят :) StackOverflowError без рекурсии (вызов не удался, см. комментарии):

public class Test
{
    final static int CALLS = 710;

    public static void main(String[] args)
    {
        final Functor[] functors = new Functor[CALLS];
        for (int i = 0; i < CALLS; i++)
        {
            final int finalInt = i;
            functors[i] = new Functor()
            {
                @Override
                public void fun()
                {
                    System.out.print(finalInt + " ");
                    if (finalInt != CALLS - 1)
                    {
                        functors[finalInt + 1].fun();
                    }
                }
            };
        }
        // Let's get ready to ruuuuuuumble!
        functors[0].fun(); // Sorry, couldn't resist to not comment in such moment. 
    }

    interface Functor
    {
        void fun();
    }
}

компиляция со стандартом javac Test.java и запускать с java -Xss104k Test 2> out. После этого, more out скажу вам:

Exception in thread "main" java.lang.StackOverflowError

вторая попытка.

теперь идея еще проще. Примитивы в Java могут храниться на стек. Итак, давайте объявим много двойников, как double a1,a2,a3.... Этот скрипт может писать, компилировать и запускать код о нас:

#!/bin/sh

VARIABLES=4000
NAME=Test
FILE=$NAME.java
SOURCE="public class $NAME{public static void main(String[] args){double "
for i in $(seq 1 $VARIABLES);
do
    SOURCE=$SOURCE"a$i,"
done
SOURCE=$SOURCE"b=0;System.out.println(b);}}"
echo $SOURCE > $FILE
javac $FILE
java -Xss104k $NAME

и… Я получил кое-что неожиданное:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007f4822f9d501, pid=4988, tid=139947823249152
#
# JRE version: 6.0_27-b27
# Java VM: OpenJDK 64-Bit Server VM (20.0-b12 mixed mode linux-amd64 compressed oops)
# Derivative: IcedTea6 1.12.6
# Distribution: Ubuntu 10.04.1 LTS, package 6b27-1.12.6-1ubuntu0.10.04.2
# Problematic frame:
# V  [libjvm.so+0x4ce501]  JavaThread::last_frame()+0xa1
#
# An error report file with more information is saved as:
# /home/adam/Desktop/test/hs_err_pid4988.log
#
# If you would like to submit a bug report, please include
# instructions how to reproduce the bug and visit:
#   https://bugs.launchpad.net/ubuntu/+source/openjdk-6/
#
Aborted

это 100% повторяется. Это связано с вашим вторым вопросом:

происходит ли StackOverflowError до фактического переполнения JVM
стопку или после?

Итак, в случае OpenJDK 20.0-b12 мы можем видеть, что JVM во-первых взорванный. Но это похоже на ошибку, возможно, кто-то может подтвердить это в комментариях, потому что я не уверен. Должен ли я сообщить об этом? Возможно, он уже исправлен в какой-то новой версии… Согласно ссылка спецификации JVM (дан ЯБ Nizet в комментарии) JVM должен бросить StackOverflowError, не умирают:

если вычисление в потоке требует большей виртуальной машины Java
стек, чем разрешено, виртуальная машина Java бросает
StackOverflowError.


третья попытка.

public class Test {
    Test test = new Test();

    public static void main(String[] args) {
        new Test();
    }
}

мы хотим создать новый

27

автор: Adam Stelmaszczyk


наиболее распространенной причиной StackOverFlowError является чрезмерно глубокая или бесконечная рекурсия.

например:

public int yourMethod(){
       yourMethod();//infinite recursion
}

В Java:

здесь two местах в памяти кучи и стека. The stack memory используется для хранения локальных переменных и вызов функции, в то время как heap memory используется для хранения объектов в Java.

если в стеке не осталось памяти для хранения вызова функции или локальной переменной, JVM бросит java.lang.StackOverFlowError

а если больше нет места кучи для создания объекта, JVM будет бросать java.lang.OutOfMemoryError


нет никакого «StackOverFlowException». Вы имеете в виду»StackOverFlowError».

Да, вы можете продолжать работать, если поймаете его, потому что стек очищается, когда вы это делаете, но это будет плохой и уродливый вариант.

когда именно возникает ошибка ? — Когда вы вызываете метод и JVM проверяет, достаточно ли памяти для этого. Конечно, ошибка возникает, если это невозможно.

  • нет, это единственный способ получить эту ошибку: заполняешь свою стопку. Но не только через рекурсию, но и вызывая методы, которые бесконечно вызывают другие методы. Это очень специфическая ошибка, поэтому нет.
  • он выбрасывается до того, как стек заполнен, именно тогда, когда вы его проверяете. Куда бы вы поместили данные, если нет свободного места ? Переопределение другим ? Неа.

есть два основных места, которые можно хранить в Java. Первый-это куча, которая используется для динамически выделенных объектов. new.

кроме того, каждый поток получает свой собственный стек, и он получает объем памяти, выделенной для этого стека.

когда вы вызываете метод, данные помещаются в стек для записи вызова метода, передаваемых параметров и любых локальных переменных. Метод с пятью локальными переменными и тремя параметры будут использовать больше пространства стека, чем void doStuff() метод без локальных переменных.

основными преимуществами стека являются отсутствие фрагментации памяти, все для одного вызова метода выделяется в верхней части стека, и что возврат из методов прост. Чтобы вернуться из метода, вы просто разматываете стек обратно к предыдущему методу, устанавливаете любое значение, необходимое для возвращаемого значения, и все готово.

потому что стек имеет фиксированный размер на поток, (обратите внимание, что спецификация Java не требует фиксированного размера, но большинство реализаций JVM на момент написания используют фиксированный размер), и поскольку пространство в стеке необходимо всякий раз, когда вы делаете вызов метода, надеюсь, теперь должно быть ясно, почему он может закончиться и что может вызвать его. Нет фиксированного количества вызовов методов, нет ничего конкретного о рекурсии, вы получаете исключение, которое вы пытаетесь вызвать метод, и недостаточно памяти.

конечно размер стеки установлены достаточно высоко, что маловероятно в обычном коде. В рекурсивном коде, хотя это может быть довольно легко рекурсировать на огромные глубины, и в этот момент Вы начинаете работать с этой ошибкой.


StackOverflowError возникает из-за приложение рекурсивно вызывает слишком глубоко (это не ответ, который вы ожидаете).

теперь другие вещи, чтобы случиться с StackOverflowError продолжает вызывать методы из методов, пока вы не получите StackOverflowError, но никто не может запрограммировать, чтобы получить StackOverflowError и даже если эти программисты делают это, они не следуют стандартам кодирования для цикломатическая complixity что каждый программист должен понимать во время программирования. Такая причина для «StackOverflowError» будет требует много времени, чтобы исправить это.

но неосознанно кодирование одной строки или двух строк, которые вызывают StackOverflowError понятно, и JVM бросает это, и мы можем исправить это мгновенно. здесь мой ответ с изображением для какого-то другого вопроса.


StackOverflow происходит, когда выполняется вызов функции и стек заполнен.

Как и исключение ArrayOutOfBoundException. Он не может ничего испортить, на самом деле очень возможно поймать его и оправиться от него.

обычно это происходит в результате неконтролируемой рекурсии, но это также может быть вызвано просто очень глубоким стеком вызовов функций.


в c# вы можете достичь переполнения стека другим способом, неправильно определив свойства объекта.
Например :

private double hours;

public double Hours
        {
            get { return Hours; }
            set { Hours = value; }
        }

Как вы можете видеть, это навсегда будет продолжать возвращать часы с прописной буквой H, которая сама по себе будет возвращать часы и так далее.

переполнение стека часто происходит также из-за нехватки памяти или при использовании управляемых языков, потому что ваш менеджер языков (CLR, JRE) обнаружит, что ваш код застрял в бесконечном петля.

0

автор: Bryan Arbelo — MaG3Stican


но это вызывает два вопроса:

  1. разве нет других способов переполнения стека, а не только через рекурсию?
  2. происходит ли StackOverflowError до того, как JVM фактически переполняет стек или после?
  1. Это также может произойти, когда мы выделяем размер больше, чем предел стека (например. int x[10000000];).

  2. ответ на второй

каждый поток имеет свой собственный стек, который содержит фрейм для каждого метода, выполняющегося в этом потоке. Таким образом, текущий метод выполнения находится в верхней части стека. Новый фрейм создается и добавляется (выталкивается) в верхнюю часть стека для каждого вызова метода. Кадр удаляется (выскакивает), когда метод возвращается нормально или если при вызове метода возникает необработанное исключение. Стек не управляется напрямую, за исключением объектов push и pop frame, и поэтому объекты фрейма могут быть выделены в куче, и память не должна быть смежной.

поэтому, рассматривая стек в потоке, мы можем сделать вывод.

стек может быть динамическим или фиксированным размером. Если поток требует большего стека, чем разрешено StackOverflowError бросается. Если поток требует нового фрейма и недостаточно памяти для его выделения, то OutOfMemoryError бросается.

вы можете получить описание для JVM здесь


Понравилась статья? Поделить с друзьями:
  • Expression error параметр csv document columns недопустим
  • Expression error доступ к ресурсу запрещен power bi
  • Expression error аргументы 2 были переданы функции которая ожидает 1 excel
  • Expression error we cannot convert the value null to type logical
  • Expression error unable to find faction