Настройки кучи
-Xmx3550M: установите максимальную память кучи JVM до 3550 м.
-Xms3550m: установите начальную память кучи JVM до 3550M. Это значение может быть установлено так же, как -xmx, чтобы избежать перераспределяющей памяти JVM каждый раз, когда сборка мусора завершается.
-Xss128k: Установите размер стека в каждом потоке. После JDK5.0 каждый размер стека потоков будет 1 м, а до этого размер стека в потоке будет 256 тыс.. Его следует отрегулировать в соответствии с необходимым размером памяти потока приложения. В той же физической памяти уменьшение этого значения может генерировать больше потоков. Тем не менее, операционная система по -прежнему имеет ограничение на количество потоков в процессе и не может быть получена бесконечно, с значениями опыта в диапазоне от 3000 до 5000.
-Xmn2g: Установите размер молодого поколения Memory Memory на 2G. Весь размер памяти в куче = размер молодого поколения + размер старого поколения + постоянный размер генерации. Постоянное поколение обычно фиксируется размером 64 м, поэтому после увеличения молодого поколения размер старшего поколения будет уменьшен. Это значение оказывает большое влияние на производительность системы, и Sun официально рекомендует настройку как 3/8 всей кучи.
-Xx: permsize = 256m: установите начальное значение постоянной генерации памяти на 256 м. (Похоже, что параметры инициализации IDE, такие как Eclipse)
-Xx: maxnewsize = size: максимальное значение, которое недавно сгенерированный объект может занимать память.
-Xx: maxpermsize = 512M: установите максимальное значение постоянной генерации на 512 м.
-Xx: Newratio = 4: установите соотношение молодого поколения памяти Heap (включая Eden и две области выживших) к старому поколению памяти кучи (исключая постоянное поколение). Если установлено 4, отношение молодого поколения к старшему поколению составляет 1: 4.
-Xx: Survivivorratio = 4: установите соотношение области Eden к области выжившего в молодом поколении памяти кучи. Установленное 4, отношение между двумя областями выживших (молодое поколение JVM Memory Memory имеет две области выживших по умолчанию), а одна область Eden составляет 2: 4, а одна область выживших составляет 1/6 всего молодого поколения.
-Xx: maxtenuringthreshold = 7: означает, что объект помещается в пожилых людей, если он движется 7 раз в спасательном пространстве (зона выжившего) и не был переработан.
Если установить 0, объекты молодого поколения не проходят через область выжившего и непосредственно входят в старое поколение. Для получения дополнительных приложений в старом поколении это может повысить эффективность.
Если это значение установлено к большему значению, объект молодого поколения будет скопирован несколько раз в области выжившего, что может увеличить время выживания объекта в молодом поколении и увеличить вероятность того, что объект будет переработан в молодом поколении.
Отбор переработки
JVM дает три варианта: серийный коллекционер, параллельный коллектор и одновременный коллекционер, но серийный коллекционер подходит только для небольших объемов данных, поэтому выбор здесь в основном для параллельного коллекционера и одновременного коллекционера.
По умолчанию JDK5.0 раньше использовал серийных коллекционеров. Если вы хотите использовать другие коллекционеры, вам нужно добавить соответствующие параметры при запуске. После JDK5.0 JVM вынесет интеллектуальные суждения на основе текущей конфигурации системы.
Серийный коллекционер
-Xx:+userialgc: установить серийный коллекционер
Параллельный коллекционер (приоритет пропускной способности)
-Xx:+useparallgc: выберите сборщик мусора в качестве параллельного коллекционера. Эта конфигурация действительна только для молодого поколения. То есть, в соответствии с вышеупомянутой конфигурацией, молодое поколение использует одновременную коллекцию, в то время как старшее поколение по -прежнему использует последовательную коллекцию.
-Xx: parallelgcthreads = 20: Настройте количество потоков параллельного коллекционера, то есть сколько потоков собирается мусор одновременно. Это значение лучше всего настроено, чтобы быть равным количеству процессоров.
-Xx:+useparalleloldgc: настроить метод сбора мусора старого поколения для параллельной коллекции. JDK6.0 поддерживает параллельную коллекцию для старших поколений.
-Xx: maxgcpausemillis = 100: устанавливает максимальное время (в миллисекундах) для каждой сборки мусора молодого поколения. Если это время не может быть встречено, JVM автоматически отрегулирует размер молодого поколения, чтобы соответствовать этому значению.
-Xx:+UseAptivesizePolicy: После установки этой опции параллельный коллекционер автоматически выберет размер области молодого поколения и соответствующее соотношение области выживших для достижения минимального времени отклика или частоты сбора, указанной целевой системой.
Этот параметр рекомендуется включать при использовании параллельного коллекционера.
Одновременный коллекционер (время отклика предпочтительнее)
-Xx:+useParnewgc: установить молодое поколение в одновременную коллекцию. Можно использовать одновременно с коллекцией CMS. JDK5.0 или выше, JVM установит его в соответствии с конфигурацией системы, поэтому нет необходимости снова устанавливать это значение.
CMS, полное именем comprolrentlowpausecollector, представляет собой новый алгоритм GC, представленный в более поздней версии JDK1.4. Это было дополнительно улучшено в JDK5 и JDK6. Его основной подходящий сценарий заключается в том, что важность времени отклика превышает требования к пропускной способности, может выдержать потоки сбора мусора и потоки приложений обмена ресурсами процессора, и в приложении существует относительно много долговременных объектов. CMS используется для утилизации TenureDEnteration, то есть утилизации пожилых людей. Цель состоит в том, чтобы минимизировать время паузы приложения, уменьшить вероятность появления FullGC и использовать потоки сбора мусора, одновременно с потоками приложений, чтобы отметить и очистить пожилых людей.
-Xx:+useconcmarksweepgc: установить старое поколение в одновременную коллекцию. После настройки этого в тесте конфигурация -xx: newratio = 4 недействительна. Следовательно, лучше всего установить размер молодого поколения с -XMN в настоящее время.
-Xx: cmsfullgcsbeforecompaction =: Поскольку одновременный сборщик не сжимает и не организует пространство памяти, «фрагменты» будут генерироваться после работы в течение определенного периода времени, что снизит эффективность работы. Этот параметр устанавливает сжатие и организованное пространство памяти после запуска FullGC.
-Xx:+usecmscompactatfullcollection: включить сжатие для старших поколений. Может повлиять на производительность, но может устранить фрагментацию памяти.
-Xx:+cmsincrementalMode: установить в режим инкрементного сбора. Обычно применимо к ситуации с одним процессором.
-Xx: cmsinitiationoccupancyfraction = 70: означает, что когда пространство старого поколения достигнет 70%, CMS будет начат выполнять, чтобы убедиться, что у старого поколения достаточно места, чтобы принять объекты от молодого поколения.
ПРИМЕЧАНИЕ. Если вы используете два коллекционера мусора, пропускной пропускной способ и одновременный и одновременный
другой
-Xx:+scavengebeforefullgc: следующее поколение GC имеет приоритет над Fullgc.
-Xx: -disableExplicitGC: ингибируйте Cl
-Xx:+maxfdlimit: максимизировать предел количества файловых дескрипторов.
-Xx:+usethreadpriorities: включить API локального приоритета потока, даже если Java.lang.Thread.SetPriority () вступает в силу, он будет недействительным.
-Xx: softreflruporymymspermb = 0: объект «мягкая ссылка» может выжить через 0 миллисекунд после последнего доступа (по умолчанию 1 секунду).
-Xx: TargetSurvivorRatio = 90: позволяет заняться 90% места для выживших (по умолчанию 50%). Увеличьте частоту использования выжившего - если вы превзошли его, вы попробуете сборы мусора.
Вспомогательная информация
-Xx: -ciTime: печать потребляет время в компиляции JIT
-Xx: errorfile =./Hs_err_pid.log: Сохранить журнал ошибок или данные в указанный файл
-Xx: -extendeddtraceprobes: включите зонд Dtrace Solaris, специфичный DTRACE
-Xx: heapdumppath =./Java_pid.hprof: указывает путь или имя файла при экспорте информации кучи
-Xx: -Heapdumponoutofmemoryerror: Экспорт соответствующей информации в кучу в это время, когда переполнение памяти впервые встречается.
-Xx: onerror = ";"; ": запустить пользовательскую команду после появления фатальной ошибки
-Xx: onoutofmemoryerror = ";"; ": выполнить пользовательскую команду при первой переполнении памяти
-Xx: -printclasshistogram: Печать столбчатая информация о экземпляре класса после встречи с Ctrl-Break, так же, как функция Jmap-histo
-Xx: -printConcurrentLocks: распечатанная информация о одновременных замках после встречи с CTRL-Break, так же, как функция JStack-L
-Xx: -printcommandlineflags: распечатать знак, который появляется в командной строке
-Xx: -printCompilation: печатайте соответствующую информацию при составлении метода
-Xx: -printgc: печатайте соответствующую информацию каждый раз gc
-Xx: -printgcdetails: детали печати каждый раз, когда GC
-Xx: -printgctimestamps: печатайте временные метки каждого GC
-Xx: -traceclassloading: отслеживать информацию о загрузке класса
-Xx: -tracecclassloadingPreorder: отслеживает информацию о загрузке всех классов, на которые ссылается на
-Xx: -tracecclassResolution: постоянный пул отслеживания
-Xx: -tracecclassUnloading: Информация об отслеживании класса.
-Xx: -traceloaderconstraints: отслеживание связанной информации о ограничениях загрузки класса
Практика настройки обслуживания JVM
Сервер: 8Cup, 8GMEM
например
JAVA-XMX3550M-XMS3550M-XSS128K-XX: NEWRATIO = 4-XX: SurvivororRatio = 4-xx: maxpermsize = 16M-xx: maxtenuringthreshold = 0
План настройки:
-Xmx5g: установите максимальную доступную память JVM до 5G.
-Xms5g: установите начальную память JVM на 5G. Это значение может быть установлено так же, как -xmx, чтобы избежать перераспределяющей памяти JVM каждый раз, когда сборка мусора завершается.
-Xmn2g: установите размер молодого поколения на 2G. Весь размер памяти в куче = размер молодого поколения + размер старого поколения + постоянный размер генерации. Постоянное поколение обычно фиксируется размером 64 м, поэтому после увеличения молодого поколения размер старшего поколения будет уменьшен. Это значение оказывает большое влияние на производительность системы, и Sun официально рекомендует настройку как 3/8 всей кучи.
-Xx:+useParnewgc: установить молодое поколение в параллельную коллекцию. Можно использовать одновременно с коллекцией CMS. JDK5.0 или выше, JVM установит его в соответствии с конфигурацией системы, поэтому нет необходимости снова устанавливать это значение.
-Xx: parallelgcthreads = 8: количество потоков для настройки параллельного коллекционера, то есть сколько потоков собирается мусор одновременно. Это значение лучше всего настроено, чтобы быть равным количеству процессоров.
-Xx: Survivivorratio = 6: устанавливает соотношение размера области Eden и область выжившего в молодом поколении. Согласно опыту, соотношение двух зон выживших к одной зоне Эдема составляет 2: 6, а одна зона выжившего составляет 1/8 всего молодого поколения.
-Xx: maxtenuringthreshold = 30: установить максимальный возраст мусора (количество раз). Если установить на 0, объекты молодого поколения напрямую войдут в старшее поколение, не проходя через область выжившего. Для получения дополнительных приложений в старшем поколении можно повысить эффективность. Если это значение будет установлено более широкому значению, объект молодого поколения будет скопировать несколько раз в области выжившего, что может увеличить время выживания объекта и молодого поколения и увеличить вероятность того, что оно будет переработано в молодом поколении. Установить 30 означает, что объект помещается в старое поколение, если он движется 30 раз в пространстве выживших и не был переработан.
-Xx:+useconcmarksweepgc: установить старое поколение в одновременную коллекцию. После тестирования и настройки этого параметра параметр -xx: newratio = 4 будет недействительным. Следовательно, лучше всего установить размер молодого поколения с -xmn, поэтому этот параметр не рекомендуется.
Список литературы - генерация памяти с кучей JVM
Воспоминания о виртуальных машинах кучи разделены на три поколения: молодое поколение, старое поколение и постоянное поколение. Среди них постоянное поколение в основном хранит информацию о классе Java, которая имеет мало общего с объектами Java, которые собираются коллекционером мусора. Поэтому разделение между молодым поколением и старшим поколением оказывает большее влияние на сбор мусора.
Молодое поколение
Все вновь сгенерированные объекты сначала размещаются в молодом поколении. Цель молодого поколения - собирать объекты с короткими жизненными циклами как можно быстрее. Молодые поколения разделены на три области. Один район Эдема, две области выживших (обычно).
Большинство объектов генерируются в области Эдема. Когда область Эдема будет заполнена, все еще выжившие объекты будут скопированы в область выжившего (один из двух). Когда один район выжившего заполнен, выжившие объекты в этой области будут скопированы в другую зону выжившего. Когда другая зона выжившего также заполнена, объекты скопировали из предыдущей зоны выжившего и все еще выживающие в это время, будут скопированы в «штатную область».
Следует отметить, что две области выживших являются симметричными и не имеют никаких отношений в последовательности, поэтому могут быть объекты, скопированные из области Эдема, и объекты, скопированные из другой области выжившего в той же области выжившего одновременно; и только объекты, скопированные в старую область (относительную). Более того, в области выжившего всегда есть один, который пуст. В особых случаях, в соответствии с потребностями программы, область выжившего может быть настроена в нескольких (более двух), что может увеличить время существования объектов в молодом поколении и уменьшить возможность размещения в старшем поколении.
Старшее поколение
Объекты, которые все еще выживают после N (настраиваемой) коллекций мусора в молодом поколении, будут размещены в старшем поколении. Поэтому можно считать, что пожилые люди хранят объекты с более длительными жизненными циклами.
Постоянное поколение
Используется для хранения статических данных, таких как javaclass, метод и т. Д. Постоянная генерация не оказывает существенного влияния на сбор мусора, но некоторые приложения могут динамически генерировать или вызвать некоторые классы, такие как Hibernate и т. Д. В настоящее время необходимо создать относительно большое пространство постоянного генерации для хранения этих типов, которые динамически увеличиваются. Постоянный размер генерации устанавливается -xx: maxpermsize =.
Суммировать
Выше приведено все содержание этой статьи об оптимизации виртуальной машины Java (настройка JVM). Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!