Зачем вам нужно указывать размер кучи Java? - PullRequest
18 голосов
/ 19 августа 2010

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

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

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

Ответы [ 4 ]

7 голосов
/ 19 августа 2010

Три причины:

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

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

4 голосов
/ 19 августа 2010

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

1 голос
/ 19 августа 2010

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

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

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

...