生產上發現每次full gc都會花上5~20s的時間,查看了下,發現每個小時都會觸發一次full gc,查了下資料是rmi致使的。 可是zabbix監控須要開啓rmi,不想關閉。查了下資料發現能夠經過-XX:+DisableExplicitGC能夠把system.gc忽略,從而不觸發full gc,這樣若是堆真的滿了也不會觸發full gc。 最後找到了-XX:+ExplicitGCInvokesConcurrent and -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses這2個參數,須要配合-XX:+UseConcMarkSweepGC使用,能夠將system.gc的full gc轉換成CMS gc。算法
-XX:+ExplicitGCInvokesConcurrent and -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses 現在,被普遍接受的最佳實踐是避免顯式地調用GC(所謂的「系統GC」),即在應用程序中調用system.gc()。然而,這個建議是無論使用的GC算法的,值得一提的是,當使用CMS收集器時,系統GC將是一件很不幸的事,由於它默認會觸發一次Full GC。幸運的是,有一種方式能夠改變默認設置。標誌-XX:+ExplicitGCInvokesConcurrent命令JVM不管何時調用系統GC,都執行CMS GC,而不是Full GC。第二個標誌-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses保證當有系統GC調用時,永久代也被包括進CMS垃圾回收的範圍內。所以,經過使用這些標誌,咱們能夠防止出現意料以外的」stop-the-world」的系統GC。
參考:http://ifeve.com/useful-jvm-flags-part-7-cms-collector/jvm