6

最近我们开始使用 New Relic 来监控我们托管在 tomcat 7.0.6 服务器上的生产 webapp,但我们观察到这个 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,并且该服务器上的所有其他内容都会因此受到影响(我使用“顶部”来查看内存使用情况) . 这怎么可能?

4

3 回答 3

4

有一个问题会影响任何 Sun/Oracle JVM,并将表现为非堆(本机)内存的无限增长。New Relic Java 代理版本 2.16+ 有一个解决方法,方法是在 common 部分的 newrelic.yml 文件中为类转换添加关闭延迟。

  class_transformer:
    shutdown_delay: 3600

更新日志

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

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

于 2013-05-06T21:05:26.400 回答
1

抱歉,添麻烦了。我们(New Relic)正在调查这个问题,但第一个建议是请尝试最新的 2.2.1 版本的 Java 代理,它对我们检测类的方式进行了重大更改。

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

于 2012-01-04T18:17:06.457 回答
1

我正在分享有关上述事件的更多信息。内存泄漏不在 Java 堆中。应用程序永远不会遇到任何内存不足错误(8 gb 是我们设置的 Java 堆最大限制)。然而,虚拟内存和常驻内存不断增加,直到 RAM 内存不足。我们已经确认使用遗物代理时会发生这种泄漏。版本 : New Relic Agent v2.1.2

于 2012-01-04T06:24:08.083 回答