写在前面
本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!
本专栏目录结构和文献引用请见100个问题搞定Java虚拟机
解答
Minor GC/Young GC
指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生暮死的特性,所以 Minor GC非常频繁,一般回收速度也比較快。
新生代非常适合复制算法,新建 Java 对象优先放到 Eden 区,当 Eden 区的空间耗尽时, Java 虚拟机便会触发一次 Minor GC,来收集新生代的垃圾。
Eden 区和 from 指向的 Survivor 区中的存活对象会被复制到 to 指向的 Survivor 区中,然后交换 from 和 to 指针,以保证下一次 Minor GC 时,to 指向的 Survivor 区还是空的。
Major GC/Old GC
指目标只是老年代的垃圾收集。目前只有 CMS 垃圾收集器会有单独的收集老年代的行为。
在不同的资料上,Major GC和 Full GC存在混淆情况,本文采取《深入理解Java虚拟机:JVM高级特性与最佳实践第3版》的说法。
Full GC
一般指整个 Java 堆和方法区的垃圾回收。
出现了 Full GC,一般会伴随至少ー次的Minor GC。 Full GC 的速度一般会比 Minor GC 慢10倍以上。
同时最糟糕的是 Full GC 为了枚举 GC Roots 不得不 stop the world(STW)。
JVM 目前来说最大的缺点一方面是占用内存较多,另一方面就是这个 STW 了。
目前越来越多的大数据框架比如 Spark,Flink 等都是使用直接内存避免用 JVM 管理内存。