Кажется, что JVM использует некоторый фиксированный объем памяти. По крайней мере, я часто видел параметры -Xmx
(для максимального размера) и -Xms
(для начального размера), которые предполагают, что.
У меня появилось ощущение, что приложения Java не очень хорошо обрабатывают память. Некоторые вещи, которые я заметил:
-
Даже некоторые очень маленькие демоверсии приложений загружают огромное количество памяти. Возможно, это из-за загруженной библиотеки Java. Но зачем нужно загружать библиотеку для каждого экземпляра Java? (Кажется, это потому, что несколько небольших приложений линейно занимают больше памяти. См. здесь для некоторых деталей, где я описываю эту проблему.) Или почему это делается так?
-
Большие приложения Java, такие как Eclipse, часто вылетают с некоторым исключением OutOfMemory. Это всегда было странно, потому что в моей системе было еще много памяти. Зачастую они потребляют все больше памяти за время исполнения. Я не уверен, что у них есть утечки памяти, или если это из-за фрагментации в пуле памяти - у меня возникло ощущение, что последнее имеет значение.
-
Библиотека Java, похоже, требует гораздо больше памяти, чем аналогичные мощные библиотеки, например Qt. Почему это? (Чтобы сравнить, запустите некоторые приложения Qt и посмотрите на использование их памяти и запустите некоторые Java-приложения.)
Почему он не использует только базовую системную технику, например malloc
и free
? Или, если им не нравится реализация libc, они могут использовать jemalloc (например, во FreeBSD и Firefox), который кажется довольно хорошим. Я уверен, что это будет работать лучше, чем пул памяти JVM. И не только лучше работать, но и требовать меньше памяти, особенно. для небольших приложений.
Дополнение: кто-нибудь уже пробовал это? Мне было бы очень интересно использовать JIT-компилятор на основе LLVM для Java, который просто использует malloc
/free
для обработки памяти.
Или, может быть, это также отличается от реализации JVM до реализации? Я использовал в основном Sun JVM.
(Также обратите внимание: я не говорю напрямую о GC здесь. GC отвечает только за то, чтобы вычислить, какие объекты могут быть удалены, и инициализировать освобождение памяти, но фактическое освобождение - это другая подсистема. Afaik, это некоторые собственная реализация пула памяти, а не просто вызов free
.)
Изменить: Очень близкий вопрос: Почему у JVM (Sun) есть фиксированный верхний предел для использования памяти? Или иначе: зачем обрабатывать JVM? распределения памяти по-разному, чем собственные приложения?