簡體   English   中英

Linux上的Java內存使用情況

[英]Java memory usage on Linux

我正在運行一大堆Java應用程序服務器,它們都在CentOS 5.5 Linux之上運行最新版本的Tomcat 6和Sun的Java 6。 每個服務器都運行多個Tomcat實例。

我正在設置-Xmx450m -XX:MaxPermSize = 192m參數來控制堆和permgen的增長量。 這些設置適用於所有Java應用程序服務器中的所有Tomcat實例,總共約70個Tomcat實例。

以下是Psi-probe報告的其中一個Tomcat實例的典型內存使用情況

Eden           = 13M
Survivor       = 1.5M 
Perm Gen       = 122M 
Code Cache     = 19M 
Old Gen        = 390M 
Total          = 537M

然而,CentOS報告這個特定進程的RAM使用率為707M(根據RSS),這使得170M的RAM下落不明。

我知道JVM本身和它的一些依賴庫必須加載到內存中,所以我決定啟動pmap -d來查找它們的內存占用。 根據我的計算,約占17M。

接下來是Java線程堆棧,在32位JVM for Linux上每個線程為320k。 同樣,我使用Psi-probe來計算特定JVM上的線程數,總計為129個線程。 所以129 + 320k = 42M

我已經讀過NIO使用堆外的內存,但我們不在我們的應用程序中使用NIO。

所以在這里,我已經計算了(我的)頭腦中的一切。 我只占了“失蹤”170M的60M。

我錯過了什么?

嘗試使用增量垃圾收集器,使用-Xincgc命令行選項。 它在整個GC工作中更具攻擊性,並且有一個特別快樂的小異常:它實際上將一些未使用的內存交還給操作系統,這與默認和其他GC選擇不同! 這使得JVM消耗更少的內存,如果您在一台機器上運行多個JVM,這尤其有用。 犧牲一些性能 - 但你可能不會注意到它。 看起來incgc是一個小秘密,因為沒有人提起它......它已經存在了很長時間(甚至90年代)。

Arnar,在JVM初始化過程中,JVM將分配由-Xmx和MaxPermSize指定的大小的內存(mmap或malloc),因此無論如何JVM將在JVM進程開始時為應用程序分配450 + 192 = 642m的堆空間。 所以應用程序的java堆空間不是537,而是它的642m。所以現在如果你進行計算,它會給你缺少的內存。希望它有所幫助。

Java會預先分配盡可能多的虛擬內存,但是駐留方將是您實際使用的數量。 注意:許多庫和線程都有自己的頭腦,雖然你不使用直接內存,但這並不意味着底層系統都沒有。 例如,如果您使用NIO,即使您使用堆ByteBuffers,它也會使用一些直接內存。

最后,100 MB的價值約為8英鎊。 可能不值得花太多時間擔心它。

不是直接的答案,但是,您是否還考慮過在同一個Tomcat實例中托管多個站點 這可以節省一些內存,但會犧牲一些額外的配置。

Arnar,JVM也是mmap的所有正在使用的jar文件,它們將使用NIO並將為RSS做出貢獻。 我不相信上述任何測量都會考慮到這些因素。 你偶然會有大量的大型jar文件嗎? 如果是這樣,那些用於那些的頁面可能是你遺失的內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM