Параметры кучи JVM

После прочтения уже заданного вопроса по этому вопросу и большого количества поисковых запросов, я все еще не могу получить четкое представление о опции -Xms

Мой вопрос: какая разница между java -Xms=512m -Xmx=512m и java -Xms=64m -Xmx=512m?

Теперь у меня есть следующий ответ:

Единственное различие заключается в количестве сборок мусора, которые будут выполняться во время моего запуска приложения и количества распределений памяти. Я прав?

Вот мои причины для этого ответа:

Настройка параметра -Xms на 512m не приводит к тому, что мое приложение действительно использует 512m физической памяти после запуска. Я полагаю, это связано с современным управлением виртуальной памятью операционной системы и распределением ленивых страниц. (Я заметил, что установка -Xms на 512m или 64M не меняет вообще начальную используемую память, указанную либо сверху, либо Linux, либо диспетчер задач в окнах)

Может кто-нибудь помочь мне понять влияние этого параметра Xms или указать мне ссылки, которые помогут мне понять это?

Заранее спасибо

Мана

Ответ 1

Подводя итог информации, найденной после ссылки: JVM выделяет сумму, указанную -Xms, но ОС обычно не выделяет реальные страницы, пока они не понадобятся. Таким образом, JVM выделяет виртуальную память, как указано Xms, но только выделяет физическую память по мере необходимости.

Вы можете увидеть это, используя Process Explorer от Sysinternals вместо диспетчера задач в окнах.

Таким образом, существует реальная разница между использованием -Xms64M и -Xms512M. Но я думаю, что наиболее важным отличием является тот, который вы уже указали: сборщик мусора будет работать чаще, если вам действительно нужен 512 МБ, но только начался с 64 МБ.

Ответ 2

JVM начнет с использования памяти на начальном уровне кучи. Если maxheap выше, он будет увеличиваться до максимального значения, так как требования к памяти превышают текущую память.

Итак,

  • -Xms512m -Xmx512m

JVM начинается с 512 М, никогда не изменяется.

  • -Xms64m -Xmx512m

JVM начинается с 64M, растет (до максимального потолка 512), если mem. требования превышают 64.

Ответ 3

Помимо стандартных параметров кучи -Xms и -Xmx, также хорошо знать -XX:PermSize и -XX:MaxPermSize, который используется для указания размера пространства пермского Gen, потому что, хотя у вас может быть место в другом поколении в куче вы можете исчерпать память, если ваше пространство perm gen заполняется. Эта ссылка также имеет хороший обзор некоторых важных параметров JVM.

Ответ 4

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

Обычно лучше просто установить -Xmx и позволить JVM найти лучший размер кучи, если нет конкретной причины, по которой вам нужно дать JVM большую кучу при запуске JVM.

Насколько JVM фактически запрашивает память из ОС, я считаю, что это зависит от платформы и реализации JVM. Я предполагаю, что он не будет запрашивать память, пока ваше приложение действительно не понадобится. -Xmx и -Xms просто резервируют память.

Ответ 5

если вы написали: -Xms512m -Xmx512m когда он запускается, java выделяет в тот момент 512 м RAM для своего процесса и не может увеличиваться.

-Xms64m -Xmx512m когда он запускается, java выделяет только 64 м RAM для своего процесса, но java может увеличивать занятие памяти до 512 м.

Я думаю, что вторая вещь лучше, потому что вы даете java автоматическое управление памятью.

Ответ 6

Я создал этот игрушечный пример в scala, my_file.scala:

object MyObject {

    def main(args: Array[String]) {
        var ab = ArrayBuffer.empty[Int]

        for (i <- 0 to 100 * 1000 * 1000) {
            ab += i
            if (i % 10000 == 0) {
                println("On : %s".format(i))
            }
        }
    }
}

Я запустил его с помощью:

scala -J-Xms500m -J-Xmx7g my_file.scala

и

scala -J-Xms7g -J-Xmx7g my_file.scala

В версии -Xms500m есть заметные паузы. Я уверен, что короткие паузы - это сборки мусора, а длинные - распределения кучи.