Resource hacker out of memory error

Правила форума  |  Как оформлять свои темы и комментарии  |  Как делать крутые скриншоты  |  ВАЖНО

Skip to content

  • ТВикинариум
  • Форум
  • Поддержка
  • PRO
  • Войти

ФорумXpucT2022-08-18T02:06:35+03:00

Вы должны войти, чтобы создавать сообщения и темы.

Недостаточно памяти

Profile photo ofDorimi
Цитата: Андрей от 27.07.2022, 09:30

Утро доброе, господа хорошие!

В процессе использования Resource Hacker’а столкнулся с пренеприятнейшей чередой ошибок, по типу «Недостаточно памяти» и тому подобных. Формулировок таких уведомлений было 3 или 4 разных, сходу удалось воспроизвести две. Случается это при попытке открыть/сохранить SFX-архивы. Не уверен, что это имеет отношение к программе — поэтому создаю тему в категории общих вопросов. Гуглятся эти ошибки очень неохотно. Не знаю как бы они звучали точно на английском языке, но удалось выяснить, что в процессе эксплуатации этой программы люди периодически сталкиваются с ошибками «Out of memory/system resources». Тем не менее решения этих проблем внятного не было, чаще всего рекомендуют игнорировать эти ошибки, но у меня они препятствуют просмотру и редактированию некоторых файлов через Resource Hacker, и просто проигнорировать их не представляется возможным.

Методы устранения подобных ошибок в системе (в отрыве от Resource Hacker’а) мне не подошли. В их числе было редактирование в реестре параметра Windows по пути HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerSubSystems, а также добавление в реестр параметра IRPStackSize по пути HKEY_LOCAL_MACHINESystemCurrentControlSetServicesLanmanServerParameters. В общем, как обычно — сам не разобрался, вся надежда на вас. Буду признателен за помощь!

С уважением, Андрей!

Утро доброе, господа хорошие!

В процессе использования Resource Hacker’а столкнулся с пренеприятнейшей чередой ошибок, по типу «Недостаточно памяти» и тому подобных. Формулировок таких уведомлений было 3 или 4 разных, сходу удалось воспроизвести две. Случается это при попытке открыть/сохранить SFX-архивы. Не уверен, что это имеет отношение к программе — поэтому создаю тему в категории общих вопросов. Гуглятся эти ошибки очень неохотно. Не знаю как бы они звучали точно на английском языке, но удалось выяснить, что в процессе эксплуатации этой программы люди периодически сталкиваются с ошибками «Out of memory/system resources». Тем не менее решения этих проблем внятного не было, чаще всего рекомендуют игнорировать эти ошибки, но у меня они препятствуют просмотру и редактированию некоторых файлов через Resource Hacker, и просто проигнорировать их не представляется возможным.

Методы устранения подобных ошибок в системе (в отрыве от Resource Hacker’а) мне не подошли. В их числе было редактирование в реестре параметра СкопированоWindows по пути СкопированоHKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerSubSystems, а также добавление в реестр параметра СкопированоIRPStackSize по пути СкопированоHKEY_LOCAL_MACHINESystemCurrentControlSetServicesLanmanServerParameters. В общем, как обычно — сам не разобрался, вся надежда на вас. Буду признателен за помощь!

С уважением, Андрей!

Голосуйте — палец вниз.0Голосуйте — палец вверх.0

Цитата: Mikhail от 27.07.2022, 09:37

Добрый🖐.
От админа запускал?

Добрый🖐.
От админа запускал?

Голосуйте — палец вниз.0Голосуйте — палец вверх.0
«Любой дурак может знать. Дело в том, чтобы понять.» — Альберт Эйнштейн

Profile photo ofDorimi
Цитата: Андрей от 27.07.2022, 09:42

Я открываю приложения через контекстное меню (или «Отправить»), но на исполнительном файле Resource Hacker’а установлена галочка «Запускать эту программу от имени администратора». При попытке открыть файл через сам Resource Hacker — та же песня. Если что (забыл добавить, может это важно) — размер оперативной памяти — 24 GB, файл подкачки в системе отключён.

Я открываю приложения через контекстное меню (или «Отправить»), но на исполнительном файле Resource Hacker’а установлена галочка «Запускать эту программу от имени администратора». При попытке открыть файл через сам Resource Hacker — та же песня. Если что (забыл добавить, может это важно) — размер оперативной памяти — 24 GB, файл подкачки в системе отключён.

Голосуйте — палец вниз.0Голосуйте — палец вверх.0

Цитата: Mikhail от 27.07.2022, 09:47

Откуда качал Resource Hacker?, с офф сайта возьми, проверь, может прав каких то недостаточно, что не может редачить ресурсы и сохранять их.
Файл подкачки..вряд ли на такую программу бы не хватило ОЗУ.

Откуда качал Resource Hacker?, с офф сайта возьми, проверь, может прав каких то недостаточно, что не может редачить ресурсы и сохранять их.
Файл подкачки..вряд ли на такую программу бы не хватило ОЗУ.

Голосуйте — палец вниз.0Голосуйте — палец вверх.0
«Любой дурак может знать. Дело в том, чтобы понять.» — Альберт Эйнштейн

Profile photo ofDorimi
Цитата: Андрей от 27.07.2022, 09:55

Качал по ссылке из этого поста. Если честно, версия судя по всему последняя, и нет особого желания перекачивать с официального сайта (поскольку стремился установить портативную версию). Но если есть вероятность, что проблема конкретно в этом Resource Hacker’е (с этого форума) — перекачаю.

Что касается ОЗУ — эта ошибка возникает не всегда, а только при редактировании и сохранении некоторых файлов, чаще всего более 1,5 ГБ весом. Все маленькие приложения открываются без проблем.

Качал по ссылке из этого поста. Если честно, версия судя по всему последняя, и нет особого желания перекачивать с официального сайта (поскольку стремился установить портативную версию). Но если есть вероятность, что проблема конкретно в этом Resource Hacker’е (с этого форума) — перекачаю.

Что касается ОЗУ — эта ошибка возникает не всегда, а только при редактировании и сохранении некоторых файлов, чаще всего более 1,5 ГБ весом. Все маленькие приложения открываются без проблем.

Голосуйте — палец вниз.0Голосуйте — палец вверх.0

Цитата: Mikhail от 27.07.2022, 09:59

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

Не нужно перекачивать тогда, это и есть с офф сайта и так портативная версия.

Что касается ОЗУ — эта ошибка возникает не всегда, а только при редактировании и сохранении некоторых файлов, чаще всего более 1,5 ГБ весом. Все маленькие приложения открываются без проблем.

Тогда включаем файл подкачки, проверь.
И сделай скрин с диспетчером > память > выделено,  когда появляется эта ошибка.

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

Не нужно перекачивать тогда, это и есть с офф сайта и так портативная версия.

Что касается ОЗУ — эта ошибка возникает не всегда, а только при редактировании и сохранении некоторых файлов, чаще всего более 1,5 ГБ весом. Все маленькие приложения открываются без проблем.

Тогда включаем файл подкачки, проверь.
И сделай скрин с диспетчером > память > выделено,  когда появляется эта ошибка.

Голосуйте — палец вниз.0Голосуйте — палец вверх.0
«Любой дурак может знать. Дело в том, чтобы понять.» — Альберт Эйнштейн

Profile photo ofDorimi
Цитата: Андрей от 27.07.2022, 10:04

Установил файл подкачки на 4 ГБ — не помогло. Вот диспетчер задач.

Установил файл подкачки на 4 ГБ — не помогло. Вот диспетчер задач.

Голосуйте — палец вниз.0Голосуйте — палец вверх.0

Цитата: Mikhail от 27.07.2022, 10:10

