Хм, я пока попробую обобщить ответы.
Нет технической причины, по которой JVM должна иметь жесткое ограничение для размера кучи.Он мог бы быть реализован без одного, и на самом деле многие другие динамические языки не имеют этого.
Следовательно, предоставление JVM ограничения размера кучи было просто конструктивным решением разработчиков.Второе предположение, почему это было сделано, немного сложно, и не может быть единственной причины.Наиболее вероятная причина заключается в том, что она помогает защитить систему от Java-программы с утечкой памяти, которая в противном случае может исчерпать всю оперативную память и вызвать сбой других приложений или сбой системы.
Sun могла бы опустить эту функциюи просто сказал людям использовать собственные механизмы ограничения ресурсов ОС, но они, вероятно, хотели всегда иметь ограничение, поэтому они реализовали его сами.В любом случае, JVM должна знать о любом таком ограничении (чтобы адаптировать свою стратегию GC), поэтому использование встроенного в ОС механизма не сэкономило бы много усилий при программировании.
Кроме того, есть одна причина, почемутакой встроенный лимит более важен для JVM, чем для «нормальной» программы без GC (такой как программа на C / C ++):
В отличие от программы с ручным управлением памятью, программа, использующая GC, делаетна самом деле не имеют четко определенных требований к памяти, даже с фиксированными входными данными.Он имеет только минимальное требование, то есть сумму размеров всех объектов, которые фактически живут (достижимы) в данный момент времени.Однако на практике программе потребуется дополнительная память для удержания мертвых, но еще не объектов GCed, поскольку GC не может сразу собрать все объекты, так как это может привести к чрезмерным накладным расходам GC.Таким образом, GC только включается время от времени, и поэтому требуется некоторая «передышка» в куче, где мертвые объекты могут ожидать GC.
Это означает, что память, необходимая для программы, использующей GC, действительнокомпромисс между сохранением памяти и хорошей производительностью (позволяя GC работать реже).Поэтому в некоторых случаях может иметь смысл установить ограничение кучи ниже, чем то, которое JVM будет использовать, если это возможно, поэтому экономьте оперативную память за счет производительности.Для этого должен быть способ установить ограничение кучи.