2013-01-23 42 views
6

我有一個Jetty服務器,用於我正在處理的應用程序的websocket連接。唯一的問題是Jetty消耗太多虛擬內存(!2.5GB虛擬內存)和大約650RES。瞭解Jetty的內存使用情況

我的問題是,如上所述,大部分內存(大約12GB)不是堆大小,因此分析它並理解正在發生的事情更困難。

對於如何理解12gb消耗的來源以及如何計算內存泄漏或服務器的任何其他問題,您是否有任何提示?

我想澄清我的意思是虛擬內存(因爲我的理解可能是錯的)。虛擬內存是「VIRT」,當我運行頂部時。這裏是我得到的:

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND           
-------------------------------------------------------------           
9442 root 20 0 12.6g 603m 10m S 0 1.3 1:50.06 java 

謝謝!

+0

哪個版本的Jetty? –

+0

Joakim,我正在使用8.1.7.v20120910 – user220755

+0

檢查內存消耗與 long totalMemory = Runtime.getRuntime()。totalMemory(); long freeMemory = Runtime.getRuntime()。freeMemory(); return(totalMemory - freeMemory); – Hurda

回答

1

虛擬內存在64位環境中幾乎沒有成本,所以我不確定問題是什麼。駐留內存爲650 MB或僅佔MEM的1.3%。目前尚不清楚它使用了多少內存。

對於64位JVM,缺省最大堆大小是主內存的1/4。如果您有48 GB的內存,您可能會發現默認堆大小爲12 GB,並且對於某些共享庫,線程等,這可能會導致12.5 GB的虛擬內存大小。這並不意味着你有內存泄漏,或者你甚至有問題,但如果你更喜歡你可以減少最大堆大小。

順便說一句:你可以購買32 GB的低於200美元。如果你的記憶力不足,我會再購買一些。

+2

嗯,這不是要購買更多的內存,它是關於在客戶機上消耗太多內存。當我的應用安裝在某人的機器上時,Jetty是否會消耗12 GB內存? :) – user220755

+1

要清楚這不是_jetty_佔用這個內存,但無論發生什麼被部署到碼頭,碼頭本身有一個小腳印 –

+0

你說,常駐內存是650 MB。這是實際使用的總內存量,包括共享內存和線程。12 GB是它可以使用的最大堆內存。 –

4

請粘貼啓動時使用的JVM選項。如前所述,您可以使用-Xmx選項調整JVM使用的最大內存。

您的應用程序一直只使用603MB保留內存。所以看起來不像它應該關注你。您可以通過使用「jmap」,啓用jmx並通過jconsole連接或使用分析器來獲得關於內存使用情況的一些詳細信息。如果你想留在* nix土地,你也可以嘗試「免費」,如果你的操作系統支持它。

在你的情況下,Jetty並不佔用12,5個內存。它佔用了603MB。 Google以「虛擬內存linux」爲例,你應該獲得關於虛擬內存和保留內存之間差異的大量信息。