каким параметром командной строки можно задать максимальный размер памяти java

Как выделить Java больше оперативной памяти

Из-за взаимодействия программного компонента Java с разработанными продуктами могут возникать ошибки, решение которых лежит на плечах пользователя. Оно достигается двумя путями: переустановкой модуля и выделением дополнительной памяти Java. С каждой ситуацией стоит разобраться отдельно.

Зачем увеличивать память Java

Задачу по увеличению Java памяти пользователи ставят перед собой в следующих случаях:

Исправить проблему можно двумя способами.

Как выделить память Java

Выделить Джава-модулю больше оперативной памяти возможно через «Панель управления». Способ удобнее рассмотреть на примере проблем с запуском игры Minecraft.

Инструкция:

Если это не помогло запустить Minecraft, переустановите модуль Java и игру. После удаления очистите реестр с помощью CCleaner.

Увеличение памяти с помощью переменных среды

Чтобы система воспринимала написанные аргументы, нужно добавить переменную с названием «_JAVA_OPTIONS».

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

В примере объем оперативки составлял 1 Гб.

Видео: 3 способа выделить больше памяти Java.

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

Источник

Управление памятью Java

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

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

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

Для начала давайте посмотрим, как обычно организована память в Java:

Структура памяти

Стек (Stack)

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

Кроме того, переменные в стеке имеют определенную видимость, также называемую областью видимости. Используются только объекты из активной области. Например, предполагая, что у нас нет никаких глобальных переменных (полей) области видимости, а только локальные переменные, если компилятор выполняет тело метода, он может получить доступ только к объектам из стека, которые находятся внутри тела метода. Он не может получить доступ к другим локальным переменным, так как они не выходят в область видимости. Когда метод завершается и возвращается, верхняя часть стека выталкивается, и активная область видимости изменяется.

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

Куча (Heap)

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

Ключевое слово new несет ответственность за обеспечение того, достаточно ли свободного места на куче, создавая объект типа StringBuilder в памяти и обращаясь к нему через «Builder» ссылки, которая попадает в стек.

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

Типы ссылок

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

1. Сильная ссылка

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

2. Слабая ссылка

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

После сбора мусора ключа из WeakHashMap вся запись удаляется из карты.

3. Мягкая ссылка

Подобно слабым ссылкам, мягкая ссылка создается следующим образом:

4. Фантомная ссылка

Ссылки на String

Ссылки на тип String в Java обрабатываются немного по- другому. Строки неизменяемы, что означает, что каждый раз, когда вы делаете что-то со строкой, в куче фактически создается другой объект. Для строк Java управляет пулом строк в памяти. Это означает, что Java сохраняет и повторно использует строки, когда это возможно. В основном это верно для строковых литералов. Например:

При запуске этот код распечатывает следующее:

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

Strings are different

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

Процесс сборки мусора

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

Объекты, подходящие для сборки мусора

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

Чтобы углубиться в детали, давайте сначала упомянем несколько вещей:

Этот процесс запускается автоматически Java, и Java решает, запускать или нет этот процесс.

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

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

Несмотря на то, что Java решает, когда запускать сборщик мусора, вы можете явно вызвать System.gc() и ожидать, что сборщик мусора будет запускаться при выполнении этой строки кода, верно?

Это ошибочное предположение.

Вы только как бы просите Java запустить сборщик мусора, но, опять же, Java решать, делать это или нет. В любом случае явно вызывать System.gc() не рекомендуется.

Поскольку это довольно сложный процесс и может повлиять на вашу производительность, он реализован разумно. Для этого используется так называемый процесс «Mark and Sweep». Java анализирует переменные из стека и «отмечает» все объекты, которые необходимо поддерживать в рабочем состоянии. Затем все неиспользуемые объекты очищаются.

Так что на самом деле Java не собирает мусор. Фактически, чем больше мусора и чем меньше объектов помечены как живые, тем быстрее идет процесс. Чтобы сделать это еще более оптимизированным, память кучи на самом деле состоит из нескольких частей. Мы можем визуализировать использование памяти и другие полезные вещи с помощью JVisualVM, инструмента, поставляемого с Java JDK. Единственное, что вам нужно сделать, это установить плагин с именем Visual GC, который позволяет увидеть, как на самом деле структурирована память. Давайте немного увеличим масштаб и разберем общую картину:

Поколения памяти кучи

Когда объект создается, он размещается в пространстве Eden (1). Поскольку пространство Eden не такое уж большое, оно заполняется довольно быстро. Сборщик мусора работает в пространстве Eden и помечает объекты как живые.

Если объект выживает в процессе сборки мусора, он перемещается в так называемое пространство выжившего S0(2). Во второй раз, когда сборщик мусора запускается в пространстве Eden, он перемещает все уцелевшие объекты в пространство S1(3). Кроме того, все, что в настоящее время находится на S0(2), перемещается в пространство S1(3).

Если объект выживает в течение X раундов сборки мусора (X зависит от реализации JVM, в моем случае это 8), скорее всего, он выживет вечно и перемещается в пространство Old(4).

Принимая все сказанное выше, если вы посмотрите на график сборщика мусора (6), каждый раз, когда он запускается, вы можете увидеть, что объекты переключаются на пространство выживших и что пространство Эдема увеличивалось. И так далее. Старое поколение также может быть обработано сборщиком мусора, но, поскольку это большая часть памяти по сравнению с пространством Eden, это происходит не так часто. Метапространство (5) используется для хранения метаданных о ваших загруженных классах в JVM.

Представленное изображение на самом деле является приложением Java 8. До Java 8 структура памяти была немного другой. Метапространство на самом деле называется PermGen область. Например, в Java 6 это пространство также хранит память для пула строк. Поэтому, если в вашем приложении Java 6 слишком много строк, оно может аварийно завершить работу.

Читайте также:  мантра отпускания прошлых отношений

Типы сборщиков мусора

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

3. Mostly concurrent GC (В основном параллельный сборщик мусора). Если вы помните, ранее в этой статье упоминалось, что процесс сбора мусора на самом деле довольно дорогостоящий, и когда он выполняется, все потоки приостанавливаются. Однако у нас есть в основном параллельный тип GC, который утверждает, что он работает одновременно с приложением. Однако есть причина, по которой он «в основном» параллелен. Он не работает на 100% одновременно с приложением. Есть период времени, на который цепочки приостанавливаются. Тем не менее, пауза делается как можно короче для достижения наилучшей производительности сборщика мусора. На самом деле существует 2 типа в основном параллельных сборщиков мусора:

Примечание переводчика. Информация про сборщики мусора для различных версий Java приведена в переводе:

Советы и приемы

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

Явно устанавливайте в null устаревшие ссылки. Это сделает объекты, на которые ссылаются, подходящими для сбора мусора.

Избегайте финализаторов (finalizer). Они замедляют процесс и ничего не гарантируют. Фантомные ссылки предпочтительны для работы по очистке памяти.

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

Настройте JVM в соответствии с требованиями вашего приложения. Явно укажите размер кучи для JVM при запуске приложения. Процесс выделения памяти также является дорогостоящим, поэтому выделите разумный начальный и максимальный объем памяти для кучи. Если вы знаете его, то не имеет смысла начинать с небольшого начального размера кучи с самого начала, JVM расширит это пространство памяти. Указание параметров памяти выполняется с помощью следующих параметров:

Если приложение Java выдает ошибку OutOfMemoryError и вам нужна дополнительная информация для обнаружения утечки, запустите процесс с –XX:HeapDumpOnOutOfMemory параметром, который создаст файл дампа кучи, когда эта ошибка произойдет в следующий раз.

Заключение

Источник

Как определяется максимальный размер кучи Java по умолчанию?

«значение по умолчанию выбирается во время выполнения в зависимости от конфигурации системы»

Какие параметры конфигурации системы влияют на значение по умолчанию?

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

В системе Unix / Linux вы можете сделать

Я считаю, что полученный результат в байтах.

начальный размер кучи:

максимальный размер кучи:

ОБНОВИТЬ:

Как отметил Том Андерсон в своем комментарии, вышеизложенное относится к машинам серверного класса. Из эргономики в виртуальной машине JavaTM 5.0 :