Не, подкачка тут не причем, можно отключать.
Других пока догадок у меня нет, даже воспроизвести не могу проблему, чтоб понять, везде все работает, на виртуалках, на реальных ПК.
Что-то мне кажется с правами, другой ПК есть, перетащи Resource Hacker туда и воспроизведи все то же самое, будет ли ошибка.

Не, подкачка тут не причем, можно отключать.
Других пока догадок у меня нет, даже воспроизвести не могу проблему, чтоб понять, везде все работает, на виртуалках, на реальных ПК.
Что-то мне кажется с правами, другой ПК есть, перетащи Resource Hacker туда и воспроизведи все то же самое, будет ли ошибка.

Голосуйте — палец вниз.0Голосуйте — палец вверх.0
«Любой дурак может знать. Дело в том, чтобы понять.» — Альберт Эйнштейн

Цитата: Mikhail от 27.07.2022, 10:16

А все, я спотыкнулся об ошибку), засунул 2гига один файл он его норм переварил и сохранил, сейчас еще раз кинул, 900мб sfx архив и он выдал ошибку. Видать софт такой.

А все, я спотыкнулся об ошибку), засунул 2гига один файл он его норм переварил и сохранил, сейчас еще раз кинул, 900мб sfx архив и он выдал ошибку. Видать софт такой.

Голосуйте — палец вниз.0Голосуйте — палец вверх.0
«Любой дурак может знать. Дело в том, чтобы понять.» — Альберт Эйнштейн

Profile photo ofDorimi
Цитата: Андрей от 27.07.2022, 10:18

Перенёс на второй ноутбук, файлы в том же самом Resource Hacker’е открываются моментально без каких-либо вопросов.

Перенёс на второй ноутбук, файлы в том же самом Resource Hacker’е открываются моментально без каких-либо вопросов.

Голосуйте — палец вниз.0Голосуйте — палец вверх.0

Profile photo ofDorimi
Цитата: Андрей от 27.07.2022, 10:38

Возможно, частично проблема в самом SFX-архиве. Тот, что вообще не запускался, был упакован, как самораспаковывающийся ZIP-архив. При его перепаковке в SFX RAR — спокойно открылся через Resource Hacker, однако при сохранении снова выдал вот такую ошибку, которую уже можно проигнорировать, поскольку изменения он всё-таки сохранил.

Почему частично? Просто тот же самый ZIP-архив, тем же самым Resource Hacker’ом открылся на втором ноутбуке..

Возможно, частично проблема в самом SFX-архиве. Тот, что вообще не запускался, был упакован, как самораспаковывающийся ZIP-архив. При его перепаковке в SFX RAR — спокойно открылся через Resource Hacker, однако при сохранении снова выдал вот такую ошибку, которую уже можно проигнорировать, поскольку изменения он всё-таки сохранил.

Почему частично? Просто тот же самый ZIP-архив, тем же самым Resource Hacker’ом открылся на втором ноутбуке..

Голосуйте — палец вниз.0Голосуйте — палец вверх.0

Цитата: Mikhail от 27.07.2022, 10:43

Да, sfx сохраняет с ошибкой такой же как у тебя(но sfx большого объема почему-то), но сохраняет, обычный какой нить exe файл как выше писал 2гига открыл бес проблем и сохранил.

Да, sfx сохраняет с ошибкой такой же как у тебя(но sfx большого объема почему-то), но сохраняет, обычный какой нить exe файл как выше писал 2гига открыл бес проблем и сохранил.

Голосуйте — палец вниз.0Голосуйте — палец вверх.0
«Любой дурак может знать. Дело в том, чтобы понять.» — Альберт Эйнштейн

Profile photo ofDorimi
Цитата: Андрей от 27.07.2022, 10:45

Хотя вряд ли даже частично — вероятнее всему причиной тому вес конечного файла. Как ZIP он весил 1,72 ГБ, а как RAR стал 1,49 ГБ. Вероятнее всего срабатывает эта планка в виде полутора гигабайт, которую я заметил с самого начала. Чувствую, что дело именно в ноутбуке, но не пойму пока где именно собака порылась..

Хотя вряд ли даже частично — вероятнее всему причиной тому вес конечного файла. Как ZIP он весил 1,72 ГБ, а как RAR стал 1,49 ГБ. Вероятнее всего срабатывает эта планка в виде полутора гигабайт, которую я заметил с самого начала. Чувствую, что дело именно в ноутбуке, но не пойму пока где именно собака порылась..

Голосуйте — палец вниз.0Голосуйте — палец вверх.0

Многие пользователи ПК во время работы с какой-либо программой могут столкнуться с «вылетом» указанной программы, и появившимся сообщением «Out of memory». Возникшая проблема может иметь множество причин, начиная от банального недостатка памяти на пользовательском ПК, и заканчивая некорректной работой с памятью какой-либо программы.

  • Причины появления дисфункции
  • Как исправить ошибку «Out of memory»
  • Заключение

Ошибка out of memory

Причины появления дисфункции

Сообщение «Out of memory» (в переводе дословно «вне памяти», или «недостаточно памяти») обычно возникает при недостатке памяти на пользовательском компьютере. В частности же, в появлении данной ошибки «виновен» следующий набор факторов:

  • Недостаток памяти RAM на вашем ПК (рабочей памяти, планки которой установлены на материнской плате вашего компьютера). Если на вашем компьютере установлен всего 1 гигабайт памяти, вы будете встречаться с описываемой ошибкой довольно часто. Нормальным же ныне считается наличие на компьютере 4 гигабайт памяти и выше;
  • Недостаток места на жёстком диске.

Когда вашему компьютеру не хватает физической R.A.M. памяти, он заимствует часть места на жёстком диске, и создаёт так называемую «виртуальную память». Система временно хранит в такой виртуальной памяти ту часть данных, которая не помещается в памяти обычной. Такие данные обычно хранятся в файле «pagefile.sys», размер которого может увеличиваться или уменьшаться в зависимости от специфики работы вашей ОС. Если на диске будет недостаточно места, файл «pagefile.sys» не сможет расти, и пользователь получит рассматриваемую ошибку.

  • При одновременном запуске на ПК большого количества программ, каждая из которых бронирует часть памяти ПК под свои задачи;
  • При запуск большого количества вкладок браузера. Веб-навигаторы уровня «Firefox» или «Google Chrome» способны занимать от 500 мегабайт до 1 гигабайта памяти под свой функционал, при этом число открытых вкладок и соответствующей обслуживающей памяти может быть ограничено системой. Специалисты Майрософт называют такую проблему «the desktop heap limitation» — «ограничение кучи рабочего стола»);
  • Некорректная работа с памятью ряда программ (наиболее часто это игровые программы);
  • Не оптимальный размер файла подкачки, с которым работает система.Планка памяти и датчик

Как исправить ошибку «Out of memory»

Для решения указанной проблемы рекомендую сделать следующее:

  1. Перезагрузите ваш ПК, и запустите требуемую программу вновь. Возможно, что проблема имеет случайный характер, и более повторяться не будет;
  2. Перед запуском нужной программы закройте другие ненужные программы (браузер, музыкальный или видео плеер, текстовый или графический редактор, мессенджер и так далее);
  3. Если проблема возникает во время серфинга в сети, закройте всё множество вкладок вашего браузера (при наличии), оставив лишь одну или две.Много открытых вкладок

