WedX - журнал о программировании и компьютерных науках

Странное поведение JVM

Я столкнулся со странным поведением экземпляра Alfresco, работающего на Java8. Время от времени приложение использует всю доступную оперативную память и приводит к исключению OOM. Мы сделали HeapDump, чтобы увидеть, что происходит, и процесс создания дампа высвобождает основную часть используемой памяти. Есть идеи, что там происходит?

введите здесь описание изображения

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


  • Похоже, что это связано с этой темой: stackoverflow .com/questions/5403161/. Должны ли мы форсировать GC или смотреть в другом направлении? 14.10.2020
  • Вы уверены, что ваше приложение не будет использовать такую ​​память? Может быть, вы загружаете очень большие файлы или создаете тысячи/миллионы тяжелых классов в зависимости от некоторых условий и т. д.? 14.10.2020
  • Приложение может использовать много памяти, но почему каждый раз, когда мы выгружаем кучу, освобождается вся память? Насколько я понимаю, GC освобождает память без ссылок, что означает, что память больше не нужна приложению. Отвечая на мой начальный вопрос, каждый раз, когда мы сбрасываем, память снижается, а сразу после этого снова начинает увеличиваться. Что бы это означало? 14.10.2020
  • Вы сбрасываете его вручную или автоматически с помощью java -XX:+HeapDumpOnOutOfMemoryError? 14.10.2020
  • Я создаю дамп с помощью функции VisualVM Heap Dump 14.10.2020
  • Я планирую использовать -XX:+HeapDumpOnOutOfMemoryError, но у нас не было недавних исключений OOM 14.10.2020
  • Я понимаю! Да, лучше использовать его на производстве 14.10.2020
  • Может быть, процесс дампа также потребует много памяти, потому что он создает большой файл на выходе. Тогда вы можете столкнуться с таким поведением во время дампа! 14.10.2020
  • Давайте продолжим обсуждение в чате. 14.10.2020
  • Какой процесс Java ведет себя так? Репозиторий Alfresco или solr? Какая версия Alfresco? Если это процесс репо, вы обычно найдете ответ в журналах доступа, а иногда и в файле catalina.out. 16.10.2020
  • Из того, что я вижу в JProfiler, это SOLRTrackingComponentImpl.java, который сходит с ума (как по памяти, так и по CPI). Мы внедрили сложное групповое управление безопасностью, общее для более чем 200 сайтов Alfresco. Я склонен думать, что это была ошибка. Мы вернемся к этой стратегии, чтобы проверить, является ли она основной причиной 16.10.2020

Ответы:


1

Всякий раз, когда вы пытаетесь получить дамп кучи из visualvm, он сначала:

  • Запускает полную сборку мусора для очистки мертвых объектов. Вхождения можно найти, выполнив поиск Full GC (Heap Dump Initiated GC) в журнале сборки мусора.
  • Дамп остальных живых объектов в файл.

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

Я предлагаю использовать следующие аргументы JVM, которые очень полезны при устранении ошибок OutOfMemory:

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=C:\path_where_heap_dumps_will_be_generated
-XX:OnOutOfMemoryError=do_something_to_recover_from_it

Подробнее см. в этом документе.

15.10.2020
  • Я сделал это. OOM больше не возникает. Мы внесли изменения в то, как мы обеспечиваем безопасность в Alfresco. Ситуация лучше, но все еще неудобная память 16.10.2020
  • Новые материалы

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

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

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

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

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]