JVM увеличивает размер кучи, когда ему нужно до максимум размер кучи, который вы установили. Это не займет всю память, как он должен заранее выделить это при запуске, и вы можете использовать некоторую память для чего-то еще, например, стеки потоков, доля библиотек, от динамической памяти и т.д.
Почему Java не расширьте размер кучи, пока он не достигнет предела памяти процесса, установленного ОС, так же, как это делает .NET CLR?
Если вы установили максимальный размер кучи, достаточно большой или воспользуетесь памятью кучи, он будет. По умолчанию это не будет сделано. Одна из причин заключается в том, что память кучи должна находиться в основной памяти и не может быть заменена без потери производительности вашего компьютера (если не убить ваш компьютер). Это не относится к программам C, и расширение настолько сильно, что не может расширяться.
Если у вас есть JVM с размером кучи на 10% больше, чем основная память, и вы так много используете, как только вы выполняете GC, который должен касаться каждой страницы более одного раза, вы, скорее всего, найдете вас необходимо задействовать цикл коробки.
У Linux есть убийца процесса, когда ресурсы исчерпаны, и это не вызывает у вас может быть достаточно удачи для перезапуска.
Является ли это просто политика сделано разработчиками виртуальной машины Java, или является преимуществом архитектуры .NET CLR над одной
Ключевой особенностью JVM в части виртуальной машины Java является то, что она не зависит от платформы, поэтому она имеет его собственный контроль. JVM, работающий на пределе пространства вашего процесса, скорее всего, не позволит вашему компьютеру работать (от тяжелой замены). Я не знаю, что .NET избегает этого.
Другими словами, если инженеры Oracle хотят реализовать автоматическое расширение кучи для JVM, могут ли они это сделать?
Это уже так, как я уже сказал, просто не рекомендуется позволять ему использовать слишком много памяти.
Да, но нельзя всегда угадать, сколько памяти требуется для кода? Кроме того, небезопасно устанавливать Xmx как можно выше (например, 100 ГБ!). Если пользователю нужно запустить мой код для больших данных, он может предоставить больше ОЗУ. Почему я должен, как разработчик, установить максимальную доступную память моей программы? Я не знаю, насколько велики обрабатываемые данные. – Ali
Если вы не знаете, насколько велики ваши данные, тогда это ваш недостаток в дизайне. Прежде чем продукт будет отправлен клиентам, будут проверены граничные случаи (часть SDLC). И вы спрашиваете **, должен ли я, как разработчик, установить максимальную доступную память моей программы? **, потому что вы должны сообщить своему клиенту (также документу), что это максимальная загрузка, которую может принять программа (или, как правило, это другое путь вокруг значения зависит от требований клиента, но тем не менее мы знаем оценки). –
Например, если вы создаете текстовое приложение в android и данные превышают установленную максимальную память (если не установлены некоторые значения по умолчанию, которые BTW не являются хорошей практикой программирования, если вы делаете клиентский продукт), то приложение просто будет авария (которую вы явно не хотите). Скорее, если у вас есть оценки, вы можете предупредить пользователя об увеличении нагрузки. –