我們對我們的內聯網運行的生產Web應用程序,其中:Java垃圾回收器的行爲是否會隨着時間的推移而發展或受到JIT的影響?
- 在0300每一天重新啓動,以便執行其數據庫的備份
- 上有相同的負載在整個工作日(0800到1700)
- 運行在Java HotSpot™64位服務器VM版本20.45-b01
- 在具有16個內核和32個RAM的物理機上運行,運行Linux 2.6.18-128.el5
- 不與任何其他意義共享本機NT過程
配置有:
-Xms2g -XX:PermSize=256m -Xmx4g -XX:MaxPermSize=256m -Xss192k -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=50 -XX:+DisableExplicitGC
每天堆的使用量:
- 逐漸上升至90%,從起動到0800
- 保持在90%,直到0930
- 從0930至1415仍保持在70%
- 個下降到50%,在1415個
- 下降到37%,在1445
在該點堆上升到55%在約40分鐘,並收集回37%,循環往復直至下一次重新啓動。
我們在JVM上安裝了AppDynamics,可以看到主要垃圾收集大概每分鐘都會發生,但對內存沒有太大影響(除了上面概述的瀑布),直到內存達到37%時收藏變得不那麼頻繁。
Web應用程序的行爲顯然有數百個因素,但一個研究途徑是,當JVM停止時,熱點JIT信息明顯丟失。
是否有GC優化/等,這也是隨着JVM的關閉而丟失?由於某些熱點優化尚未發生,JVM是否會有效消耗比所需更多的內存?
如果JVM未重新啓動,並且我們找到另一種方法來執行數據庫備份,是否有可能從此應用程序獲得更好的內存性能? (只是重申一下,我知道有十萬件事情可能會影響應用程序的行爲,尤其是一個幾乎沒有其他人知道的應用程序!我真的只想知道是否有某些事情需要處理JVM在停止時丟失的內存性能)
我對此一無所知,儘管我懷疑完整的JIT優化只會在運行6個小時後(0930內存使用率最大並在之後下降)開始。對我來說,這看起來很像最初懶惰的垃圾回收。如果你從-Xmx3g開始會發生什麼?它是否耗盡內存? – Trilarion
我很可能會認爲,在大約一小時左右之後,您看到的大部分波動都是由於工作負載的變化。 –