четверг, 28 апреля 2011 г.

Параметры JVM для weblogic

Общие рассуждения о работе JVM.
Выделением памяти в Java занимается виртуальная машина. Машина выделяет память под объекты, удаляет объекты и освобождает память. В соответствии с Generation Model, объект за время своего существования перемещается между областями памяти, которые называются Young и Tenured. Но скорее всего, до Tenured объект не доживёт, ибо по статистике объекты умирают молодыми. Удалением объектов занимается сборщик мусора, который запускается по мере заполнения памяти.

В запущенной java-машине память разделена на области. При сборке мусора это позволяет чистить не всю кучу целиком, а отдельные области и применять для этого разные сборщики мусора. Для JVM от Sun (Hot Spot) это разделение выглядит так:
1. Young - область памяти, в которой новые объекты создаются. 
2. Tenured или old - область памяти, в которой находятся объекты, выжившие после нескольких циклов сборщика мусора.
3. Perm - место, где хранятся классы приложений и некоторые другие постоянные данные.


Область Young также состоит из нескольких областей.
Eden - область, куда попадают вновь созданные объекты. Когда эта область заполняется до определённого значения, запускается сборщик мусора и освобождает память, занятую неиспользуемыми объектами. Сохранившиеся после сборки мусора объекты переносятся в отдельную область - Survivor (на картинке From).  После следующей сборки мусора новые объекты из Eden попадут в другую область Survivor (на картинке To) и объекты из первой Survivor-области также переместятся во вторую. После каждой сборки мусора выжившие объекты из Eden и одной из Survivor областей перемещаются во вторую, свободную Survivor область или в Old. После заданного количества циклов объекты из Survivor попадают в область Tenured (Old Generation). Если выживших объектов много и места в Survivor для них нет, после сборки мусора объекты попадут сразу в Old, но это скорее всего означает, что JVM сконфигурирована неправильно.
Для области Young характерно
1. Недолгое время жизни объектов в ней.
2. Низкая фрагментация памяти.
3. Низкие расходы ресурсов на выделение памяти для новых объектов.
4. И самое главное, сборка мусора в этой области проходит относительно быстро (minor garbage collection).
Как достигается низкая фрагментация памяти и нересурсоёмкое выделение памяти можно почитать, спросив у Гугла про
копирующие сборщики мусора,
маркирующе-зачищающие и
маркирующе-сжимающие сборщики  мусора.
Первый используется при прочистке Yung области. Он копирует только выжившие объекты (обычно это 2-5 процентов от общего числа объектов) благодаря чему достаточно быстро отрабатывает.
Для Tenured (или Old) области обычно используется маркирующе-сжимающий сборщик.

Настройка параметров Java-машины для Weblogic

Запущенный Weblogic-сервер выглядит в системе примерно так

ps -ef | grep java
/opt/oracle/java/jdk1.6.0_23/bin/java 
-client -Xms768m -Xmx768m -XX:CompileThreshold=8000 -XX:PermSize=128m -XX:MaxPermSize=256m 

-Dweblogic.Name=AdminServer
-Djava.security.policy=/opt/oracle/middleware/wlserver_10.3/server/lib/weblogic.policy 
-Dweblogic.security.SSL.ignoreHostnameVerification=false
-Dweblogic.ReverseDNSAllowed=false -Xverify:none -da 
-Dplatform.home=/opt/oracle/middleware/wlserver_10.3 
-Dwls.home=/opt/oracle/middleware/wlserver_10.3/server 
-Dweblogic.home=/opt/oracle/middleware/wlserver_10.3/server 
-Dweblogic.management.discover=true
weblogic.Server

Можно выделить 2 группы параметров

java [JVM options] [Weblogic Options] weblogic.Server

JVM options тоже можно условно разделить на группы параметров, относящихся к
поведению JVM, производительности JVM, отладочной информации.
Вот список некоторых из них : тынц.


-server/-client Тип компилятора.
-client генерирует менее оптимльный код. Работает быстрее.
-server Работает медленнее. Сгенерированный код выполняется быстрее.
чтобы посмотреть, какой используется компилятор, можно набрать
jinfo JAVA_PID

-Xms2g -Xmx2g Минимальный и максимальный размер heap size. Рекомендуется выставлять одинаковымы, чтобы занимать всю память сразу.

-Xmn512m размер Young области. Подбирается опытным путём.
-XX:MaxNewSize=512m -XX:NewSize=512m Максимальный и начальный (при запуске) размер Young области JVM 1.4

-XX:PermSize=256m -XX:MaxPermSize=256m Размер области памяти, где будут размещены классы. Зависит от приложения и того, будет ли использоваться прозрачная для пользователей миграция между версиями приложения.

-XX:+ClassUnloading - включение выгрузки классов из PermGen space.


-XX:SurvivorRatio=5 Это доля области Eden (очень логичное название) в области Young. Всё выражение выглядит так Eden:Survivor:Survivor = 5:1:1. Для XX:SurvivorRatio=5 Eden составляет 5/7 от всего Young. Уменьшая SurvivorRatio, увеличиваем Survivor область.

-XX:MaxTenuringThreshold=20 Количество циклов сбора мусора прежде чем выжившие объекты попадут в Tenured область. По умолчанию 31

-XX:TargetSurvivorRatio=90 JVM будет использовать 90 % памяти Survivol области, вмето дефолтных 50

-XX:+UseParallelGC - тип сборщика мусора по умолчанию, если выбран -server
-XX:+UseParallelOldGC - включение параллельного сборщика мусора для Tenured области.
-XX:ParallelGCThreads=6 - число трэдов сборшика мусора. По умолчагию равно количеству процессоров в системе. Этот параметр очень не рекомендуется оставлять дефолтным.
-XX:MaxGCPauseMillis время в милисекундах, за которое сборщик мусора будет стараться закончить сборку.

XX:+UseConcMarkSweepGC -XX:+UseParNewGC Использовать Concurrent Mark Sweep collector
-XX:+UseSerialGC - тип сборщика мусора, используемого для однопроцессорных систем.
Посмотреть, какой сборщик работает, можно, почитав вывод команды
jmap JAVA_PID
-verbose:gc
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintHeapAtGC
-XX:+PrintGCTimeStamps
Вывод информации от сборщика мусора.

В следующем посте напишу про остальные ключи запуска, относящиеся к weblogic.Server

Комментариев нет:

Отправить комментарий