Альтернативным вариантом решения проблемы является установка соответствующего фикса от Майкрософт. Или использование расширений или дополнений для браузера уровня «The Great Suspender» для «Google Chrome», хорошо работающего с ненужными вкладками браузера.

  • Добавьте оперативной памяти на ваш ПК. Если у вас на компьютере установлено 1-2 гигабайта памяти, будет оптимальным довести её объём до 4 гигабайт (а для 64-битных Виндовс 7, 8 и 10 версии рекомендую 8 и более гигабайт);Планка памяти
  • Убедитесь, что на вашем жёстком диске (или SSD) достаточно свободного места. При необходимости, освободите диск от ненужных файлов;
  • Используйте инструмент командной строки BCDEdit для изменения параметров загрузки системы. Если у вас на ПК установлена Виндовс 7 и более, запустите командную строку от имени администратора на Виндовс 7 и Виндовс 10, и в ней наберите:

bcdedit/set IncreaseUserVa 3072

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

bcdedit /set IncreaseUserVa 2560 что позволит задействовать 2,5 гигабайта вместо ранее забронированных 3.

Если ситуацию этим исправить не удалось, верните настройки на состояние по умолчанию:

bcdedit /deletevalue IncreaseUserVa

  • Увеличьте объём файла подкачки. Нажмите кнопку «Пуск», в строке поиска введите sysdm.cpl и нажмите ввод. В открывшемся окне настроек системы выберите «Дополнительно» — «Быстродействие» — «Параметры» — «Дополнительно» — «Виртуальная память» — «Изменить». Снимите галочку с опции автоматического размера, поставьте галочку на «Указать размер», и поставьте исходный размер в 8192, и максимальный в 8192. Затем выберите «Задать»;

    Окно виртуальной памяти

    Установите нужный размер файла подкачки

  • Если ошибка возникает при использовании игровой программы, перейдите в её графические настройки, и выберите их минимальные значения;
  • Произведите правильную настройку «Java». Для решения проблем с игровой программой «Майнкрафт» перейдите в Панель управления Виндовс, найдите там «Java» и запустите данную среду исполнения. Нажмите на кнопку «View», затем дважды кликните на «Runtime Parametres». Введите туда –Xms256m – Xmx3072m (или больше). Xms – это минимальное выделение ОЗУ, Xmx – максимальное. Значение Xmx рекомендуют устанавливать на процентов 70-80% от общего объёма ОЗУ. Примените изменения, и перезагрузите ваш ПК.

Заключение

Ошибка «Out of memory» может иметь множество причин, связанных как с физическим недостатком памяти на ПК, так и другими детерминантами, изложенными мной выше. Для решения проблемы советую закрыть ненужные программы (вкладки браузера) на вашем компьютере (тем самым разгрузив его память), а самым эффективным инструментом является установка дополнительной планки памяти на ПК, что в большинстве случаев поможет избавиться от ошибки на вашем компьютере.

Приветствую, Хабр!

Немного лирики

Сегодня, 2015-03-21, я решил сделать пол-дела, и всё-таки начать писать статью о том, как же всё-таки начать понимать, что же делать с OOM, да и вообще научиться ковырять heap-dump’ы (буду называть их просто дампами, для простоты речи. Также я постараюсь избегать англицизмов, где это возможно).
Задуманный мной объём «работ» по написанию этой статьи кажется мне не однодневным, а посему статья должна появиться лишь

через пару недель

спустя день.

В этой статье я постараюсь разжевать, что делать с дампами в Java, как понять причину или приблизиться к причине возникновения OOM, посмотреть на инструменты для анализа дампов, инструмент (один, да) для мониторинга хипа, и вообще вникнуть в это дело для общего развития. Исследуются такие инструменты, как JVisualVM (рассмотрю некоторые плагины к нему и OQL Console), Eclipse Memory Analyzing Tool.
Очень много понаписал, но надеюсь, что всё только по делу :)

Предыстория

Для начала нужно понять, как возникает OOM. Кому-то это может быть ещё неизвестно.
Представьте себе, что есть какой-то верхний предел занимаемой оперативки для приложения. Пусть это будет гигабайт ОЗУ.
Само по себе возникновение OOM в каком-то из потоков ещё не означает, что именно этот поток «выжрал» всю свободную память, да и вообще не означает, что именно тот кусок кода, который привёл к OOM, виноват в этом.
Вполне нормальна ситуация, когда какой-то поток чем-то занимался, поедая память, «дозанимался» этим до состояния «ещё немного, и я лопну», и завершил выполнение, приостановившись. А в это время какой-то другой поток решил запросить для своей маленькой работы ещё немного памяти, сборщик мусора попыжылся, конечно, но мусора уже в памяти не нашёл. В этом случае как раз и возникает OOM, не связанный с источником проблемы, когда стектрейс покажет совсем не того виновника падения приложения.

Есть и другой вариант. Около недели я исследовал, как улучшить жизнь парочки наших приложений, чтобы они перестали себя нестабильно вести. И ещё недельку-две потратил на то, чтобы привести их в порядок. В общей сложности пара недель времени, которые растянулись на полтора месяца, ведь занимался я не только этими проблемами.
Из найденного: сторонняя библиотека, и, конечно же, некоторые неучтённые вещи в вызовах хранимых процедур.
В одном приложении симптомы были следующие: в зависимости от нагрузки на сервис, оно могло упасть через сутки, а могло через двое. Если помониторить состояние памяти, то было видно, что приложение постепенно набирало «размер», и в определённый момент просто ложилось.
С другим приложением несколько интереснее. Оно может вести себя хорошо длительный срок, а могло перестать отвечать минут через 10 после перезагрузки, или вдруг внезапно упасть, сожрав всю свободную память (это я уже сейчас вижу, наблюдая за ним). А после обновления версии, когда была изменена и версия Tomcat с 7й до 8й, и JRE, оно вдруг в одну из пятниц (проработав вменяемо до этого ни много ни мало — 2 недели) начало творить такие вещи, что стыдно признаваться в этом. :)

В обоих историях очень полезны оказались дампы, благодаря им удалось отыскать все причины падений, подружившись с такими инструментами, как JVisualVM (буду называть его JVVM), Eclipse Memory Analyzing Tool (MAT) и языком OQL (может быть я не умею его правильно готовить в MAT, но мне оказалось легче подружиться с реализацией OQL именно в JVVM).
Ещё вам понадобится свободная оперативка для того, чтобы было куда загружать дампы. Её объём должен быть соизмерим с размером открываемого дампа.

Начало

Итак, начну потихоньку раскрывать карты, и начну именно с JVVM.

Этот инструмент в соединении с jstatd и jmx позволяет удалённо наблюдать за жизнью приложения на сервере: Heap, процессор, PermGen, количество потоков и классов, активность потоков, позволяет проводить профилирование.
Также JVVM расширяем, и я не преминул воспользоваться этой возможностью, установив некоторые плагины, которые позволили куда больше вещей, например, следить и взаимодействать с MBean’ами, наблюдать за деталями хипа, вести длительное наблюдение за приложением, держа в «голове» куда больший период метрик, чем предоставляемый вкладкой Monitor час.


Вот так выглядит набор установленных плагинов.
Visual GC (VGC) позволяет видеть метрики, связанные с хипом.

Детальнее о том, из чего состоит хип в этой нашей Java



Вот два скриншота вкладки VGC, которые показывают, как ведут себя два разных приложения.
Слева Вы можете увидеть такие разделы хипа, как Perm Gen, Old Gen, Survivor 0, Survivor 1, и Eden Space.
Все эти составляющие — участки в оперативке, в которую и складываются объекты.
PermGen — Permanent Generation — область памяти в JVM, предназначенная для хранения описания классов Java и некоторых дополнительных данных.
Old Gen — это область памяти для достаточно старых объектов, которые пережили несколько перекладываний с места на место в Survivor-областях, и в момент какого-то очередного переливания попадают в область «старых» объектов.
Survivor 0 и 1 — это области, в которые попадают объекты, которые после создания объекта в Eden Space пережили его чистку, то есть не стали мусором на момент, когда Eden Space начал чиститься Garbage Collector’ом (GC). При каждом запуске чистки Eden Space объекты из активного в текущий момент Survivor’а перекладываются в пассивный, плюс добавляются новые, и после этого Survivor’ы меняются статусами, пассивный становится активным, а активный — пассивным.
Eden Space — область памяти, в которой новые объекты порождаются. При нехватке памяти в этой области запускается цикл GC.

