最近我们开始使用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'来看看内存使用情况)。这怎么可能?
答案 0 :(得分:4)
存在影响任何Sun / Oracle JVM的问题,并且会在非堆(本机)内存中显示为无限增长。通过在公共部分的newrelic.yml文件中为类转换添加关闭延迟,为New Relic Java代理版本2.16+提供了一种解决方法。
class_transformer:
shutdown_delay: 3600
解决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,它对我们的仪器类的方式做了重大改变。
当我们获得更多信息时,我会在此处跟进。