В платформе J2SE версии 5.0 класс машины, называемой машиной серверного класса, был определен как машина с

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

В платформе J2SE версии 1.4.2 по умолчанию были сделаны следующие выборы

Вы можете проверить размер кучи Java по умолчанию :

В Windows :

В Linux :

Какие параметры конфигурации системы влияют на значение по умолчанию?

Физическая память машины и версия Java.

Если предположить, что у нас более 1 ГБ физической памяти (довольно часто в наши дни), это всегда 1/4 вашей физической памяти для сервера vm.

Эрнесто прав. По ссылке он разместил [1]:

Обновлена ​​конфигурация кучи клиента JVM

Например, если ваша машина имеет 128 мегабайт физической памяти, то максимальный размер кучи составляет 64 мегабайта, а если размер физической памяти больше или равен 1 гигабайту, максимальный размер кучи составляет 256 мегабайт.

Для IBM JVM эта команда выглядит следующим образом:

Начиная с Java 8u191 у вас теперь есть варианты:

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

См. Примечания к выпуску для Java8 u191 для получения дополнительной информации. Обратите внимание, что параметры упоминаются под заголовком Docker, но на самом деле они применяются независимо от того, находитесь ли вы в среде Docker или в традиционной среде.

Значение по умолчанию для MaxRAMPercentage 25%. Это крайне консервативно.

Настройка MaxRAMPercentage опции выглядит следующим образом:

Обратите внимание, что эти процентные значения имеют тип ‘double’, и поэтому вы должны указывать их с десятичной точкой. Вы получите несколько странную ошибку, если вы используете «75» вместо «75.0».

значение по умолчанию выбирается во время выполнения в зависимости от конфигурации системы

Посмотрите на странице документации

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

Начальный и максимальный размеры кучи клиентской JVM по умолчанию:

Начальный и максимальный размеры кучи сервера JVM по умолчанию:

Какие параметры конфигурации системы влияют на значение по умолчанию?

Xms И Xmx являются флаг виртуальной машины Java (JVM):

Подробнее

Значение параметра по умолчанию

Значения по умолчанию параметров размера кучи в 64-разрядных системах были увеличены примерно на 30%. Это увеличение предназначено для компенсации большего размера объектов в 64-битной системе.

С этими параметрами, если процент свободного пространства в поколении падает ниже 40%, поколение будет расширено, чтобы сохранить 40% свободного пространства, вплоть до максимально допустимого размера поколения. Точно так же, если свободное пространство превышает 70%, генерация будет сокращена, так что только 70% пространства будет свободным, при условии минимального размера генерации.

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

Источник

Увеличить размер heap в Java

11 ответов

можно увеличить до 4 Гб на 32 битной системе. Если вы находитесь в 64-битной системе, вы можете подняться выше. Не нужно беспокоиться, если вы выбрали неправильно, если вы попросите 5g на 32-битной системе java будет жаловаться на недопустимое значение и выйти.

Как и другие, используйте флаги cmd-line-например

вы можете получить полный список (или почти полный список, в любом случае), введя java-X.

можно увеличить размер кучи, выделенный JVM, используя параметры командной строки Здесь у нас есть 3 варианта

в приведенной выше строке мы можем установить минимальную кучу в 16 МБ и максимальную кучу 64 Мб

на 32-битной JVM самый большой размер кучи, который вы можете теоретически установить, составляет 4 ГБ. Чтобы использовать больший размер кучи, вам нужно использовать 64-разрядную JVM. Попробуйте следующее:

флаг-d64 важен, так как это говорит JVM работать в 64-разрядном режиме.

можно увеличить размер кучи, выделенный JVM в eclipse напрямую В eclipse IDE goto

могу ли я увеличить память кучи до 75% физической памяти (куча 6GB).

Да, вы можете. Фактически, вы можете увеличить больше, чем объем физической памяти, если хотите.

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

пожалуйста, используйте команду ниже, чтобы изменить размер кучи на 6GB

вы можете увеличить размер кучи, передав параметры JVM -xms и и — Xmx, как показано ниже:

