2012-01-03 41 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可以泄漏本機操作系統的內存(不是堆 空間)當代理攔截類。此設置將關閉在給定數量的 秒之後加載的類的截取 。代理將繼續監視在此之前加載的類。