Подтвердить что ты не робот

Почему вам нужно указать размер кучи Java?

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

В мире Java нам нужно установить размер кучи, стека и перменца. Хотя это достаточно просто, забывая увеличить их до "достаточно больших" чисел, это причина №1, по которой я видел серверы.

Почему невозможно сказать Java, чтобы вырастить кучу/стек/подменю столько, сколько нужно с течением времени?

4b9b3361

Ответ 1

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

Ответ 2

Три причины:

  • Потому что Java был предназначен для написания веб-приложений. Как правило, не считается хорошей идеей позволить веб-приложению взять на себя все компьютерные ресурсы.
  • Потому что Java - сбор мусора. Помимо указания верхнего предела памяти, размер кучи также вызывает сбор мусора. По сути, вы говорите: "вы можете использовать это много, но когда вы нажимаете этот предел, вы должны убирать".
  • Существует множество классов приложений, в которых вы хотите ограничить объем памяти, используемый процессом Java, например. где важнее, чтобы другие процессы продолжались, когда для них недостаточно памяти.
  • Поскольку возможность ограничения размера кучи - это функция. Если вам нравится подход, в котором процесс может иметь неограниченную память (как на других упомянутых языках), вы всегда можете установить ограничение на кучу больше, чем он мог бы приобрести. Если вы хотите ограничить размер кучи, вы можете это сделать. На других языках есть только одно из возможных способов поведения, что делает их менее гибкими.

Ответ 3

Я думаю, потому что фактическая память компьютера конечна. Таким образом, в некотором смысле JVM позволяет обнаруживать memleaks, прежде чем вся память будет потрачена впустую.
Кроме того, что делать, если вы запускаете несколько JVM на одной машине - в этом случае, как вы позволяете каждой из этих JVM расти "столько, сколько нужно"?

Ответ 4

Поскольку динамический рост кучи, стека и подменю просто увеличил бы сервер, все равно. В таком мире сервер будет в конечном итоге утечка всех его ресурсов.

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

Да, это догадки, но разумные; особенно если вы считаете, что Java/Oak возникло из встроенного программирования топ-боксов. Это не похоже на то, что встроенная система будет иметь подкачку или резервную копию виртуальной памяти, поэтому почему JVM действует так, как если бы он был доступен?