вышеуказанные параметры увеличивают InitialHeapSize (- Xms) до 4 ГБ (4096 МБ) и MaxHeapSize (- Xmx) до 6 ГБ (6144 Мб).

— XX: NewRatio = старый Gen размер кучи: молодой Gen HeapSize (вы можете играть с этим соотношением, чтобы получить желаемое соотношение).

я делюсь этой информацией, так как моя поиск google о том, как увеличить память jvm, привел меня к этому решению, и решения не работали с большими объемами выделения памяти. Как только я понял, для чего предназначены конкретные настройки, я смог google увеличить размер стека и нашел отсутствующий параметр. 🙂 Надеюсь, это экономит время других, так как это сэкономило бы мне массу времени. 🙂

да. вы можете.

вы можете увеличить память до 75% физической памяти (6 ГБ памяти) или выше.

поскольку вы используете 64bit, вы можете увеличить размер кучи до нужного количества. Если вы используете 32bit, он ограничен 4GB.

устанавливает начальный размер кучи в 512 МБ и максимальный размер кучи в 6 ГБ.

Источник

каким параметром командной строки можно задать максимальный размер памяти java

Как выделить Java больше оперативной памяти

Из-за взаимодействия программного компонента Java с разработанными продуктами могут возникать ошибки, решение которых лежит на плечах пользователя. Оно достигается двумя путями: переустановкой модуля и выделением дополнительной памяти Java. С каждой ситуацией стоит разобраться отдельно.

Зачем увеличивать память Java

Задачу по увеличению Java памяти пользователи ставят перед собой в следующих случаях:

Исправить проблему можно двумя способами.

Как выделить память Java

Выделить Джава-модулю больше оперативной памяти возможно через «Панель управления». Способ удобнее рассмотреть на примере проблем с запуском игры Minecraft.

Инструкция:

Если это не помогло запустить Minecraft, переустановите модуль Java и игру. После удаления очистите реестр с помощью CCleaner.

Увеличение памяти с помощью переменных среды

Чтобы система воспринимала написанные аргументы, нужно добавить переменную с названием «_JAVA_OPTIONS».

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

В примере объем оперативки составлял 1 Гб.

Видео: 3 способа выделить больше памяти Java.

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

Читайте также:  ритуал кладешь рубль берешь тысячу

Увеличить размер heap в Java

11 ответов

можно увеличить до 4 Гб на 32 битной системе. Если вы находитесь в 64-битной системе, вы можете подняться выше. Не нужно беспокоиться, если вы выбрали неправильно, если вы попросите 5g на 32-битной системе java будет жаловаться на недопустимое значение и выйти.

Как и другие, используйте флаги cmd-line-например

вы можете получить полный список (или почти полный список, в любом случае), введя java-X.

можно увеличить размер кучи, выделенный JVM, используя параметры командной строки Здесь у нас есть 3 варианта

в приведенной выше строке мы можем установить минимальную кучу в 16 МБ и максимальную кучу 64 Мб

на 32-битной JVM самый большой размер кучи, который вы можете теоретически установить, составляет 4 ГБ. Чтобы использовать больший размер кучи, вам нужно использовать 64-разрядную JVM. Попробуйте следующее:

флаг-d64 важен, так как это говорит JVM работать в 64-разрядном режиме.

можно увеличить размер кучи, выделенный JVM в eclipse напрямую В eclipse IDE goto

могу ли я увеличить память кучи до 75% физической памяти (куча 6GB).

Да, вы можете. Фактически, вы можете увеличить больше, чем объем физической памяти, если хотите.

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

пожалуйста, используйте команду ниже, чтобы изменить размер кучи на 6GB

вы можете увеличить размер кучи, передав параметры JVM -xms и и — Xmx, как показано ниже:

вышеуказанные параметры увеличивают InitialHeapSize (- Xms) до 4 ГБ (4096 МБ) и MaxHeapSize (- Xmx) до 6 ГБ (6144 Мб).

— XX: NewRatio = старый Gen размер кучи: молодой Gen HeapSize (вы можете играть с этим соотношением, чтобы получить желаемое соотношение).

