我們在AWS上的Tomcat上運行基於Jersey(1.x)的服務,其中包含約20個實例數組週期性實例「變差」:在大約4小時的過程中,其堆和CPU使用量會增加,直到堆耗盡並且CPU被鎖定。此時它會自動從負載平衡器中移除並最終死亡。未完成的耗盡內存的對象
從這些實例中檢查堆轉儲,大約95%的內存已被一個java.lang.ref.Finalizer實例佔用,該實例持有各種各樣的東西,但其大部分或全部與HTTPS連接sun.net.www.protocol.https.HttpsURLConnectionImpl,sun.security.ssl.SSLSocketImpl,各種加密對象)。這些是我們使用Jersey的客戶端庫進行外部Web服務的連接。來自「健康」實例的堆轉儲並不表示任何問題。
在相對較低的負載情況下運行幾天或幾周沒有問題。隨着負載的增加,實例故障的頻率也會增加(平均CPU達到〜40%時每天幾個)。
我們的JVM ARG遊戲:
-XX:+UseG1GC -XX:MaxPermSize=256m -Xmx1024m -Xms1024m
我在加入JMX日誌記錄垃圾收集量度的過程,但我不完全清楚我應該尋找。在這一點上,我主要是在尋找什麼能夠啓動這種失敗或追加調查目標的想法。
可能是相關的:http://stackoverflow.com/questions/8355064/is-memory-leak-why-java-lang-ref-finalizer-eat-so-much-memory – aruisdante 2015-02-24 17:42:37