Почему в Java есть настройка максимальной кучи? - PullRequest
3 голосов
/ 08 декабря 2010

После прочтения Сколько символов может иметь строка Java? Я удивился:

Почему в текущих JVM установлены настройки максимальной кучи?Почему бы просто не запросить больше памяти у операционной системы, когда куча памяти заканчивается, и сборщик мусора не смог освободить необходимую память?Кто-нибудь знает обоснование этого?

Ответы [ 7 ]

3 голосов
/ 08 декабря 2010

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

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

2 голосов
/ 08 декабря 2010

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

2 голосов
/ 08 декабря 2010

Поскольку вы не хотите, чтобы JVM брала на себя все возможные ресурсы в вашей O / S (ну, в некоторых случаях вы это делаете, но в этом случае установите максимальный размер кучи равным максимальному для вашей JVM, комбо O / S можетручка).

1 голос
/ 08 декабря 2010

Две вещи:

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

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

1 голос
/ 08 декабря 2010

Потому что физическая память тоже ограничена. Вы не можете просить больше и больше. На самом деле вы можете и ОС будет выделять виртуальную память, даже если физическая память недоступна. Память будет выделена на диске, что может вызвать серьезные проблемы с производительностью. В худшем случае завис весь компьютер, и вы ничего не можете с ним сделать. Лучше потерпеть неудачу раньше, то есть лучше, если сбой JVM будет зависать, чем физический хост.

1 голос
/ 08 декабря 2010

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

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

0 голосов
/ 08 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...