я делюсь этой информацией, так как моя поиск google о том, как увеличить память jvm, привел меня к этому решению, и решения не работали с большими объемами выделения памяти. Как только я понял, для чего предназначены конкретные настройки, я смог google увеличить размер стека и нашел отсутствующий параметр. 🙂 Надеюсь, это экономит время других, так как это сэкономило бы мне массу времени. 🙂

да. вы можете.

вы можете увеличить память до 75% физической памяти (6 ГБ памяти) или выше.

поскольку вы используете 64bit, вы можете увеличить размер кучи до нужного количества. Если вы используете 32bit, он ограничен 4GB.

устанавливает начальный размер кучи в 512 МБ и максимальный размер кучи в 6 ГБ.

Как определяется максимальный размер кучи Java по умолчанию?

«значение по умолчанию выбирается во время выполнения в зависимости от конфигурации системы»

Какие параметры конфигурации системы влияют на значение по умолчанию?

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

В системе Unix / Linux вы можете сделать

Я считаю, что полученный результат в байтах.

начальный размер кучи:

максимальный размер кучи:

ОБНОВИТЬ:

Как отметил Том Андерсон в своем комментарии, вышеизложенное относится к машинам серверного класса. Из эргономики в виртуальной машине JavaTM 5.0 :

В платформе J2SE версии 5.0 класс машины, называемой машиной серверного класса, был определен как машина с

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

В платформе J2SE версии 1.4.2 по умолчанию были сделаны следующие выборы

Вы можете проверить размер кучи Java по умолчанию :

В Windows :

В Linux :

Какие параметры конфигурации системы влияют на значение по умолчанию?

Физическая память машины и версия Java.

Если предположить, что у нас более 1 ГБ физической памяти (довольно часто в наши дни), это всегда 1/4 вашей физической памяти для сервера vm.

Эрнесто прав. По ссылке он разместил [1]:

Обновлена ​​конфигурация кучи клиента JVM

Например, если ваша машина имеет 128 мегабайт физической памяти, то максимальный размер кучи составляет 64 мегабайта, а если размер физической памяти больше или равен 1 гигабайту, максимальный размер кучи составляет 256 мегабайт.

Для IBM JVM эта команда выглядит следующим образом:

Начиная с Java 8u191 у вас теперь есть варианты:

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

См. Примечания к выпуску для Java8 u191 для получения дополнительной информации. Обратите внимание, что параметры упоминаются под заголовком Docker, но на самом деле они применяются независимо от того, находитесь ли вы в среде Docker или в традиционной среде.

Значение по умолчанию для MaxRAMPercentage 25%. Это крайне консервативно.

Настройка MaxRAMPercentage опции выглядит следующим образом:

Обратите внимание, что эти процентные значения имеют тип ‘double’, и поэтому вы должны указывать их с десятичной точкой. Вы получите несколько странную ошибку, если вы используете «75» вместо «75.0».

значение по умолчанию выбирается во время выполнения в зависимости от конфигурации системы

Посмотрите на странице документации

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

Начальный и максимальный размеры кучи клиентской JVM по умолчанию:

Начальный и максимальный размеры кучи сервера JVM по умолчанию:

Какие параметры конфигурации системы влияют на значение по умолчанию?

Xms И Xmx являются флаг виртуальной машины Java (JVM):

Подробнее

Значение параметра по умолчанию

Значения по умолчанию параметров размера кучи в 64-разрядных системах были увеличены примерно на 30%. Это увеличение предназначено для компенсации большего размера объектов в 64-битной системе.

С этими параметрами, если процент свободного пространства в поколении падает ниже 40%, поколение будет расширено, чтобы сохранить 40% свободного пространства, вплоть до максимально допустимого размера поколения. Точно так же, если свободное пространство превышает 70%, генерация будет сокращена, так что только 70% пространства будет свободным, при условии минимального размера генерации.

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

Управление памятью Java

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

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

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

Для начала давайте посмотрим, как обычно организована память в Java:

Структура памяти

Стек (Stack)

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

