2014-04-29 44 views
1

我有一個運行在RHEL glassfish中的Web應用程序。對於應用程序,這些設置:交換內存連續性增加

Heap Memory:4GB 
Perm Gen:1GB 

JConsole的表明:

heap memory - 500mb 
non heap memory - 350mb 
threads =378 

頂部顯示:

PID User  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
17948 root  20 0 12.8g 1.9g 22m S 1.5 16.0 14:09.11 java 

從啓動本身進程佔用12.8G。

頂部還顯示:

Mem: 12251392k total, 11915584k used, 335808k free, 47104k buffers 
Swap: 8322944k total, 6747456k used, 1575488k free, 177088k cached 

的問題是交換空間的時間可持續增長。當沒有交換空間時,Web應用程序停止響應。

  1. 殺死進程不會減少使用過的交換空間,但只能在計算機重新引導後進行。爲什麼?
  2. 爲什麼啓動時該流程會消耗12.8 GB的虛擬空間?
  3. 如何解決此問題?

更新:

JConsole的輸出(記錄24小時)顯示,堆存儲器和非存儲器堆沒有增加多少。即使交換空間在同一時期被1.5Gb重新獲得: Jconsole output

回答

0

您可以看看these answers以獲得top輸出的含義的印象。您可以使用腳本粗略報告使用交換空間的內容。

據我所知,Linux的swap系統並不那麼簡單。內核首先將非活動內存換掉,可能是其他應用程序的內存,爲GF提供足夠的資源。當GF終止時,這不會立即交換回來。你可以嘗試swapoff -a來迫使Linux重新交換內容,但請記住通過swapon -a重新啓用它。

的VIRT空間由於頂部的手冊頁:

The total amount of virtual memory used by the task. It includes all code, data and shared libraries plus pages that have been swapped out and pages that have been mapped but not used.

我懷疑內存使用的OS報告是很好的,以調試Java應用程序。您應該使用諸如JVisualVM(Oracle JDK的一部分)等工具來查看JVM的內存。觀察相關時段的內存使用情況。

此外,您可以嘗試使用像Eclipse Memory Analyzer(MAT)這樣的工具來分析堆轉儲。 MAT有一些很好的報告,可以幫助找到內存泄漏。如果你的應用程序的內存使用量不斷增長,它似乎有泄漏。否則,它只是沒有足夠的可用內存。

+0

謝謝!我更新了Jconsole輸出的問題。 swaoff -a給出這個錯誤:swapoff:/ dev/mapper/VolGroup-lv_swap:swapoff失敗:無法分配內存。我猜想它是因爲RAM沒有足夠的空間來容納交換內容。 – user3516088

+0

swapoff給出錯誤:是的,似乎你的機器缺少物理內存。在這段時間內,屏幕截圖上的堆內存使用情況對我來說確實很好。燙髮/非堆使用情況如何?根據jconsole, – mdo

+0

均小於500 mb。當我運行vmstat時,它顯示block io(bi/bo)中的活動,si/so(swap io)中沒有變化。由於進程內存正常運行,io是否可能導致交換空間使用量增加? – user3516088