整理rednaxelafx.iteye.com上適合的內容
- 手動System.gc()與JVM自動gc有什么根本上的區別么?
- System.gc()可能在自動GC原本不會進入GC的位置上進入GC
- 正常情況下,Java代碼要嘗試在GC堆上分配空間的時候才會觸發GC;換句話說,基本上是“new”的時候才會觸發GC。但System.gc()、JVMTI的強制GC等動作都在正常情況之外提示系統要做一次GC
- System.gc()不一定是觸發所謂的“full GC”或者叫“major GC”
- 在Sun JDK6與OpenJDK 6的HotSpot里,"GCCause是_java_lang_system_gc"的時候,如果VM啟動參數DisableExplicitGC為false,則會觸發一次full GC,如果該參數為true則完全不觸發任何GC。要將這個參數設置為true,啟動的時候寫上-XX:+DisableExplicitGC就行
- 當使用Concurrent Mark-Sweep (CMS)時,可以通過-XX:+ExplicitGCInvokesConcurrent 或 -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses 參數來指定System.gc()觸發并發GC而不是full GC
在CMS中,并發GC不對old gen做壓縮,而full GC是stop-the-world的并且會做壓縮
- HotSpot對System.gc()有特別處理
- 最主要的地方體現在一次System.gc()是否與普通GC一樣會觸發GC的統計/閾值數據的更新
- HotSpot里的許多GC算法都帶有自適應的功能,會根據先前收集的效率來決定接下來的GC中使用的參數,
但System.gc()默認不更新這些統計數據,避免用戶強行調用GC對這些自適應功能的干擾
可以參考HotSpot的UseAdaptiveSizePolicyWithSystemGC參數,默認是false
- HotSpot里的許多GC算法都帶有自適應的功能,會根據先前收集的效率來決定接下來的GC中使用的參數,
- 最主要的地方體現在一次System.gc()是否與普通GC一樣會觸發GC的統計/閾值數據的更新
- 除此之外,在HotSpot里,System.gc()所觸發的full GC跟普通的full GC沒啥大差別
- System.gc()可能在自動GC原本不會進入GC的位置上進入GC
整理rednaxelafx.zhihu.com上適合的內容