Кроме того, переменные в стеке имеют определенную видимость, также называемую областью видимости. Используются только объекты из активной области. Например, предполагая, что у нас нет никаких глобальных переменных (полей) области видимости, а только локальные переменные, если компилятор выполняет тело метода, он может получить доступ только к объектам из стека, которые находятся внутри тела метода. Он не может получить доступ к другим локальным переменным, так как они не выходят в область видимости. Когда метод завершается и возвращается, верхняя часть стека выталкивается, и активная область видимости изменяется.

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

Куча (Heap)

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

Ключевое слово new несет ответственность за обеспечение того, достаточно ли свободного места на куче, создавая объект типа StringBuilder в памяти и обращаясь к нему через «Builder» ссылки, которая попадает в стек.

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

Типы ссылок

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

1. Сильная ссылка

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

Читайте также:  как часто можно рисовать нейрографику

2. Слабая ссылка

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

После сбора мусора ключа из WeakHashMap вся запись удаляется из карты.

3. Мягкая ссылка

Подобно слабым ссылкам, мягкая ссылка создается следующим образом:

4. Фантомная ссылка

Ссылки на String

Ссылки на тип String в Java обрабатываются немного по- другому. Строки неизменяемы, что означает, что каждый раз, когда вы делаете что-то со строкой, в куче фактически создается другой объект. Для строк Java управляет пулом строк в памяти. Это означает, что Java сохраняет и повторно использует строки, когда это возможно. В основном это верно для строковых литералов. Например:

При запуске этот код распечатывает следующее:

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

Strings are different

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

Процесс сборки мусора

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

Объекты, подходящие для сборки мусора

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

Чтобы углубиться в детали, давайте сначала упомянем несколько вещей:

Этот процесс запускается автоматически Java, и Java решает, запускать или нет этот процесс.

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

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

Несмотря на то, что Java решает, когда запускать сборщик мусора, вы можете явно вызвать System.gc() и ожидать, что сборщик мусора будет запускаться при выполнении этой строки кода, верно?

Это ошибочное предположение.

Вы только как бы просите Java запустить сборщик мусора, но, опять же, Java решать, делать это или нет. В любом случае явно вызывать System.gc() не рекомендуется.

Поскольку это довольно сложный процесс и может повлиять на вашу производительность, он реализован разумно. Для этого используется так называемый процесс «Mark and Sweep». Java анализирует переменные из стека и «отмечает» все объекты, которые необходимо поддерживать в рабочем состоянии. Затем все неиспользуемые объекты очищаются.

Так что на самом деле Java не собирает мусор. Фактически, чем больше мусора и чем меньше объектов помечены как живые, тем быстрее идет процесс. Чтобы сделать это еще более оптимизированным, память кучи на самом деле состоит из нескольких частей. Мы можем визуализировать использование памяти и другие полезные вещи с помощью JVisualVM, инструмента, поставляемого с Java JDK. Единственное, что вам нужно сделать, это установить плагин с именем Visual GC, который позволяет увидеть, как на самом деле структурирована память. Давайте немного увеличим масштаб и разберем общую картину:

Поколения памяти кучи

Когда объект создается, он размещается в пространстве Eden (1). Поскольку пространство Eden не такое уж большое, оно заполняется довольно быстро. Сборщик мусора работает в пространстве Eden и помечает объекты как живые.

Если объект выживает в процессе сборки мусора, он перемещается в так называемое пространство выжившего S0(2). Во второй раз, когда сборщик мусора запускается в пространстве Eden, он перемещает все уцелевшие объекты в пространство S1(3). Кроме того, все, что в настоящее время находится на S0(2), перемещается в пространство S1(3).

Если объект выживает в течение X раундов сборки мусора (X зависит от реализации JVM, в моем случае это 8), скорее всего, он выживет вечно и перемещается в пространство Old(4).

Принимая все сказанное выше, если вы посмотрите на график сборщика мусора (6), каждый раз, когда он запускается, вы можете увидеть, что объекты переключаются на пространство выживших и что пространство Эдема увеличивалось. И так далее. Старое поколение также может быть обработано сборщиком мусора, но, поскольку это большая часть памяти по сравнению с пространством Eden, это происходит не так часто. Метапространство (5) используется для хранения метаданных о ваших загруженных классах в JVM.

