2012-01-03 39 views
6

最近我们开始使用New Relic来监视我们在tomcat 7.0.6服务器上托管的生产webapp,但是我们发现这个tomcat的内存占用空间正在不断增加,并且在一周内它吞噬了所有服务器(AWS High-Memory Double Extra大型实例)内存并且变得没有响应,只有重新启动它才能恢复。 我们在启动tomcat时提供Xms & Xmx参数,但是在几个小时内,tomcat进程的内存使用量与Xmx值交叉,并且它持续增加,直到所有服务器内存都结束。下面是过程的命令:为什么New Relic吃了很多tomcat的内存?

/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'来查看内存使用情况)。这怎么可能?

+0

我是一名工程师,负责New Relic的Java代理。如果你愿意,你可以在[email protected]上打开这个问题的支持票。您正在使用哪个版本的Java代理?另外,系统内存或堆内存中的内存爆炸了吗? – 2012-01-03 18:30:02

+0

我似乎也有这个问题,所以你并不孤单。本周末我用newrelic提交了一份支持请求。在我们的例子中,tomcat只是因为OutOfMemory异常而死亡。 – JBCP 2012-03-18 19:43:44

+0

对我也有发生 – 2012-04-04 06:15:40

回答

1

我在上面分享了一些关于上述事件的信息。内存泄漏不在Java堆中。应用程序永远不会发生任何OUT OF MEMORY错误(8 GB是我们设置的Java堆最大限制)。但是,虚拟内存和驻留内存会持续增加,直到RAM耗尽内存。 我们已经确认使用遗物代理时发生这种泄漏。 版本:New Relic Agent v2.1.2

1

对不起。我们(New Relic)正在调查这个问题,但第一个建议是请尝试最新的2.2.1版本的Java代理,它对我们的工具类进行了重大改变。

当我们有更多的信息时,我会在这里跟进。

+0

有没有这方面的更新? – 2012-04-04 06:18:21

+0

我们已经尝试过2.2.1以及2.3.1,它仍然在发生。 – ThinkFloyd 2012-04-07 07:44:10

+2

我也遇到此问题。我刚刚测试2.6 – ZacharyP 2012-06-26 23:48:36

4

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

class_transformer: 
    shutdown_delay: 3600 

changelog

变通为Oracle JVM错误,在极少数情况下会导致本地 内存泄露

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