2013-09-12 2 views
6

Почему Java не расширяет размер кучи, пока не достигнет предела памяти процесса, установленного ОС, так же, как .NET CLR делает?Почему Java не поддерживает автоматическое расширение кучи?

Является ли это просто политикой разработчиков JVM или является преимуществом архитектуры .NET CLR над JVM? Другими словами, если инженеры Oracle хотят реализовать автоматическое расширение кучи для JVM, смогут ли они это сделать?

Благодаря

EDIT: Я действительно думаю, что это плохой выбор дизайна для Java. Небезопасно устанавливать Xmx как можно выше (например, 100 ГБ!). Если пользователю нужно запустить мой код для больших данных, он может запустить его в системе с более доступной оперативной памятью. Почему я должен, как разработчик, установить максимальную доступную память моей программы? Я не знаю, какой размер данных!

ответ

6

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

Почему Java не расширьте размер кучи, пока он не достигнет предела памяти процесса, установленного ОС, так же, как это делает .NET CLR?

Если вы установили максимальный размер кучи, достаточно большой или воспользуетесь памятью кучи, он будет. По умолчанию это не будет сделано. Одна из причин заключается в том, что память кучи должна находиться в основной памяти и не может быть заменена без потери производительности вашего компьютера (если не убить ваш компьютер). Это не относится к программам C, и расширение настолько сильно, что не может расширяться.

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

У Linux есть убийца процесса, когда ресурсы исчерпаны, и это не вызывает у вас может быть достаточно удачи для перезапуска.

Является ли это просто политика сделано разработчиками виртуальной машины Java, или является преимуществом архитектуры .NET CLR над одной

Ключевой особенностью JVM в части виртуальной машины Java является то, что она не зависит от платформы, поэтому она имеет его собственный контроль. JVM, работающий на пределе пространства вашего процесса, скорее всего, не позволит вашему компьютеру работать (от тяжелой замены). Я не знаю, что .NET избегает этого.

Другими словами, если инженеры Oracle хотят реализовать автоматическое расширение кучи для JVM, могут ли они это сделать?

Это уже так, как я уже сказал, просто не рекомендуется позволять ему использовать слишком много памяти.

3

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

Мы можем установить свойство размера кучи

-Xms<size>  set initial Java heap size 
-Xmx<size>  set maximum Java heap size 
-Xss<size>  set java thread stack size 

Как вы можете видеть, мы устанавливаем начальный размер кучи, и если позже JVM обнаруживает, что требуется больше, тогда он может увеличить размер кучи до максимального указанного предела. Infact изменения размера, когда мы делаем GC (не мандат). Я опубликовал question на подобных основаниях. Вы можете обратиться к нему. Таким образом, увеличение/уменьшение размера кучи выполняется JVM. Все, что мы должны делать, поскольку разработчики определяют ограничение, основанное на наших требованиях.

+0

Да, но нельзя всегда угадать, сколько памяти требуется для кода? Кроме того, небезопасно устанавливать Xmx как можно выше (например, 100 ГБ!). Если пользователю нужно запустить мой код для больших данных, он может предоставить больше ОЗУ. Почему я должен, как разработчик, установить максимальную доступную память моей программы? Я не знаю, насколько велики обрабатываемые данные. – Ali

+0

Если вы не знаете, насколько велики ваши данные, тогда это ваш недостаток в дизайне. Прежде чем продукт будет отправлен клиентам, будут проверены граничные случаи (часть SDLC). И вы спрашиваете **, должен ли я, как разработчик, установить максимальную доступную память моей программы? **, потому что вы должны сообщить своему клиенту (также документу), что это максимальная загрузка, которую может принять программа (или, как правило, это другое путь вокруг значения зависит от требований клиента, но тем не менее мы знаем оценки). –

+0

Например, если вы создаете текстовое приложение в android и данные превышают установленную максимальную память (если не установлены некоторые значения по умолчанию, которые BTW не являются хорошей практикой программирования, если вы делаете клиентский продукт), то приложение просто будет авария (которую вы явно не хотите). Скорее, если у вас есть оценки, вы можете предупредить пользователя об увеличении нагрузки. –

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