Почему Новая Реликвия ест много памяти о котах? - PullRequest
6 голосов
/ 03 января 2012

Недавно мы начали использовать New Relic для мониторинга нашего рабочего веб-приложения, размещенного на сервере tomcat 7.0.6, но мы заметили, что объем памяти этого tomcat постоянно увеличивается, и в течение недели он съедает весь сервер (AWS High-Memory Double Очень большой экземпляр) и перестает отвечать, единственный способ вернуть его - перезапустить. Мы предоставляем аргументы Xms & Xmx при запуске tomcat, но в течение нескольких часов использование памяти процессом tomcat пересекает значение Xmx, и оно продолжает увеличиваться до тех пор, пока не закончится вся память сервера. Вот команда процесса:

/usr/java/jdk1.6.0_24//bin/java
    -Djava.util.logging.config.file=/xxx/xxx/xxx/xxx/apache-tomcat-7.0.6/conf/logging.properties
    -Xms8192m
    -Xmx8192m
    -javaagent:/xxx/xxx/xxx/xxx/apache-tomcat-7.0.6/newrelic/newrelic.jar
    -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
    -Duser.timezone=Asia/Calcutta
    -Djava.endorsed.dirs=/xxx/xxx/xxx/xxx/apache-tomcat-7.0.6/endorsed
    -classpath /xxx/xxx/xxx/xxx/apache-tomcat-7.0.6/bin/bootstrap.jar:/xxx/xxx/xxx/xxx/apache-tomcat-7.0.6/bin/tomcat-juli.jar
    -Dcatalina.base=/xxx/xxx/xxx/xxx/apache-tomcat-7.0.6
    -Dcatalina.home=/xxx/xxx/xxx/xxx/apache-tomcat-7.0.6
    -Djava.io.tmpdir=/xxx/xxx/xxx/xxx/apache-tomcat-7.0.6/temp org.apache.catalina.startup.Bootstrap start"

В идеале я ожидал бы, что этот процесс не будет использовать более 8 ГБ памяти, но в течение нескольких часов он превысит 10 ГБ, а в течение нескольких дней он превысит 20 ГБ, и все остальное на этом сервере страдает из-за этого (я использую «top», чтобы увидеть использование памяти). Как это возможно?

Ответы [ 3 ]

4 голосов
/ 07 мая 2013

Существует проблема, которая затрагивает любую JVM-систему Sun / Oracle и проявляется в неограниченном росте не-кучи (собственной) памяти.Для новых версий агента Java Relic версии 2.16+ существует обходной путь, добавив задержку выключения для преобразования классов в файле newrelic.yml в общем разделе.

  class_transformer:
    shutdown_delay: 3600

Из changelog

Обходной путь для ошибки Oracle JVM, которая в редких случаях приводит к утечке собственной памяти

В редких случаях JVM Oracle может пропускать собственную память ОС (а не пространство кучи), когдаклассы перехватываются агентом.Этот параметр отключает перехват классов, которые загружаются через указанное количество секунд.Агент будет продолжать отслеживать классы, загруженные до этого времени.

1 голос
/ 04 января 2012

Извините за беспокойство. Мы (New Relic) исследуем проблему, но первое предложение - пожалуйста, попробуйте последнюю версию Java Agent 2.2.1, которая внесла существенные изменения в то, как мы применяем классы.

Я уточню здесь, когда у нас будет больше информации.

1 голос
/ 04 января 2012

Я делюсь дополнительной информацией о вышеупомянутом инциденте. утечка памяти не в куче Java. Приложение никогда не достигает ошибки OUT OF MEMORY (8 ГБ - это максимальный предел кучи Java, который мы установили). Однако виртуальная и резидентная память продолжают увеличиваться до тех пор, пока в ОЗУ не будет исчерпано памяти. Мы подтвердили, что эта утечка происходит при использовании реликтового агента. Версия: New Relic Agent v2.1.2

...