Назад | Перейти на главную страницу

Почему полные сборщики мусора не работают на моем заданном мной gcInterval?

Я пытаюсь рассчитать, что полные сборщики мусора будут запускаться каждые 10 минут. В прошлом я успешно использовал аргумент gcInterval JVM в более ранних версиях ColdFusion, но с помощью подробных журналов сборщика мусора я подтвердил, что полные сборщики мусора все еще выполняются каждый час (если только Old Gen не становится настолько заполненным, что вызывает полную сборку) .

Вот полные аргументы JVM из ColdFusion10 \ cfusion \ bin \ jvm.config (для удобства чтения добавлены разрывы строк)

Есть ли что-то еще, что мне нужно сделать, чтобы это работало на ColdFusion 10?

java.args=
-server
-Xms4072m
-Xmx4072m
-XX:PermSize=512m
-XX:MaxPermSize=512m
-Dsun.rmi.dgc.client.gcInterval=600000
-Dsun.rmi.dgc.server.gcInterval=600000
-XX:+UseParallelGC
-XX:+UseParallelOldGC
-Xloggc:gc.log
-verbose:gc
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=5
-XX:GCLogFileSize=1024K
-Xbatch
-Dcoldfusion.home={application.home}
-Dcoldfusion.rootDir={application.home}
-Dcoldfusion.libPath={application.home}/lib
-Dorg.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER=true
-Dcoldfusion.jsafe.defaultalgo=FIPS186Random
-Dcoldfusion.classPath={application.home}/lib/updates,{application.home}/lib,{application.home}/lib/axis2,{application.home}/gateway/lib/,{application.home}/wwwroot/WEB-INF/flex/jars,{application.home}/wwwroot/WEB-INF/cfform/jars

Ради тех, кто найдет это в Google, вот ответ, предоставленный мне инженером Adobe Рупешем Кумаром в тикете, на который я ссылался выше.


Бред, в общем, JVM не запускает сборщик мусора с фиксированным регулярным интервалом. JVM полностью решает, когда запускать полный сборщик мусора. В случае RMI, поскольку объекты экспортируются и используются другой виртуальной машиной, сборка мусора распространяется и, следовательно, называется dgc. Ознакомьтесь со следующими ссылками, чтобы понять, что такое DGC http://publib.boulder.ibm.com/infocenter/javasdk/v5r0/index.jsp?topic=%2Fcom.ibm.java.doc.diagnostics.50%2Fdiag%2Funderstanding%2Frmi_dgc.html http://java.sys-con.com/node/35865

Из-за своей природы DGC должен иметь частоту выполнения GC, чтобы можно было собрать неиспользуемые объекты. До JDK 1.6 этот интервал по умолчанию составлял 60 секунд, а начиная с JDK 1.6 он был увеличен до 1 часа по умолчанию.

Теперь, когда перейдем к тому, почему этот параметр не работает сейчас, по умолчанию сервер RMI не будет работать в Tomcat, и поэтому DGC не работает. В CF 9 встроенным сервером был JRun, который представляет собой сервер приложений стека, на котором, конечно же, будет запущен сервер RMI.

- Рупеш Кумар

Позвольте мне начать с того, что я ни в коем случае не эксперт в сборке мусора или настройке JVM в этом отношении. Насколько я понимаю, вы не можете контролировать сборку мусора в том вопросе, который вы пытаетесь сделать. Вы можете «попросить» сборщик мусора запускаться с определенным интервалом, но если сборщик мусора не нужен, он не будет работать.

Вот две ссылки, которые оказались для меня очень полезными:

Управление памятью JVM и анализ журналов ColdFusion

Настройка производительности

Из первой ссылки выше:

Точное время запуска сборки мусора невозможно контролировать. Приложение может попросить JVM запустить GC, но JVM не обязательно будет запускать GC по запросу, но будет планировать его при следующей возможности. Обычно приложения не просят JVM выполнить сборку мусора. Вместо этого JVM настроена на использование одного из нескольких возможных алгоритмов наилучшего выполнения сборки мусора. Алгоритм выбирается исходя из потребностей приложения и может по-разному влиять на производительность. Цель состоит в том, чтобы выбрать алгоритм, который хорошо подходит для ваших аппаратных ресурсов и потребностей приложений. В идеале для веб-приложений желательно выбрать алгоритм, обеспечивающий минимальное прерывание взаимодействия с пользователем. Здесь -XX: + UseParallelGC - это конфигурация по умолчанию при установке ColdFusion.

1 час Full Gc, похоже, является особенностью использования Tomcat или CF10, и да, у меня тоже были проблемы с попыткой выполнения полного GC по времени; Я считаю этот последний пункт странным, поскольку это функция JVM, а не функция Tomcat, если только она не подавляется где-то в Tomcat. Я также обнаружил, что настройка ведения журнала метрик в CF Admin не создает очень полезных метрик; ничего, как было в JRun.