Каждая из этих областей может быть отрегулирована по размеру в процессе работы приложения самой виртуальной машиной.
Если вы указываете -Xmx в 2 гигабайта, например, то это не означает, что все 2 гигабайта будут сразу же заняты (если не запускать сразу что-то активно кушающее память, конечно же). Виртуальная машина сначала постарается держать себя «в узде».
На третьем скриншоте видно неактивную стадию приложения, которое не используется на выходных — Eden растёт равномерно, Survivor’ы перекладываются через равные промежутки времени, Old практически не растёт. Приложение проработало больше 90 часов, и в принципе JVM считает, что приложению требуется не так уж и много, около 540 МБ.

Бывают пиковые ситуации, когда виртуальная машина даже выделяет под хип гораздо больше памяти, но я думаю, что это какие-то ещё «неучтёнки», о которых я расскажу детальнее ниже по тексту, а может просто виртуальная машина выделила больше памяти под Eden, например, чтобы объекты в нём успевали стать мусором до следующего цикла очистки.

Участки, которые на следующем скриншоте я обозначил красным — это как раз возрастание Old, когда некоторые объекты не успевают стать мусором, чтобы быть удалёнными из памяти ранее, и всё-таки попадают в Old. Синий участок — исключение. На протяжении красных участков можно видеть гребёнку — это Eden так себя ведёт.

На протяжении синего участка скорее всего виртуальная машина решила, что нужно увеличить размер Eden-области, потому как при увеличении масштаба в Tracer’е видно, что GC перестал «частить» и таких мелких колебаний, как ранее, теперь нет, колебания стали медленными и редкими.

Перейдём ко второму приложению:

В нём Eden напоминает мне какой-то уровень из Mortal Kombat, арену с шипами. Была такая, кажется… А График GC — шипы из NFS Hot Pursuit, вот те вот, плоские ещё.
Числа справа от названий областей указывают:
1) что Eden имеет размер в 50 мегабайт, и то, что нарисовано в конце графика, последнее из значений на текущий момент — занято 25 мегабайт. Всего он может вырости до 546 мегабайт.
2) что Old может вырости до 1,333 гига, сейчас занимает 405 МБ, и забит на 145,5 МБ.
Так же для Survivor-областей и Perm Gen.
Для сравнения — вот Вам Tracer-график за 75 часов работы второго приложения, думаю, кое-какие выводы вы сможете сделать из него. Например, что активная фаза у этого приложения — с 8:30 до 17:30 в рабочие дни, и что даже на выходных оно тоже работает :)

Если вы вдруг увидели в своём приложении, что Old-область заполнена — попробуйте просто подождать, когда она переполнится, скорее всего она заполнена уже мусором.

Мусор — это объекты, на которые нет активных ссылок из других объектов, или целые комплексы таких объектов (например, какое-то «облако» взаимосвязанных оъектов может стать мусором, если набор ссылок указывает только на объекты внутри этого «облака», и ни на один объект в этом «облаке» ничто не ссылается «снаружи»).

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

Предпосылки

Итак, случилось сразу две вещи:
1) после перехода на более новые библиотеки/томкеты/джавы в одну из пятниц приложение, которое я уже долгое время веду, вдруг стало вести себя из рук вон плохо спустя две недели после выставления.
2) мне на рефакторинг отдали проект, который тоже вёл себя до некоторого времени не очень хорошо.

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

По первому случаю симптомы были такие: все потоки, отвественные за обработку запросов, выжраны, на базу данных открыто всего 11 соединений, и те не сказать, что используются, база говорила, что они в состоянии recv sleep, то есть ожидают, когда же их начнут использовать.
После перезагрузки приложение оживало, но прожить могло недолго, вечером той же пятницы жило дольше всего, но уже после окончания рабочего дня таки снова свалилось. Картина всегда была одинаковой: 11 соединений к базе, и лишь один, вроде бы, что-то делает.
Память, кстати, была на минимуме. Сказать, что OOM привёл меня к поиску причин, не могу, однако полученные знания при поиске причин позволили начать активную борьбу с OOM.

Когда я открыл дамп в JVVM, из него было сложно что-либо понять.

Подсознание подсказывало, что причина где-то в работе с базой.
Поиск среди классов сказал мне, что в памяти аж 29 DataSource, хотя должно быть всего 7.

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

OQL

Сидеть переклацывать в просмотровщике все эти объекты было некогда, и моё внимание наконец-то привлекла вкладка OQL Console, я подумал, что вот он, момент истины — я или начну использовать её на полную катушку, или так и забью на всё это.

Прежде, чем начать, конечно же был задан вопрос гуглу, и он любезно предоставил шпаргалку (cheat sheet) по использованию OQL в JVVM: http://visualvm.java.net/oqlhelp.html

Сначала обилие сжатой информации привело меня в уныние, но после применения гугл-фу на свет таки появился вот такой OQL-запрос:

select {instance: x, uri: x.url.toString(), connPool: x.connectionPool}
from org.apache.tomcat.dbcp.dbcp2.BasicDataSource x
where x.url != null
&& x.url.toString() == "jdbc:sybase:Tds:айпишник:порт/базаДанных"

Это уже исправленная и дополненная, финальная версия этого запроса :)
Результат можно увидеть на скриншоте:

После нажатия на BasicDataSource#7 мы попадаем на нужный объект во вкладке Instances:

Через некоторое время до меня дошло, что есть одно несхождение с конфигурацией, указанной в теге Resource в томкете, в файле /conf/context.xml. Ведь в дампе параметр maxTotal имеет значение 8, в то время, как мы указывали maxActive равным 20…

Тут-то до меня и начало доходить, что приложение жило с неправильной конфигурацией пула соединений все эти две недели!
Для краткости напишу тут, что в случае, если вы используете Tomcat и в качестве пула соединений — DBCP, то в 7м томкете используется DBCP версии 1.4, а в 8м томкете — уже DBCP 2.0, в котором, как я потом выяснил, решили переименовать некоторые параметры! А про maxTotal вообще на главной странице сайта написано :)
http://commons.apache.org/proper/commons-dbcp/
«Users should also be aware that some configuration options (e.g. maxActive to maxTotal) have been renamed to align them with the new names used by Commons Pool 2.»

Причины

Обозвал их по всякому, успокоился, и решил разобраться.
Как оказалось, класс BasicDataSourceFactory просто напросто получает этот самый Resource, смотрит, есть ли нужные ему параметры, и забирает их в порождаемый объект BasicDataSource, молча игнорируя напрочь всё, что его не интересует.
Так и получилось, что они переименовали самые весёлые параметры, maxActive => maxTotal, maxWait => maxWaitMillis, removeAbandoned => removeAbandonedOnBorrow & removeAbandonedOnMaintenance.
По умолчанию maxTotal, как и ранее, равен 8; removeAbandonedOnBorrow, removeAbandonedOnMaintenance = false, maxWaitMillis устанавливается в значение «ждать вечно».
Получилось, что пул оказался сконфигурирован с минимальным количеством соединений; в случае, если заканчиваются свободные соединения — приложение молча ждёт, когда они освободятся; и добивает всё молчанка в логах по поводу «заброшенных» соединений — то, что могло бы сразу показать, в каком именно месте

программист мудак

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

