Что делать с java.lang.OutOfMemoryError: пространство кучи Java [дубликат]

Почти все предоставленные ответы требуют полной десериализации JSON в объект Java перед тем, как получить доступ к значению интересующего свойства. Другой альтернативой, которая не идет по этому пути, является использование JsonPATH , который похож на XPath для JSON и позволяет перемещаться по объектам JSON.

Это спецификация и хорошие люди в JayWay создали Java-реализацию для спецификации, которую вы можете найти здесь: https://github.com/jayway/JsonPath

Поэтому, чтобы использовать его, добавьте его в свой проект , например:


    com.jayway.jsonpath
    json-path
    ${version}

и использовать:

String pageName = JsonPath.read(yourJsonString, "$.pageInfo.pageName");
String pagePic = JsonPath.read(yourJsonString, "$.pageInfo.pagePic");
String post_id = JsonPath.read(yourJsonString, "$.pagePosts[0].post_id");

и т. д. ...

Проверьте дополнительную страницу спецификации JsonPath для получения дополнительной информации о других способах к поперечному JSON.

4
задан Raedwald 1 July 2014 в 15:03
поделиться

4 ответа

OutOfMemoryError - это исключение, созданное виртуальной машиной Java (JVM), потому что ему необходимо выделить память для (нового) объекта, но для объекта недостаточно памяти. JVM сначала попытается освободить память, используемую мертвыми объектами, запустит сборщик мусора .

Поскольку OutOfMemoryError является VirtualMachineError, JVM разрешено бросить его в любое время , хотя он должен попытаться освободить память через сборку мусора в первую очередь .

Однако на практике это, скорее всего, будет выбрано из new, который пытался создать объект, для которого память не может быть выделена. Таким образом, вы должны сначала изучить stacktrace, связанный с исключением, для подсказки о причине проблемы, , как и для любого другого исключения .

  • Если исключение из-за попытки выделить массив (например, int[] values = new int[n]) причиной может быть то, что вы пытаетесь создать слишком большой массив (слишком большой размер n). Вы ошиблись при вычислении размера массива, который вам нужен?
  • Если исключение выбрано из попытки выделить массив в методе класса контейнера, написанном кем-то другим, причина может быть что ваш код просит контейнер хранить чрезмерное количество вещей. Такие методы, как ArrayList.reserve(int) и HashMap(int), должны выделять хранилище для будущего использования. Вы допустили ошибку при вычислении размера контейнера, который вам нужен?
  • Если исключение выбрасывается из цикла, причиной может быть то, что код слишком много циклов. Правильно ли установлено условие завершения цикла? Если это for цикл, вы просите его зациклировать правильное количество раз?

Если stacktrace не дает достаточного количества подсказок, вы можете попробовать использовать профилировщик кучи. Это программа мониторинга, которая позволяет вам анализировать память, используемую для объектов во время работы программы, или рассматривает кучу кучи кучи , записанную при выходе программы. Он может предоставлять информацию о размерах, числе и классах объектов, хранящихся в памяти.

JVM имеет конечный объем памяти , доступный для него. Вы можете сделать вывод, что программа работает правильно, но для этого требуется больше памяти для работы, чем было доступно для нее. Если вы явно не укажете JVM, сколько памяти использовать, большинство реализаций выберет разумную величину по умолчанию в зависимости от объема оперативной памяти, которую имеет ваш компьютер, но эта сумма может быть слишком мала для вашей программы , Параметры командной строки для JVM могут управлять объемом памяти. Для большинства реализаций JVM наиболее важными из них являются -Xmx и -Xms.

9
ответ дан 4 revs, 2 users 76% 26 August 2018 в 23:39
поделиться

Чтобы отладить OutOfMemoryError, вызовите JVM с опцией -XX:+HeapDumpOnOutOfMemoryError, которая вызовет выгрузку кучи при возникновении OutOfMemoryError. Затем используйте инструмент, например VisualVM , jhat или fasthat , чтобы посмотреть на кучу кучи.

Вы также можете сгенерировать дамп кучи вручную в любое время с помощью jmap с опцией -dump.

Раскрытие: я являюсь сторонником fasthat, который является вилкой jhat .

4
ответ дан Chris Jester-Young 26 August 2018 в 23:39
поделиться

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

0
ответ дан Darshan Lila 26 August 2018 в 23:39
поделиться

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

Итак, чтобы преодолеть эту проблему, перейдите в каталог bin tomcat и создайте новый файл setenv .bat и определить PermSize в этом файле, как показано ниже:

установить JAVA_OPTS = -Dfile.encoding = UTF-8 -Xms512m -Xmx1024m -XX: PermSize = 512m -XX: MaxPermSize = 1024m

PermSize может быть настроен на более высокий диапазон в соответствии с требованиями приложения.

0
ответ дан Mike Clark 26 August 2018 в 23:39
поделиться
Другие вопросы по тегам:

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