2014-01-07 41 views
6

我們對我們的內聯網運行的生產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在停止時丟失的內存性能)

+1

我對此一無所知,儘管我懷疑完整的JIT優化只會在運行6個小時後(0930內存使用率最大並在之後下降)開始。對我來說,這看起來很像最初懶惰的垃圾回收。如果你從-Xmx3g開始會發生什麼?它是否耗盡內存? – Trilarion

+1

我很可能會認爲,在大約一小時左右之後,您看到的大部分波動都是由於工作負載的變化。 –

回答

0

是的,由於JIT優化,GC的行爲可能會隨時間而改變。一個例子是自Java 6u23以來默認啓用的「Escape Analysis」。這種優化可以防止在堆中創建一些對象,因此根本不需要垃圾收集。

欲瞭解更多信息,請參閱Java 7's HotSpot Performance Enhancements