2015-01-21 51 views
0

我們有一個運行在Heroku上的JVM應用程序,它正在接收超出錯誤R14內存配額。超過Heroku JVM內存配額,但數字不加起來

我們正試圖瞭解內存在哪裏被花費,但數字並沒有加起來。

下面的日誌:

Process running mem=1174M(114.7%) 
» 10:16:28.365 2015-01-21 09:16:28.099931+00:00 heroku web.1 - - Error R14 (Memory quota exceeded) Critical 
» 10:16:43.322 2015-01-21 09:16:42.836517+00:00 app web.1 - - measure.mem.jvm.heap.used=272M measure.mem.jvm.heap.committed=546M measure.mem.jvm.heap.max=546M 
» 10:16:43.322 2015-01-21 09:16:42.836583+00:00 app web.1 - - measure.mem.jvm.nonheap.used=106M measure.mem.jvm.nonheap.committed=107M measure.mem.jvm.nonheap.max=0M 
» 10:16:43.322 2015-01-21 09:16:42.836644+00:00 app web.1 - - measure.threads.jvm.total=136 measure.threads.jvm.daemon=21 measure.threads.jvm.nondaemon=105 measure.threads.jvm.internal=10 
» 10:16:43.322 2015-01-21 09:16:42.853114+00:00 app web.1 - - measure.mem.linux.vsz=2489M measure.mem.linux.rss=848M 

Heroku的報告中使用1174Mheroku-javaagent-1.4報告下面的指標,合計爲546+107+136/2=721M1174-721=453M的其餘部分可以在哪裏花費?我們如何繼續排除故障?

我在這裏136個線程,每個512K棧因素,考慮到我們的JVM選項:

-javaagent:heroku-javaagent-1.4.jar=stdout=true,lxmem=true -Xms568m -Xmx568m -Xmn192m -Xss512k -XX:+UseCompressedOops 

對2倍賽道1024M內存的運行。

謝謝

回答

1

這裏有幾種可能性。最有可能的是某些內存映射爲某種IO分配。報告JVM內存使用情況的工具看不到這一點。最常見的情況是Java NIO ByteBuffer對象發生這種情況。這可以通過代碼中的某些東西來完成,這可能表明應用程序中存在內存泄漏。或者它可以通過你的應用程序構建的框架/服務器完成。

我發現Play框架和Jetty對此尤其不好。在很多情況下,他們分配數百兆字節的本地內存。你在使用這些嗎?我認識從Jetty轉換到Tomcat並解決問題的人員。

最終,如果額外內存達到穩定狀態,則可能是好的。這正是你的應用需要運行的。但是,如果你發現它不斷增長和增長,那麼它可能表明內存泄漏。

我建議用Heroku的支持提交一張票,他們可以使用smaps提供有關此內存分配位置的更多信息。

完全披露:我爲Heroku工作。

+0

感謝您的回答。我確實使用Jetty,可以很容易地做Tomcat切換,會試試看。不要使用Play,而要使用Lift。 – Edi 2015-01-23 10:29:43