«Так быть не должно», решил я, и запилил патчик (https://issues.apache.org/jira/browse/DBCP-435, выразился в http://svn.apache.org/viewvc/commons/proper/dbcp/tags/DBCP_2_1/src/main/java/org/apache/commons/dbcp2/BasicDataSourceFactory.java?view=markup ), патч был принят и вошёл в версию DBCP 2.1. Когда и если Tomcat 8 обновит версию DBCP до 2.1+, думаю, что админам откроются многие тайны про их конфигурации Resource :)

По поводу этого происшествия мне лишь осталось рассказать ещё одну деталь — какого чёрта в дампе было аж 29 DataSource’ов вместо всего 7 штук. Разгадка кроется в банальной арифметике, 7*4=28 +1=29.

Детальнее о том, почему нельзя закидывать Resource в файл /conf/context.xml томкета

На каждую подпапку внутри папки /webapps поднимается своя копия /conf/context.xml, а значит то количество Resource, которые там есть, следует умножать на количество приложений, чтобы получить общее количество пулов, поднятых в памяти томкета. На вопрос «что в этом случае делать?» ответ будет таким: нужно вынести все объявления Resource из /conf/context.xml в файл /conf/server.xml, внутрь тега GlobalNamingResources. Там Вы можете найти один, имеющийся по умолчанию, Resource name=«UserDatabase», вот под ним и размещайте свои пулы. Далее необходимо воспользоваться тегом ResourceLink, его желательно поместить в приложение, в проекте, внутрь файла /META-INF/context.xml — это так называемый «per-app context», то есть контекст, который содержит объявления компонентов, которые будут доступны только для разворачиваемого приложения. У ResourceLink параметры name и global могут содержать одинаковые значения.
Для примера:

<ResourceLink name="jdbc/MyDB" global="jdbc/MyDB" type="javax.sql.DataSource"/>

Эта ссылка будет выхватывать из глобально объявленных ресурсов DataSource с именем «jdbc/MyDB», и ресурс станет доступен приложению.
ResourceLink можно (но не нужно) разместить и в /conf/context.xml, но в этом случае доступ к ресурсам, объявленным глобально, будет у всех приложений, пусть даже и не будет столько копий DataSource в памяти.
Ознакомиться с деталями можно вот тут: GlobalNamingResources — http://tomcat.apache.org/tomcat-7.0-doc/config/globalresources.html#Environment_Entries, ResourceLink — http://tomcat.apache.org/tomcat-7.0-doc/config/globalresources.html#Resource_Links, также можно просмотреть эту страницу: tomcat.apache.org/tomcat-7.0-doc/config/context.html.
Для TC8 эти же страницы: http://tomcat.apache.org/tomcat-8.0-doc/config/globalresources.html и http://tomcat.apache.org/tomcat-8.0-doc/config/context.html .

После этого всё стало ясно: 11 соединений было потому, что в одном, активном DataSource было съедено 8 соединений (maxTotal = 8), и ещё по minIdle=1 в трёх других неиспользуемых DataSource-копиях.

В ту пятницу мы откатились на Tomcat 7, который лежал рядышком, и ждал, когда от него избавятся, это дало время спокойно во всём разобраться.
Плюс позже, уже на TC7, обнаружилась утечка соединений, всё благодаря removeAbandoned+logAbandoned. DBCP радостно сообщил в логфайл catalina.log о том, что

"org.apache.tomcat.dbcp.dbcp.AbandonedTrace$AbandonedObjectException: DBCP object created 2015-02-10 09:34:20 by the following code was never closed:
	at org.apache.tomcat.dbcp.dbcp.AbandonedTrace.setStackTrace(AbandonedTrace.java:139)
	at org.apache.tomcat.dbcp.dbcp.AbandonedObjectPool.borrowObject(AbandonedObjectPool.java:81)
	at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106)
	at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
	at наш.пакет.СуперКласс.getConnection(СуперКласс.java:100500)
	at наш.пакет.СуперКласс.плохойПлохойМетод(СуперКласс.java:100800)
	at наш.пакет.СуперКласс.вполнеВменяемыйМетод2(СуперКласс.java:100700)
	at наш.пакет.СуперКласс.вполнеВменяемыйМетод1(СуперКласс.java:100600)
	ещё куча строк..."

Вот этот вот плохойПлохойМетод имеет в сигнатуре Connection con, но внутри была конструкция «con = getConnection();», которая и стала камнем преткновения. СуперКласс вызывается редко, поэтому на него и не обращали внимания так долго. Плюс к этому, вызовы происходили, я так понимаю, не во время рабочего дня, так что даже если что-то и подвисало, то никому уже не было дела до этого. А в ТуСамуюПятницу просто звёзды сошлись, начальнику департамента заказчика понадобилось посмотреть кое-что :)

Приложение №2

Что же касается «события №2» — мне отдали приложение на рефакторинг, и оно на серверах тут же вздумало упасть.
Дампы попали уже ко мне, и я решил попробовать поковырять и их тоже.
Открыл дамп в JVVM, и «чё-то приуныл»:

Что можно понять из Object[], да ещё и в таком количестве?
( Опытный человек, конечно же, увидел уже причину, правда? :) )

Так у меня зародилась мысль «ну неужели никто ранее не занимался этим, ведь наверняка уже есть готовый инструмент!». Так я наткнулся на этот вопрос на StackOverflow: http://stackoverflow.com/questions/2064427/recommendations-for-a-heap-analysis-tool-for-java.
Посмотрев предложенные варианты, я решил остановиться на MAT, надо было попробовать хоть что-то, а это открытый проект, да ещё и с куда бОльшим количеством голосов, чем у остальных пунктов.

Eclipse Memory Analyzing Tool

Итак, MAT.
Рекомендую скачивать последнюю версию Eclipse, и устанавливать MAT туда, потому как самостоятельная версия MAT ведёт себя плохо, там какая-то чертовщина с диалогами, в них не видно содержимого в полях. Быть может кто-то подскажет в комментариях, чего ему не хватает, но я решил проблему, установив MAT в Eclipse.

Открыв дамп в MAT я запросил выполнение Leak Suspects Report.


Удивлению не было предела, честно говоря.

1.2 гига весят соединения в базу.

Каждое соединение весит от 17 до 81 мегабайта.

Ну и ещё «немного» сам пул.
Визуализировать проблему помог отчёт Dominator Tree:

Причиной всех падений оказались километры SQLWarning’ов, база настойчиво пыталась дать понять, что «010SK: Database cannot set connection option SET_READONLY_TRUE.», а пул соединений BoneCP не вычищает SQLWarning’и после освобождения и возврата соединений в пул (может быть это где-то можно сконфигурировать? Подскажите, если кто знает).
Гугл сказал, что такая проблема с Sybase ASE известна ещё с 2004 года: https://forum.hibernate.org/viewtopic.php?f=1&t=932731
Если вкратце, то «Sybase ASE doesn’t require any optimizations, therefore setReadOnly() produces a SQLWarning.», и указанные решения всё ещё работают.
Однако это не совсем решение проблемы, потому как решение проблемы — это когда при возврате соединения в пул все уведомления базы очищаются в силу того, что они уже никогда никому не понадобятся.
И DBCP таки умеет делать это: http://svn.apache.org/viewvc/commons/proper/dbcp/tags/DBCP_1_4/src/java/org/apache/commons/dbcp/PoolableConnectionFactory.java?view=markup, метод passivateObject(Object obj), в строке 687 можно увидеть conn.clearWarnings();, этот вызов и спасает от километров SQLWarning’ов в памяти.
Об этом я узнал из тикета: https://issues.apache.org/jira/browse/DBCP-102
Также мне подсказали про вот такой тикет в багтрекере: https://issues.apache.org/jira/browse/DBCP-234, но он касается уже версии DBCP 2.0.

