2011-02-05 58 views
1

我有一個基於Java的命令行服務器運行,它託管我在我的網站上製作的遊戲的高分。它工作高效快速。但是,它佔用了大約200MB的RAM!我曾嘗試一切從手動歸零了一切調用System.gc() Java遊戲服務器佔用太多內存!

我開始懷疑,這可能是與輸入流和輸出流對象,我從Socket連接使用。我注意到當我第一次運行程序時,它佔用了正常數量的RAM。然後一旦獲得連接,它就會跳到100MB,並且每個連接都會變得更高。

編輯:在我的班級之一,我認爲所有的名字,成績,並在3周不同的ArrayList時間戳。但是,使用jhat和jmap進行的徹底檢查表明,它們僅使用大約5MB的RAM。

如果這太過於模糊,任何人都不能回答,請問我會很樂意給出源代碼。

+2

如果您發現它隨着每個連接而上升並且在客戶端斷開連接時不下降,那麼您可能會保留對已關閉套接字的引用。 – ide 2011-02-05 04:15:43

+0

如果JVM與.NET類似,那麼即使有沒有引用它們的未使用對象,「強制」垃圾收集也不能保證實際收集任何東西。另外,200M是花生,當你可以購買300GB的24GB內存。這真的是一個問題嗎? – 2011-02-05 04:42:29

+0

@ide它隨着每個連接的增加而增加很多,然後隨着它們的斷開而下降一點,因爲我試圖在它們的生命結束之前手動將所有對象的每個引用歸零。 – ra4king 2011-02-05 04:59:56

回答

3

由於保留對超出其使用壽命的對象的引用,可能會導致泄漏。

我建議你得到一個分析器並用它來調查。一個好的和免費的地方開始是與Java 6分發的VisualVM程序。

探查器是一個單獨的程序,可以附加到JVM或爲您的程序託管JVM並監視程序的執行。它可以跟蹤對象分配和代碼執行,無論是統計學還是通過「檢測」執行代碼。它會告訴你,如果對象被分配而不被釋放,並且可以顯示它們是什麼對象以及它們被分配的位置(在許多其他有用的事情中)。

我使用jProfiler,這是商業(但很值得專業)。上次我搜索的時候,有幾個質量好的分析器可以免費使用(至少是供個人使用)。 VisualVM具有基本但有用的性能分析功能,我將從那裏開始(在Windows上,您可以在JDK bin目錄中找到它;我認爲Linux和Mac也是如此)。

0

嘗試使用類似於jmap的內容,然後使用jhat查看您的內存實際上是如何使用的。 Sun的Oracle(Oracle)JVM永遠不會將內存釋放回操作系統,因此您看到內存使用量單調增加就不足爲奇了。