JVM是否使用多种垃圾收集器?HotSpot的CMS与G1 GC执行方式咨询
嘿,这个问题问得挺专业的!我来给你理清楚:
JVM是否会使用一种以上的垃圾收集器?
当然可以!不过这里的“多种”一般是针对Java堆的不同代来搭配使用。举个常见的例子:新生代用ParNew收集器,老年代用CMS;或者新生代用Parallel Scavenge,老年代用Parallel Old。
这是因为Java堆的分代设计本身就是为了适配不同对象的生命周期:新生代里的对象大多活不过几次GC,适合用复制算法的轻量收集器;老年代的对象存活时间长、占用空间大,就得用标记-清理/标记-整理这类更适合处理大内存的收集器。所以JVM完全支持跨代搭配不同的收集器,但同一代里一般只会用一种。
CMS和G1在垃圾回收时是并行运行还是仅选其一?
答案是只能二选一,它们没法在同一个JVM实例里同时并行工作。
原因很简单,这两款收集器的设计逻辑和堆结构适配性完全不同:
- CMS是专门针对老年代的并发收集器,通常需要和新生代的ParNew配合,堆还是传统的分代划分;
- G1是面向整个堆的区域化收集器,它把堆拆成了一个个大小相等的Region,虽然逻辑上仍有新生代和老年代的区分,但回收是基于Region的增量式处理,和CMS的工作模式完全不兼容。
你在启动JVM的时候,得通过参数指定用哪一个:比如用-XX:+UseConcMarkSweepGC启用CMS,用-XX:+UseG1GC启用G1。要是你同时加这两个参数,JVM要么直接报错,要么会忽略其中一个,根本不会让它们同时运行。
内容的提问来源于stack exchange,提问作者Trooper
相关产品推荐
相关产品推荐

