整理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上适合的内容