2011-10-07 29 views
0

我已經設置了具有1個DAS和2個節點代理的glassfish羣集。Glassfish V2.1.1服務器批處理作業後堆大小永不減少

系統具有TimedObjects,每天進行一次批處理。作爲glassfish體系結構,只有1個羣集實例允許觸發由TimerService創建的每個Timer的超時事件。

我的問題是關於觸發批處理作業的羣集實例的堆大小。 VisualVM顯示一個實例始終具有可擴展的堆大小(在服務器加載時增加並在此之後減少),但另一個實例的堆大小始終最大並且從不減少。

可以接受的是,由於批量作業很大,因此堆大小最大。但是,我唯一的問題是爲什麼在作業完成後它不會減少?

VisualVM顯示觸發超時事件的實例的「已用堆內存」在批處理作業後減少。但是,爲什麼它的「堆大小」沒有相應縮小呢?

謝謝你的建議! ^^

+0

[這個問題和答案]可能證明是有用的(http://stackoverflow.com/questions/324499/java-still-uses-system-memory-after-deallocation-of-objects-and-garbage-collectio) 。 –

回答

0

大概你有東西引用了內存。我建議獲得MAT的副本並進行堆轉儲。從那裏你可以看到什麼被分配和引用它。

+0

您能否爲我推薦其他MAT工具? 因爲堆轉儲非常大(大約4GB)。它在雲端服務器上無法物理訪問。所以,下載堆轉儲文件在本地機器上運行是不可能的。 我試過jhat在遠程服務器上運行Web服務器,但它從未啓動並在此之後停止。有人報告說,jhat不支持大的轉儲文件。 (我的雲服務器是沒有安裝GUI的CentOS,所以我無法在其上安裝GUI應用程序。) – tee4cute

+0

您可以運行較小版本的工作負載,以創建較小的堆轉儲?你的雲不允許你使用shell或ftp? – Preston

+0

是的,它允許ftp。但是,我認爲如果我能看到在服務器上運行的真實數據會更好。我曾嘗試在本地機器上運行應用程序,並查看它的堆轉儲,但我無法從中獲取任何有用的信息。所以,最後的機會可能是從遠程服務器下載堆轉儲文件(這可能需要一整天!)。我認爲應該有另一個MAT工具,就像jhat在遠程機器上運行Web服務器一樣。非常感謝您的提前!我會弄清楚並將結果發佈給其他人。 – tee4cute

0

這是最終的答案(感謝普雷斯頓^^)

從文章:

http://www.ibm.com/developerworks/java/library/j-nativememory-linux/index.html

我拍攝的這些語句來回答我的問題!

1:

「運行時環境(JVM)提供由一些未知的用戶代碼驅動能力;這使得它不可能預測哪些資源運行時環境將需要在各種情況下」

2:這就是爲什麼觸發批處理作業的節點始終會消耗內存。 「

」保留本地內存與分配內存不同,當保留本地內存時,它不支持物理內存或其他存儲,雖然保留地址空間塊不會耗盡物理資源,但它確實可以防止內存不被用於其他目的「

3:這就是爲什麼不觸發批處理作業的節點具有可擴展的堆大小行爲。

「一些垃圾收集器通過將堆的使用區域縮小而將堆的部分取消(釋放後備存儲)來最大限度地減少對物理內存的使用。」