Nano Hash - криптовалюты, майнинг, программирование

Общие сведения о распределении памяти JVM и нехватке памяти в Java: пространство кучи

Я пытаюсь понять, как распределение памяти работает в JVM. Я пишу приложение, в котором у меня возникают исключения Out of Memory: Heap Space.

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

Мои вопросы:

1) Как JVM на самом деле выделяет память для себя? Как это связано с тем, как ОС передает доступную память JVM? Или, в более общем плане, как на самом деле работает выделение памяти для любого процесса?

2) Как в игру вступает виртуальная память? Допустим, у вас есть система с 32 ГБ физической памяти, и вы выделяете все 32 ГБ для своего Java-процесса. Допустим, ваш процесс фактически потребляет все 32 ГБ памяти, как мы можем заставить процесс использовать виртуальную память вместо того, чтобы запускать исключения OOM?

Спасибо.


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

Ответы:


1

Как JVM на самом деле выделяет себе память?

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

Как это связано с тем, как ОС передает доступную память JVM?

JVM не имеет представления о свободной памяти в ОС.

Или, в более общем плане, как на самом деле работает выделение памяти для любого процесса?

Обычно он использует malloc и free.

Как в игру вступает виртуальная память?

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

Допустим, у вас есть система с 32 ГБ физической памяти, и вы выделяете все 32 ГБ для своего Java-процесса.

Вы не можете. Операционной системе требуется немного памяти, и она будет использоваться для других целей. Даже внутри JVM куча - это только часть используемой памяти. Если у вас 32 ГБ памяти, я предлагаю не более 24 ГБ кучи.

Допустим, ваш процесс фактически потребляет все 32 ГБ памяти,

Допустим, у вас есть 48 ГБ, и вы запускаете процесс, который использует 32 ГБ основной памяти.

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

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

Вы можете использовать больше памяти, чем у вас есть, осторожно используя память вне кучи. Однако управляемая память должна находиться в физической памяти, поэтому, если вам нужна куча 32 ГБ, купите 64 ГБ основной памяти.

22.01.2014
  • Вопрос: подскажите, пожалуйста, почему JVM_outOfMemory - это ошибка, а не исключение. 20.04.2014
  • @TusharPandey Из документации Javadoc 8 для ошибки An Error is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch. Most such errors are abnormal conditions. Вы бы не хотели, чтобы catch(Exception e) обнаруживал такие ошибки. 21.04.2014
  • в физической памяти объемом 32 ГБ вы можете указать JVM для использования 32 ГБ, поскольку вначале это виртуальная память, не так ли? т.е. программа java все равно будет запускаться? и он выдаст ошибку только в том случае, если на самом деле попытается использовать столько памяти? 23.01.2019
  • @ealeon резервирует память заранее, поэтому это зависит от ОС. 24.01.2019
  • @PeterLawrey мне сказали, что это не так stackoverflow.com/questions/54318518/ 25.01.2019
  • @ealeon Linux / Unix / MacOS выделяет память лениво, по запросу, если вы не используете параметр командной строки JVM для предварительного выделения памяти. Вы можете создать JVM, размер которой превышает размер основной памяти + своп. В Windows он с готовностью выделяет память и предотвращает создание JVM процессом, которому он не мог немедленно передать память / подкачку. 25.01.2019

  • 2

    JVM (или, если на то пошло, любой процесс), который хочет выделить память, вызовет функцию malloc среды выполнения C . Эта функция поддерживает память кучи среды выполнения C. Он, в свою очередь, получает память от ядра операционной системы - функция, используемая для этого, зависит от платформы; в Linux это может быть использование системных вызовов brk или sbrk.

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

    Виртуальная память полностью обрабатывается ядром операционной системы. Ядро управляет отображением страниц физической памяти в адресное пространство различных процессов; если физической памяти меньше, чем требуется для всех процессов в системе, тогда ядро ​​ОС выгружает часть ее на диск.

    Вы не можете (и не должны) заставлять процессы использовать виртуальную память. Это прозрачно для вашего процесса.

    Если у вас возникают ошибки «нехватки памяти», вероятными причинами могут быть:

    1. Пределы JVM превышены. Они контролируются различными аргументами и / или свойствами командной строки, как вы указали в своем вопросе.

    2. Возможно, в ОС закончилось пространство подкачки (или для начала не было настроено какое-либо пространство подкачки). Или некоторые ОС даже не поддерживают виртуальную память, и в этом случае у вас закончилась реальная память.

    3. В большинстве операционных систем администратор может ограничивать объем памяти, потребляемой процессом - например, в Linux setrlimit системный вызов и / или команда оболочки ulimit, обе из которых устанавливают ограничения, которые будет соблюдать ядро. Если процесс запрашивает больше памяти, чем разрешено ограничениями, попытка завершится неудачей (обычно это приводит к сообщению о нехватке памяти).

    22.01.2014

    3

    В этом блоге рассматривается использование памяти Java, которое может оказаться полезным:

    http://www.waratek.com/blog/november-2013/introduction-to-real-world-jvm-memory-utilisation

    22.01.2014
  • К сожалению, эта ссылка больше не доступна :( 13.12.2018

  • 4
    1. # P1 #
    2. # P2 #

    Источник: http://searchstorage.techtarget.com/definition/virtual-memory

    22.01.2014
    Новые материалы

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

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

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

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..