Почему максимальный размер "кучи" Java зафиксирован?

Это нет возможный для увеличения максимального размера "кучи" Java после VM запустилось. Каковы технические причины этого? Алгоритмы сборки "мусора" зависят от наличия установленного объема памяти для работы с? Или это из соображений безопасности, для предотвращения JAVA-приложения от DOS'ing другие приложения в системе путем потребления всей доступной памяти?

32
задан Community 23 May 2017 в 12:03
поделиться

5 ответов

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

Даже если он не все не используется немедленно, адресное пространство для всей кучи зарезервировано при запуске. Если он не может зарезервировать достаточно большой смежный блок адресного пространства для значения -xmx, который вы проходите его, он не будет начать. Вот почему трудно распределить> 1,4 ГБ кучи на 32-разрядных окнах - потому что трудно найти смежные адресные пространства в этом размере или больше, поскольку некоторые DLL любят загружаться в определенные места, фрагментируют адресное пространство. Это не проблема, когда вы идете 64-битные, так как есть намного больше адресное пространство.

Это почти наверняка по причинам эффективности. Я не смог найти потрясающую ссылку, детализирующую это дальше, но вот довольно хорошая цитата из Peter Kessler ( Полная ссылка - Обязательно прочитайте комментарии), которые я нашел при поиске. Я верю, что он работает на JVM на солнце.

Причина, по которой нам нужна смежная память регион для кучи в том, что у нас есть куча боковых данных структур, которые проиндексированы (масштабированные) смещениями из Начало кучи. Например, мы Обновления справочника отслеживания объектов с «Массив карты карты», который имеет один байт Для каждого 512 байтов кучи. Когда мы хранить ссылку в куче у нас есть отметить соответствующий байт в Массив карты карты. Мы правы сдвигаем адрес назначения магазина и Используйте это, чтобы индексировать массив Mark Card. Веселые решающие арифметические игры вы не могу сделать в Java, что вы добираетесь (имеют :-) Игра в C ++.

Это было в 2004 году - я не уверен, что изменилось с тех пор, но я уверен, что он все еще держит. Если вы используете инструмент, похожий на Process Explorer, вы можете увидеть, что виртуальный размер (добавление столбцов памяти виртуального размера и частного размера) приложения Java включает в себя общее количество кучи (плюс другое необходимое пространство, без сомнения) с точки запуска Несмотря на то, что память «используется» процессом не будет, где рядом с тем, пока куча не начнет заполнять ...

23
ответ дан 27 November 2019 в 21:05
поделиться

Если вы имеете в виду HashCode как в .GetHashCode () , боюсь, вы не можете вернуться назад. Хеш-функции не являются двунаправленными, вы можете идти только вперед, а не назад.

Следуйте предложению Одеда, если нужно получить цвет на основе шестнадцатеричного значения цвета.

-121--1788692-

Используйте

System.Drawing.Color.FromArgb(myHashCode);
-121--1788694-

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

Наиболее убедительным примером использования такой функции является настольный ПК, IMO и Java. Когда речь заходит о механике запуска JVM, это всегда было катастрофой на настольном ПК. Я подозреваю, что те, кто больше всего думает об этих проблемах, как правило, фокусируются на стороне сервера и просматривают любые другие детали, лучше всего оставленные нативным оберткам. Это досадное решение, но оно должно быть просто одним из пунктов решения при принятии решения о правильной платформе для заявки.

4
ответ дан 27 November 2019 в 21:05
поделиться

Мои кишечники - это то, что он имеет отношение к управлению памятью относительно других приложений, работающих в операционной системе.

Если вы устанавливаете максимальный размер кучи, например, объем ОЗУ на коробке, который вы эффективно позволяете VM решить, сколько памяти требуется (до этого предела). Проблема с этим состоит в том, что VM может эффективно калечить машину, на которой он работает, потому что она заберет всю память на коробке до того, как она решила, что это необходимо для сборки мусора.

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

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

3
ответ дан 27 November 2019 в 21:05
поделиться

Из советов по настройке производительности IBM (так не может быть непосредственно применимо к VMS Sun)

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

JVM имеет пороговые значения, которые он использует для управления хранением JVM. Когда пороги достигнуты, сборщик мусора взыскал, чтобы освободить неиспользуемое хранение. Следовательно, сборка мусора может привести к значительной деградации производительности Java. Перед изменением начальных и максимальных размеров кучи необходимо учитывать следующую информацию: В большинстве случаев вы должны установить максимальную размер кучи JVM для значения выше, чем первоначальный размер кучи JVM. Это позволяет JVM эффективно работать в течение нормальных, устойчивых состояний в пределах пренебреживания начальной кучи, но и для эффективного управления в течение периодов высокого объема транзакции путем расширения кучи до максимального размера кучи JVM. В некоторых редких случаях, когда требуется абсолютная оптимальная производительность, вы можете указать то же значение как для начального, так и максимального размера кучи. Это устранит некоторые накладные расходы, которые возникают, когда JVM необходимо расширить или сократить размер кучи JVM. Убедитесь, что регион достаточно большой, чтобы удерживать указанную кучу JVM. Остерегайтесь сделать начальную размер кучи слишком большим. Хотя большой размер кучи изначально улучшает производительность путем задержки сбора мусора, большая часть кучи в конечном итоге влияет на время отклика, когда сборка мусора в конечном итоге пинает, потому что процесс сбора занимает больше времени.

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

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

Я признаю, что все немного неудовлетворительно, и кажется немного ленивым, так как я могу представить разумную стратегию для сбора мусора, которая увеличила бы размер кучи, когда GC не может освободить достаточно места. Приведут ли мое воображение к высокопроизводительному осуществлению GC, это другое дело;)

2
ответ дан 27 November 2019 в 21:05
поделиться

Исторически существует причина этого ограничения, что нельзя разрешать апплетам в браузере съесть все память пользователей. Microsoft VM, которая никогда не имела такого ограничения, на самом деле не позволило сделать это, что может привести к какому-либо отказу от атаки службы на компьютере пользователей. Только год назад было всего год назад, что Солнце ввело в обновлении 1,6,0 виртуальной машины 1.6.0, способ определить, сколько памяти они хотят (ограничена определенной фиксированной долой физической памятью) вместо того, чтобы всегда ограничить их до 64 МБ даже на компьютерах которые имеют 8 ГБ или более доступны.

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

8
ответ дан 27 November 2019 в 21:05
поделиться
Другие вопросы по тегам:

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