2014-10-11 50 views
1

運行一個標準的tomcat 8.0.14,全新安裝,在託管公司運行。 我在CentOS服務器上使用java jre1.8.0_05。只是從一開始就改變了一些端口。apache-tomcat-8.0.14中的內存泄露

目前爲止都很好,歡迎來到Apache郵件,然後我的託管公司殺死它,因爲它已經超過了1048 MB。所以想我應該設置最大內存setenv.sh

export JAVA_OPTS="-Djava.awt.headless=true -server -Xms48m -Xmx256m" 

這應該設置最大內存爲256,但如果我部署hello.war只是繼續增長(基本上,跑的Grails的Hello World,然後加入單渲染這是該項目的其餘部分)。它現在高達399 MB

那麼,有沒有辦法設置一個硬限制,爲什麼會一個Hello World覺得它需要399mb

有什麼建議?

回答

1

有沒有OOM錯誤?如果有,請提供詳情。 您使用的是什麼JDK?您是否監視堆使用情況,以確定它是否與伊甸園或終身空間有關。 我建議使用jvisualvm等工具進行內存採樣,以找出哪些類正在使用那麼多的內存。

肯定有東西在吃掉你的記憶,而你在找到樣品之前找不到。

另外,你也可以採取堆轉儲找出哪個對象正在增長。

+0

對不起,我的無知,OOM錯誤? – vrghost 2014-10-11 19:32:57

+0

JDK是jdk1.8.0_11,沒有監視堆 – vrghost 2014-10-11 19:33:45

+0

有沒有關於grails的好教程? – vrghost 2014-10-11 19:34:30

1

你以前用過Grails嗎?這很棒,但它比等效的基於Java的應用程序使用更多的內存。這是來自幾個不同的來源,其中一個是每個班級都有一個MetaClass。 Groovy提供的所有內容都需要支付一小筆費用。

這不是一個嚴重的問題,因爲使用的額外內存不算太差。但請注意,您所看到的與Grails或Tomcat無關 - 您可以輕鬆使用(或似乎使用)比指定的最大內存更多的內存。這篇博文已經過去幾年了,但仍然非常相關:https://blogs.oracle.com/jrockit/entry/why_is_my_jvm_process_larger_t

與此有點相關的更新JDK的另一個有趣功能是,現在JRockit JVM已被合併到「主」JVM中,沒有「永久」的一代,因此沒有更多的permgen問題。字符串和類構成了永久代中的大部分內容,因此在Grails中更加明顯是因爲大量文件(許多是在運行時創建的)。唯一真正改變的是permgen會在別的地方,但同樣的內存使用率會發生,所以真正的permgen泄漏將是一個普遍的泄漏,並會使服務器崩潰。再次,這是相關的,但不是你所看到的。

另外一件很奇怪的事情是,Java 1.8並沒有真正與Grails一起工作 - 我很驚訝你會得到儘可能好的效果。不同的小版本有不同的問題,但我無法得到實際工作的設置組合。你應該下降到1.7,直到Grails和Groovy官方宣佈支持Java 8。

+0

我會嘗試喲下降到Java 1.7,看看是否讓事情更快樂:) – vrghost 2014-10-12 09:02:12