Представленное изображение на самом деле является приложением Java 8. До Java 8 структура памяти была немного другой. Метапространство на самом деле называется PermGen область. Например, в Java 6 это пространство также хранит память для пула строк. Поэтому, если в вашем приложении Java 6 слишком много строк, оно может аварийно завершить работу.

Типы сборщиков мусора

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

3. Mostly concurrent GC (В основном параллельный сборщик мусора). Если вы помните, ранее в этой статье упоминалось, что процесс сбора мусора на самом деле довольно дорогостоящий, и когда он выполняется, все потоки приостанавливаются. Однако у нас есть в основном параллельный тип GC, который утверждает, что он работает одновременно с приложением. Однако есть причина, по которой он «в основном» параллелен. Он не работает на 100% одновременно с приложением. Есть период времени, на который цепочки приостанавливаются. Тем не менее, пауза делается как можно короче для достижения наилучшей производительности сборщика мусора. На самом деле существует 2 типа в основном параллельных сборщиков мусора:

Примечание переводчика. Информация про сборщики мусора для различных версий Java приведена в переводе:

Советы и приемы

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

Явно устанавливайте в null устаревшие ссылки. Это сделает объекты, на которые ссылаются, подходящими для сбора мусора.

Избегайте финализаторов (finalizer). Они замедляют процесс и ничего не гарантируют. Фантомные ссылки предпочтительны для работы по очистке памяти.

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

Настройте JVM в соответствии с требованиями вашего приложения. Явно укажите размер кучи для JVM при запуске приложения. Процесс выделения памяти также является дорогостоящим, поэтому выделите разумный начальный и максимальный объем памяти для кучи. Если вы знаете его, то не имеет смысла начинать с небольшого начального размера кучи с самого начала, JVM расширит это пространство памяти. Указание параметров памяти выполняется с помощью следующих параметров:

Если приложение Java выдает ошибку OutOfMemoryError и вам нужна дополнительная информация для обнаружения утечки, запустите процесс с –XX:HeapDumpOnOutOfMemory параметром, который создаст файл дампа кучи, когда эта ошибка произойдет в следующий раз.

Заключение

Максимальная память для 64bit Java

каков максимальный объем пространства кучи, который можно выделить для java на 64-битной платформе? Оно неограниченно?

5 ответов

по данным этот FAQ он ограничен только памятью и пространством подкачки в локальной системе:

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

см. также Почему я не могу получить большую кучу с 32-битным Для JVM?

отлично работает на моей машине. Но он, похоже, еще не поддерживает модификатор «t», поэтому вы еще не можете указать максимальную память в терабайтах 🙂

Если бы вы могли сделать каждый атом во Вселенной в байт ОЗУ, вы могли бы выделить его в 64-битном адресном пространстве.

на самом деле, это небольшое преувеличение.

во Вселенной есть 10^80 атомов (согласно WolframAlpha) и 2^64 байта адресного пространства в 64-битной системе, поэтому вы сможете адресовать только 1 из каждых 5×10^60 атомов. Но если у вас есть 18 qintillion байтов ОЗУ, вам, вероятно, понадобится пара квантовых черных дыр для его питания с.

Это, вероятно, зависит от системы, в которой работает ваша виртуальная машина. Если вы используете архитектуру AMD x64, адресное пространство текущих процессоров использует 48 бит, а не 64. Это приводит к теоретическому максимуму примерно 256 ТБ. (См. http://en.wikipedia.org/wiki/X86-64)

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

с недавними VMs от Sun, практически размер предела кучи обычно 512 времен доступная физическая и / или виртуальная память. Даже если теоретический предел намного выше, VM выделит 1 байт для целей maangement для каждых 512 байтов памяти кучи при запуске, поэтому 1 ТБ кучи немедленно потребует 2 ГБ для управления памятью.

в теории его между 2^63 и 2^64 байт.

на практике он ограничен объемом физической памяти и пространства подкачки, доступным на вашем компьютере. А физическая память, в свою очередь, ограничена вашим чипсетом (т. е. количеством адресных контактов на адресной шине физической памяти) и материнской платой (т. е. количеством и размером сокетов DIMM).

Источник

Портал про кино и шоу-биз