В итоге я перевёл приложение на DBCP (пусть и версии 1.4). Пусть нагрузка на сервис и немаленькая (от 800 до 2к запросов в минуту), но всё же приложение ведёт себя хорошо, а это главное. И правильно сделал, потому как BoneCP уже пять месяцев не поддерживается, правда, ему на смену пришёл HikariCP. Нужно будет посмотреть, как дела в его исходниках…

Сражаемся с OOM

Впечатлившись тем, как MAT мне всё разложил по полочкам, я решил не забрасывать этот действенный инструмент, и позже он мне пригодился, потому как в первом приложении ещё остались всяческие «неучтёнки» — неучтённые вещи в коде приложения или коде хранимых процедур, которые иногда приводят к тому, что приложение склеивает ласты. Я их отлавливаю до сих пор.

Вооружившись обоими инструментами, я принялся ковырять каждый присланный дамп в поисках причин падения по OOM.
Как правило все OOM приводили меня к TaskThread.

И если нажать на надпись See stacktrace, то да, это будет как раз банальный случай, когда какой-то поток вдруг внезапно упал при попытке отмаршалить результат своей работы.

Однако здесь ничто не указывает на причину возникновения OOM, здесь лишь результат. Найти причину мне пока-что, в силу незнания всей магии OQL в MAT, помогает именно JVVM.
Загружаем дамп там, и пытаемся отыскать причину!

Искать мне следует, конечно же, именно вещи, связанные с базой данных, а посему попробуем сначала посмотреть, есть ли в памяти Statement’ы.

Два SybCallableStatement, и один SybPreparedStatement.
Думаю, что дело усложнится, если Statement’ов будет куда больше, но немного подрихтовав один из следующих запросов, указав в where нужные условия, думаю, всё у Вас получится. Плюс, конечно же, стоит хорошенько посмотреть в MAT, что за результаты пытается отмаршалить поток, какой объект, и станет понятнее, какой именно из Statement’ов необходимо искать.

select {
    instance: x,
    stmtQuery: x._query.toString(),
    params: map(x._paramMgr._params, function(obj1) {
            if (obj1 != null) {
                if (obj1._parameterAsAString != null) {
                    return '''+obj1._parameterAsAString.toString()+''';
                } else {
                    return "null";
                }
            } else {
                return "null";
            }
        })
    }
from com.sybase.jdbc4.jdbc.SybCallableStatement x
where x._query != null


Не то, это «внутренние» вызовы.

select {
    instance: x,
    stmtQuery: x._query.toString(),
    params: map(x._paramMgr._params, function(obj1) {
            if (obj1 != null) {
                if (obj1._parameterAsAString != null) {
                    return '''+obj1._parameterAsAString.toString()+''';
                } else {
                    return "null";
                }
            } else {
                return "null";
            }
        })
    }
from com.sybase.jdbc4.jdbc.SybPreparedStatement x
where x._query != null


А вот и дичь!
Для чистоты эксперимента можно кинуть такой же запрос в любимой БД-IDE, и он будет очень долго отрабатывать, а если покопаться в недрах хранимки, то будет понятно, что там просто из базы, которая нам не принадлежит, выбирается 2 миллиона строк по такому запросу с такими параметрами. Эти два миллиона даже влазят в память приложения, но вот попытка отмаршалить результат становится фатальной для приложения. Такое себе харакири. :)
При этом GC старательно убирает все улики, но не спасло его это, всё же источник остался в памяти, и он будет наказан.

Почему-то после всего этого рассказа почувствовал себя тем ещё неудачником.

Прощание

Вот и закончилось моё повествование, надеюсь, Вам понравилось :)
Хотел бы выразить благодарность своему начальнику, он дал мне время во всём этом разобраться. Считаю эти новые знания очень полезными.
Спасибо девушкам из Scorini за неизменно вкусный кофе, но они не прочтут этих слов благодарности — я даже сомневаюсь, что они знают о существовании Хабрахабра :)
Хотелось бы увидеть в комментариях ещё больше полезной инфы и дополнений, буду очень благодарен.

Думаю, самое время почитать документацию к MAT…

UPD1: Да, совсем забыл рассказать про такие полезные вещи, как создание дампов памяти.
docs.oracle.com/javase/7/docs/webnotes/tsg/TSG-VM/html/clopts.html#gbzrr
Опции
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/disk2/dumps
весьма полезны для генерации дампов в момент падения приложения по OutOfMemoryError,
а также существует возможность снять дамп памяти с приложения «наживо», посреди его работы.
Для этого существует утилита jmap.
Пример вызова для винды:
«C:installPSToolsPsExec.exe» -s «C:Program FilesJavajdk1.7.0_55binjmap.exe» -dump:live,format=b,file=C:dump.hprof 3440
последний параметр — это PID java-процесса. Приложение PsExec из набора PSTools позволяет запускать другие приложения с правами системы, для этого служит ключ «-s». Опция live полезна, чтобы перед сохранением дампа вызвать GC, очистив память от мусора. В случае, когда возникает OOM, чистить память незачем, там уже не осталось мусора, так что не ищите, как можно установить опцию live в случае возникновения OOM.

UPD2 (2015-10-28) | Случай номер два три
(Было принято решение дописать это сюда как апдейт, а не пилить новую статью о том же самом):
Ещё один интересный случай, но уже с Оракловой базой.
Один из проектов использует фичу с XML, проводит поиски по содержимому сохранённого XML-документа. В общем, этот проект иногда давал о себе знать тем, что вдруг внезапно один из инстансов переставал подавать признаки жизни.
Почуяв «хороший» случай потренироваться

на кошках

, я решил посмотреть его дампы памяти.

Первое, что я увидел, было «у вас тут много коннектов в памяти осталось». 21к!!! И какой-то интересный oracle.xdb.XMLType тоже давал жару. «Но это же Оракл!», вертелось у меня в голове. Забегая вперёд скажу что таки да, он виноват.

Итак, видим кучу T4CConnection, которые лежат в HashMap$Entry. Обратил внимание сразу, что вроде бы и SoftHashMap, что, вроде как, должно означать, что оно не должно вырастать до таких размеров. Но результат видите и сами — 50-60 килобайт в коннекте, и их реально МНОГО.

Посмотрев, что собой представляют HashMap$Entry — увидел, что примерно картина одинакова, всё связано с SoftHashMap, с Оракловыми коннектами.

Что, собственно, подтверждалось такой картинкой. HashMap$Entry было просто море, и они более-менее сакуммулировались внутри oracle.xdb.SoftHashMap.
В следующем дампе картина была примерно такой же. По Dominator Tree было видно, что внутри каждого Entry находится тяжёлый такой BinXmlProcessorImpl.

-=-=-
Если учесть, что я в тот момент был не силён в том, что такое xdb, и как он связан с XML, то, несколько растерявшись, я решил, что надо бы погуглить, быть может кто-то уже в курсе, что со всем этим нужно делать. И чутьё не обмануло, по запросу «oracle.xdb.SoftHashMap T4CConnection» нашлось
раз piotr.bzdyl.net/2014/07/memory-leak-in-oracle-softhashmap.html
и два leakfromjavaheap.blogspot.com/2014/02/memory-leak-detection-in-real-life.html
Утвердившись, что тут всё-таки косяк у Оракла, дело оставалось за малым.
Попросил администратора БД посмотреть информацию по обнаруженной проблеме:

xxx: Ключевые слова: SoftHashMap XMLType
yyy: Bug 17537657 Memory leak from XDB in oracle.xdb.SoftHashMap
yyy: The fix for 17537657 is first included in
12.2 (Future Release)
12.1.0.2 (Server Patch Set)
12.1.0.1.4 Database Patch Set Update
12.1.0.1 Patch 11 on Windows Platforms
yyy: нда. Описание
Description
When calling either getDocument() using the thin driver, or getBinXMLStream()
using any driver, memory leaks occur in the oracle.xdb.SoftHashMap class.
BinXMLProcessorImpl classes accumulate in this SoftHashMap, but are never
removed.
xxx: Всё так и есть :)

