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


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

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

на данный момент у меня есть следующий ответ:

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

здесь являются ли мои причины для этого ответа:

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

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

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

Ману

6 63

6 ответов:

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

вы можете увидеть это с помощью Process Explorer by Sysinternals вместо диспетчера задач в windows.

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

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

и

  • -Xms512m -Xmx512m

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

  • -Xms64m -Xmx512m

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

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

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

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

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

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

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

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

Я создал эту игрушку пример в 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 версия. Я уверен, что короткие паузы сборки мусора, и длинными выделений.