为什么New Relic会吃掉很多tomcat内存?

时间:2012-01-03 14:05:22

标签: java tomcat memory-leaks jvm-arguments newrelic

最近我们开始使用New Relic来监控我们在tomcat 7.0.6服务器上托管的生产webapp,但我们发现这个tomcat的内存占用量不断增加,并且在一周之内就会耗尽所有服务器(AWS High-Memory Double)超大实例)内存并且无响应,只有通过重新启动它才能找回它。 我们提供Xms&启动tomcat时的Xmx参数,但在几小时内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"

理想情况下,我希望这个过程不要使用超过8GB的内存,但在几小时内它会超过10GB,并且在几天之内就会超过20GB,而且这台服务器上的其他所有内容都因此受到影响(我使用'top'来看看内存使用情况)。这怎么可能?

3 个答案:

答案 0 :(得分:4)

存在影响任何Sun / Oracle JVM的问题,并且会在非堆(本机)内存中显示为无限增长。通过在公共部分的newrelic.yml文件中为类转换添加关闭延迟,为New Relic Java代理版本2.16+提供了一种解决方法。

  class_transformer:
    shutdown_delay: 3600

来自changelog

  

解决Oracle JVM错误,在极少数情况下导致本机错误   内存泄漏

     

在极少数情况下,Oracle JVM可能会泄漏本机操作系统内存(而非堆)   当代理拦截类时。此设置变为   拦截在给定数量之后加载的类   秒。代理将继续监视在此之前加载的类   时间。

答案 1 :(得分:1)

我正在分享有关上述事件的更多信息。内存泄漏不在Java堆中。应用程序永远不会出现任何OUT OF MEMORY错误(8 gb是我们设置的Java堆最大限制)。然而,虚拟和驻留内存不断增加,直到RAM耗尽内存为止。 我们已确认在使用遗留剂时会发生此泄漏。 版本:New Relic Agent v2.1.2

答案 2 :(得分:1)

对不起,不好意思。我们(New Relic)正在研究这个问题,但第一个建议是请尝试最新的2.2.1版本的Java Agent,它对我们的仪器类的方式做了重大改变。

当我们获得更多信息时,我会在此处跟进。