Вот описание фикса: updates.oracle.com/Orion/Services/download?type=readme&aru=18629243 (для доступа требуется учётка в Оракл).
-=-=-
После применения фикса инстансы нашего приложения живут уже месяц, и пока без эксцессов. *постучал по дереву* *поплевал через левое плечо*
Успехов Вам в поисках!

Note: The most recent version of Resource Hacker incorporates most of the changes that this patch offers. Therefore, Resource Hacker FX is considered obsolete, and the post is here mostly for historical reasons.

Remember the good ol’ Resource Hacker?
It’s a popular Resource viewer/editor, I use it to quickly view and edit resources. I tried to find an alternative, but I did not find any that I liked, so I decided to just improve Resource Hacker.

Here is a patcher that needs to be used on the original Resource Hacker v3.6.0.92:
zip Resource Hacker FXer.zip (117.97 kB, changelog)

Here is how it looks:

What does the patcher change:

  1. Partial Unicode support.
    More details.
  2. A new interface with modern icons and a manifest.
    Icons by Yusuke Kamiyamane.
  3. Resource Hacker FX does not create tree nodes for every language. Usually only one language is used anyway, so it makes it much faster to navigate through resources.
  4. Resource Hacker FX uses the new open and save common dialogs instead of the old outdated ones. Also, some saving as parameters got improved: the directory of the current file is initially shown, the file name gets filled, the extension is automatically added if not specified.
  5. If you have a modified file open and you close Resource Hacker FX, you have a Cancel option when asked whether you would like to save the file. Also, if you choose to save it, it just gets saved instead of saving as.
  6. The Hex viewer shows only the first 10 KB of the binary resource by default to prevent hanging Resource Hacker FX. I could not really fix it, as it’s the Rich Edit control’s fault, it’s quite slow with large texts. Well, it’s not too smart to use Rich Edit to view a Hex dump, but that’s how it works. 10 KB should be usually enough to understand what the resource is about. If it isn’t, you can hold shift to load the whole resource.
  7. Other minor additions, like e.g. double click to replace resource, minimizing/maximizing effects.
  8. Lots of bug fixes.

Posted in Releases, Software by Michael (Ramen Software) on March 13th, 2011.
Tags: resource hacker fx

Как правило, код ошибки Out of memory появляется при запуске многих игр и программ, в частности Mortal Kombat 9, DayZ, Minecraft, After Effects, Google Chrome и даже utorrent. Почему она возникает и что делать для ее устранения? Давайте разбираться.

В переводе на русский сбой означает «недостаточно памяти», что уже толкает на некоторые решения – увеличить объем оперативной, видео памяти или освободить место на диске «C». Но срабатывает это далеко не всегда, поэтому рассмотрим еще несколько вариантов исправления ошибки.

Содержание статьи

  1. Системные требования
  2. Плохая сборка
  3. Очистка Windows
  4. Дополнительные решения для Mortal Kombat
  5. Не запускается
  6. Зависает или вылетает
  7. Проверка микрофона
  8. Чистая загрузка
  9. Сканирование на ошибки
  10. Устранение неполадок
  11. Файл подкачки
  12. Диагностика ОЗУ
  13. Редактирование реестра
  14. Комментарии пользователей

Системные требования

Удостоверьтесь, что компьютер удовлетворяет системные требования игры. Например, если для нормальной работы приложения требуется 4 ГБ оперативной памяти или 2 ГБ видео памяти, а на компьютере стоит в 2 раза меньше, то очевидно проблема в этом.

Вариантов решения здесь несколько:

  1. Выполнить апгрейд компьютера.
  2. Понизить качество игровых настроек.
  3. Закрыть все открытые программы, изменить версию Windows или оптимизировать ее, чтобы сэкономить больше ресурсов.

Плохая сборка

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

Очистка Windows

Попробуйте удалить сбойную программу через любой деинсталлятор. Затем воспользуйтесь программой для очистки системы и исправления проблем в реестре, например, «ccleaner». После этого перезагрузите ПК и установите заново нужное приложение. Редко, но это помогает.

Дополнительные решения для Mortal Kombat

Более подробно разберем некоторые способы касающиеся игры мортал комбат 9. Поскольку чаще всего именно при запуске этой игры возникает ошибка out of memory.

Нехватка памяти и неподдерживаемое разрешение экрана

  1. Нажмите «WIN + R», введите %appdata% и щелкните «Ок».appdata
  2. Найдите папку «MKKE» и откройте файл dxdiag.txt через блокнот.
  3. Найдите строку «Dedicated Memory», укажите значение «1024» и сохраните изменения. Закройте файл.
  4. Нажмите правой мышкой по dxdiag.txt и откройте «Свойства».
  5. В графе «Атрибуты» установите галочку «Только чтение» и щелкните «Ок».

Проверьте, есть ли результат.

Не запускается

Если MK запускался только один раз после установки, то скорее всего сбились настройки.

  1. Входим в папку appdata, как это делали выше.
  2. Открываем через блокнот файл «options.ini», находим строку max_texture и после знака «=» выставляем значение «1024». Должно получиться так: max_texture = 1024.

Зависает или вылетает

  1. Заходим в папку appdata, как это делали ранее и открываем в блокноте «options.ini».
  2. Находим строку configured = false и меняем значение на «true». В итоге получится так: configured = true.
  3. Сохраняем изменения и проверяем результат.

Проверка микрофона

Mortal Kombat очень чувствителен к микрофону. Если он включен, то отключите его, выдернув провод из гнезда.

Иногда, наоборот, помогает подключение микрофона к гнезду. Особенно в случае с ноутбуками.

Чистая загрузка

Попробуйте выполнить чистую загрузку. Это избавит от приложений и их служб, грузящих систему.

  1. Нажмите «Windows + R», введите msconfig.msconfig
  2. Откройте вкладку «Службы», скройте службы Microsoft и выберите «Отключить все».выключение служб
  3. Затем пройдите в «Автозагрузку» и избавьтесь от сторонних приложений.чистка запуска программ
  4. Перезагрузите ОС и проверьте результат.

Сканирование на ошибки

Неполадку способны вызывать поврежденные системные файлы. Их также желательно проверить.

  1. Открываем командную строку «WIN+R — CMD».cmd
  2. Вводим sfc /scannow и жмем «Enter».scannow
  3. Если по завершении служба сообщит, что восстановление не удалось, то выполните еще одну команду — DISM /Online /Cleanup-Image /RestoreHealth.dism

После того, как все будет сделано, перезапустите ПК.

Устранение неполадок

Воспользуйтесь автоматическим средством по устранению неполадок, которое предоставляет Microsoft.

  1. Откройте панель управления через меню «Пуск» или «Поиск»панель управления.
  2. Перейдите в раздел «Устранение неполадок».устранение сбоев
  3. Нажмите по просмотру всех категорий.отображение категорий
  4. Выберите «Обслуживание системы».обслуживание
  5. Откроется окно с мастером диагностики, выполните процедуру до конца и перезапуститесь.

Файл подкачки

Возможно, ОС не хватает объема виртуальной памяти. Следует его увеличить.

Как это сделать:

  1. Запускаем окно «Выполнить» и вводим «sysdm.cpl».sysdm
  2. Перемещаемся в «Дополнительно» и в разделе «Быстродействие» щелкаем кнопку «Параметры».параметры быстродействия
  3. Снова переходим в «Дополнительно» и в разделе «Виртуальная» щелкаем «Изменить».изменяем виртуалку
  4. Выделите диск с Windows и активируйте пункт «Указать размер». В обеих строках введите значение выше текущего, в моем случае это будет «4096».вручную указываем размер файла подкачки

