为什么New Relic会占用大量Tomcat内存?

6

最近,我们开始使用New Relic监控我们托管在Tomcat 7.0.6服务器上的生产Web应用程序,但我们观察到Tomcat的内存占用不断增加,在一周内它就会耗尽所有服务器(AWS High-Memory Double Extra Large Instance)的内存,并变得无响应,唯一的方法是重新启动它。

我们在启动Tomcat时提供了Xms和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”查看内存使用情况)。这是怎么可能的?

我是一名在New Relic工作的Java Agent工程师。如果您愿意,可以通过support@newrelic.com打开一个支持工单来解决这个问题。您使用的Java Agent版本是哪个?此外,内存爆炸发生在系统内存还是堆内存中? - user1128438
我似乎也遇到了这个问题,所以你并不孤单。上周末我向New Relic提出了支持请求。在我们的情况下,Tomcat会因为OutOfMemory异常而崩溃。 - JBCP
3个回答

4

存在一个问题,影响任何Sun/Oracle的JVM,并会表现为非堆(本地)内存的不受限制的增长。对于New Relic Java代理程序版本2.16+,可以在新建的newrelic.yml文件中的common部分添加关闭延迟来解决问题。

  class_transformer:
    shutdown_delay: 3600

更新日志中得知:

解决了Oracle JVM的一个bug,该bug在极少数情况下会导致本地内存泄漏。

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


1
我在上述报告的事件中分享了更多信息。内存泄漏不在Java堆中。应用程序从未遇到任何内存不足错误(我们设置的Java堆最大限制为8 GB)。然而,虚拟内存和常驻内存会不断增加,直到RAM耗尽内存。 我们已确认,在使用Relic代理时会发生此泄漏。 版本:New Relic Agent v2.1.2

1

非常抱歉给您带来了麻烦。我们(New Relic)正在调查问题,但首先建议请尝试最新的2.2.1版本Java代理程序,该版本对我们注入类的方式进行了重大更改。

我们有更多信息时会在此跟进。


2
我也遇到了这个问题。我刚刚测试了2.6版本。 - ZacharyP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接