Ваш коллега понятия не имеет, о чем они говорят.
Ваша самая дорогая операция будет слушать их . Они потратили впустую ваше время, неправильно направляя вас к информации, которая устарела более чем на десятилетие (на дату первоначального опубликования этого ответа), а также к тому, что вам приходилось тратить время на публикацию здесь и исследование Интернета на предмет правды.
Надеюсь, они просто невежественно отрыгивают то, что слышали или читали более десяти лет назад, и не знают ничего лучшего. В качестве подозреваемого я бы также взял все, что они говорят, это должно быть хорошо известной ошибкой любого, кто в любом случае идет в ногу со временем.
Все является объектом (кроме primitives
)
Все, кроме примитивов ( int, long, double
и т. Д.), Являются объектами в Java. Нет способа избежать создания объекта в Java.
Создание объектов в Java из-за его стратегий распределения памяти в большинстве случаев быстрее, чем C ++, и для всех практических целей по сравнению со всем остальным в JVM можно считать «свободным» .
Еще в конце 1990-х - начале 2000-х реализации JVM действительно имели некоторые потери производительности при фактическом распределении объектов. Такого не было по крайней мере с 2005 года.
Если вы настроите -Xms
поддержку всей памяти, необходимой для правильной работы вашего приложения, GC, возможно, никогда не придется запускать и убирать большую часть мусора в современных реализациях GC, недолговечные программы могут вообще никогда не GC.
Он не пытается максимизировать свободное пространство, которое в любом случае является красной сельдью, он максимизирует производительность среды выполнения. Если это означает, что куча JVM распределяется почти на 100% все время, пусть будет так. Свободная память кучи JVM ничего не дает, просто сидя там.
Существует неправильное представление о том, что GC освободит память для остальной части системы полезным способом, это полностью неверно!
Куча JVM не увеличивается и не сжимается, поэтому свободная память в куче JVM положительно влияет на остальную часть системы . -Xms
выделяет ВСЕ из того, что указано при запуске, и его эвристика заключается в том, чтобы никогда не высвобождать часть этой памяти обратно в ОС для совместного использования с любыми другими процессами ОС, пока этот экземпляр JVM не завершится полностью. -Xms=1GB -Xmx=1GB
выделяет 1 ГБ ОЗУ независимо от того, сколько объектов фактически создано в любой момент времени. Существуют некоторые настройки, которые позволяют процентам памяти кучи быть освобожденными, но для всех практических целей JVM никогда не в состоянии освободить достаточно этой памяти, чтобы это когда-либо происходилопоэтому никакие другие процессы не могут освободить эту память, поэтому остальная часть системы не получает выгоды от того, что JVM Heap также свободна. RFE для этого был «принят» 29 ноября 2006 года, но с этим ничего не было сделано. Такое поведение не считается проблемой ни у кого из авторитетов.
Существует ошибочное мнение, что создание множества небольших объектов с коротким сроком службы заставляет JVM приостанавливаться на длительные периоды времени, теперь это также неверно
Текущие алгоритмы GC на самом деле оптимизированы для создания множества мелких объектов, которые недолговечны, что в принципе на 99% эвристично для объектов Java в каждой программе. Попытки объединения объектов на самом деле приведут к снижению производительности JVM в большинстве случаев.
Единственные объекты, которые сегодня нуждаются в объединении, - это объекты, которые ссылаются на конечные ресурсы, внешние по отношению к JVM; Сокеты, файлы, соединения с базой данных и т. Д. И могут быть использованы повторно. Обычные объекты не могут быть объединены в том же смысле, что и в языках, которые позволяют вам прямой доступ к ячейкам памяти. Кэширование объектов - это другое понятие, которое может или не может быть тем, что некоторые люди наивно называют объединением , эти два понятия не одно и то же, и их не следует смешивать.
Современные алгоритмы GC не имеют этой проблемы, потому что они не освобождают по расписанию, они освобождают, когда в определенном поколении необходима свободная память. Если куча достаточно велика, то освобождение не происходит достаточно долго, чтобы вызвать паузы.
Объектно-ориентированные динамические языки превосходят C даже сейчас на тестах, чувствительных к вычислениям.