Также можно позволить ОС автоматически выбирать его размер. В большинстве случаев это работает еще лучше.

Диагностика ОЗУ

Иногда, out of memory возникает из-за поврежденной оперативной памяти. Рекомендую провести диагностику.

Существуют два способа, как это можно сделать.

  1. Пользователям Windows 10 и 8 доступно штатное средство. Запускается через «WIN + R — mdsched.exe».mdsched
  2. Более универсальным методом является диагностика через утилиту «Memtest86».

Однако эти программы не всегда выявляют дефекты. Обнаружить их получается вынув одну планку ОЗУ или переставив ее в другой слот.

Редактирование реестра

Добиться нормальной работы ОС можно через правку реестра. Если вы решитесь на это, будьте осторожны, неправильные действия могут вывести операционку из строя.

  1. В поиске введите «regedit» и откройте редактор.редактор реестра
  2. Пройдите в ветку HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerSubSystems
  3. Выберите «Windows» и следом «Изменить».редактируем реестр
  4. Найдите запись SharedSection, увеличьте второе и третье значение.sharedsection

К примеру, SharedSection=aaaa,bbbb,cccc

Для x32 разрядной системы меняем следующие значения:

  1. bbbb на 12288
  2. cccc на 1024

Для x64:

  1. bbbb на 20480
  2. cccc на 1024

Нажмите «Ок» и перезагрузите компьютер.

Бывает, что ничего не помогает устранить ошибку. В таких случаях ничего не остается, кроме переустановки операционки или ее обновлении.

javascript heap out of memory

Ошибка «Heap out of memory» в JavaScript возникает когда приложению недостаточно памяти. В этой статье мы разберемся как быстро исправить эту ошибку.

Самый быстрый способ — увеличить количество памяти в Node.js. Начиная с версии v8 вы можете устанавливать ограничение в мегабайтах с помощью флага  --max-old-space-size:

node --max-old-space-size=4096 index.js

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

Аналогичного эффекта можно добиться с помощью другого флага:

NODE_OPTIONS="--max-old-space-size=4096" node index.js

Изменение ограничения памяти для всей среды Node.js

Чтобы изменить лимит памяти для всей среды, нужно установить значение переменной NODE_OPTIONS в конфигурационном файле (его расширение .bashrc, bash_profile или .zshrc и т. п.).

export NODE_OPTIONS=--max_old_space_size=4096

«Heap out of memory» во время nmp install

Если во время установки пакетов с помощью npn или yarn у вас появляется эта ошибка, вы можете увеличить лимит памяти на время установки.

node --max-old-space-size=4096 $(which npm) install -g nextawesomelib

Что означает эта ошибка?

По умолчанию в Node.js установлен лимит памяти, который не позволяет программе занять слишком много памяти и уронить всю систему. Лимит отличается на разных версиях Node.js и архитектурах (32бита или 64бита).

Ограничения памяти на разных версиях Node.js

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

Лимиты памяти на разных версиях Node.js

4GB памяти в куче будет достаточно для большинства случаев

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

const array = [];
while (true) {
  // увеличение массива на каждой итерации
  array.push(new Array(10000000));

  const memory = process.memoryUsage();
  console.log((memory.heapUsed / 1024 / 1024 / 1024).toFixed(4), 'GB');
}

Как избежать недостатка памяти в Node.js

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

Вот три альтернативных решения, которые позволят уменьшить потребление памяти.

Обработка данных по частям

Иногда нужно обработать большой набор данных. Например, вы пишите программу, которая принимает данные из CSV файла, очищает их и добавляет в БД (это называется ETL: извлечение, трансформация, загрузка).

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

# split -l numberoflines filename
split -l 1000000 users.csv

Подробнее о том, как сделать это в MongoDB в этом ответе на StackOverflow.

Избегайте утечек памяти

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

Её содержание сводится к тому, что большинство утечек, которые можно отследить, вызваны неудалёнными ссылками на объекты, которые больше не нужны. Это может случиться, когда вы забыли удалить interval, timer или чрезмерно используете глобальные переменные.

Профилирование

Профилирование помогает обнаружить утечки памяти. На фронтенде это можно сделать в Chrome в Инструментах разработчика во вкладке Memory.

В Node.js начиная с версии 6.3.0 также можно использовать Chrome для отладки использования памяти.

Во-первых, запустите приложение в режиме проверки:

node --inspect index.js

Затем откройте страницу в Chrome, введите адрес chrome://inspect и нажмите на кнопку Open dedicated DevTools for Node.

После этого откроется окно, в котором вы сможете подключиться к вашему Node.js приложению.

Devtools Node.js

Перезапуск процессов

Допустим, ваша программа работает на компьютере с ограниченным объёмом памяти, например Raspberry Pi.

Мы будем использовать cluster и библиотеки node v8.

Cluster даёт возможность воспользоваться преимуществами многоядерных систем и запускать кластер из процессов Node.js.

V8 предоставляет API для конкретной версии V8, используемой в Node.js.

Давайте разделим программу на две сущности: master и worker.

Master будет перезапускать worker`ов в случае, если они перестанут работать из-за переполнения кучи. Worker`ы будут отвечать за основную логику (в нашем случае запускать тяжёлую функцию heavyHeapConsumer).

const cluster = require('cluster');
const v8 = require('v8');

let heavyHeapConsumer = () => {
  let arrays = [];
  setInterval(() => {
    arrays.push(new Array(1000000));
  }, 100);
};

if (cluster.isMaster) {
  cluster.fork();
  cluster.on('exit', (deadWorker, code, signal) => {
    // Перезапуск worker`а
    let worker = cluster.fork();
    
    // Сохранение id процесса
    let newPID = worker.process.pid;
    let oldPID = deadWorker.process.pid;
    
    // Логгирование
    console.log('worker ' + oldPID + ' died.');
    console.log('worker ' + newPID + ' born.');
  });
} else { // worker
  const initialStats = v8.getHeapStatistics();
  
  const totalHeapSizeThreshold = 
    initialStats.heap_size_limit * 85 / 100;
  console.log("totalHeapSizeThreshold: " + totalHeapSizeThreshold);
  
  let detectHeapOverflow = () => {
    let stats = v8.getHeapStatistics();
    
    console.log("total_heap_size: " + (stats.total_heap_size));
    
    if ((stats.total_heap_size) > totalHeapSizeThreshold) {
      process.exit();
    }
  };
  setInterval(detectHeapOverflow, 1000);
  
  // выполнение основной логики
  heavyHeapConsumer();
}

При первом запуске приложения создается worker и подписка на событие exit, при срабатывании которой создаётся новый worker, и событие логгируется.

total_heap_size — размер кучи, который можно увеличить.

heap_size_limit — максимально возможный размер кучи.

В коде worker`а устанавливается total_heap_size равный 85% от heap_size_limit. Затем worker каждую секунду проверяет не превышен ли лимит. Если лимит превышен, то процесс worker убивает себя.

Лимит (85%) и интервал проверки (1 секунда) нужно выбирать для каждого конкретного случая. Здесь функция heavyHeapConsumer увеличивает кучу каждые 100мс. Если в вашем варианте увеличение будет происходить каждые 10мс, то следует уменьшить лимит и увеличить интервал проверки.

Полный код примера доступен на GitHub.

Источники JavaScript Heap Out Of Memory Error,
Detect heap overflow on Node.js: JavaScript heap out of memory

Понравилась статья? Поделить с друзьями:
  • Resource error for renderprogresource
  • Resolving hostname error
  • Resolve error unable to load resolver alias
  • Resolve error typescript with invalid interface loaded as resolver
  • Resolution failed with error no public constructor is available for type