2010-08-18 5 views
17

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

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

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

ответ

4

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

4

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

1

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

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

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

7

Три причины:

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

У вас есть источник для первого пункта? Я никогда не слышал, чтобы «Java был предназначен для написания веб-приложений» раньше (не то, чтобы я вникал в историю java, либо ...) – Mike

+2

Священная неверная модерация.Java произошла от Oak, которая предназначалась для реализации программного обеспечения с приставкой, как, например, в сложных кабельных ТВ-тюнерах. А поскольку сбор мусора идет, мусор собирается, когда объект недоступен, а не когда достигаются пределы памяти. –

+0

@ Edwin Buck: 'мусор собирается, когда объект недоступен, а не когда достигнуты пределы памяти. Правда, но они не являются« немедленно »GCd. Как быстро вы должны быть зависимы от размера кучи и могут быть чрезвычайно важны для производительности. –

Смежные вопросы