垃圾收集器
GC垃圾回收算法和垃圾收集器关系
天上飞的理念,要有落地的实现(垃圾收集器就是GC垃圾回收算法的实现)
GC算法是内存回收的方法论,垃圾收集器就是算法的落地实现
GC算法主要有以下几种
- 引用计数(几乎不用,无法解决循环引用的问题)
- 复制拷贝(用于新生代)
- 标记清除(用于老年代)
- 标记整理(用于老年代)
因为目前为止还没有完美的收集器出现,更没有万能的收集器,只是针对具体应用最合适的收集器,进行分代收集(那个代用什么收集器)
四种主要的垃圾收集器
- Serial:串行回收
-XX:+UseSeriallGC
- Parallel:并行回收
-XX:+UseParallelGC
- CMS:并发标记清除
- G1
- ZGC:(java 11 出现的)
Serial
串行垃圾回收器,它为单线程环境设计且值使用一个线程进行垃圾收集,会暂停所有的用户线程,只有当垃圾回收完成时,才会重新唤醒主线程继续执行。所以不适合服务器环境
Parallel
并行垃圾收集器,多个垃圾收集线程并行工作,此时用户线程也是阻塞的,适用于科学计算 / 大数据处理等弱交互场景,也就是说Serial 和 Parallel其实是类似的,不过是多了几个线程进行垃圾收集,但是主线程都会被暂停,但是并行垃圾收集器处理时间,肯定比串行的垃圾收集器要更短
CMS
并发标记清除,用户线程和垃圾收集线程同时执行(不一定是并行,可能是交替执行),不需要停顿用户线程,互联网公司都在使用,适用于响应时间有要求的场景。并发是可以有交互的,也就是说可以一边进行收集,一边执行应用程序。
G1
G1垃圾回收器将堆内存分割成不同区域,然后并发的进行垃圾回收
垃圾收集器总结
注意:并行垃圾回收在单核CPU下可能会更慢
查看默认垃圾收集器
使用下面JVM命令,查看配置的初始参数
-XX:+PrintCommandLineFlags
然后运行一个程序后,能够看到它的一些初始配置信息
-XX:InitialHeapSize=266376000 -XX:MaxHeapSize=4262016000 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
移动到最后一句,就能看到 -XX:+UseParallelGC
说明使用的是并行垃圾回收
-XX:+UseParallelGC
默认垃圾收集器有哪些
Java中一共有7大垃圾收集器
- UserSerialGC:串行垃圾收集器
- UserParallelGC:并行垃圾收集器
- UseConcMarkSweepGC:(CMS)并发标记清除
- UseParNewGC:年轻代的并行垃圾回收器
- UseParallelOldGC:老年代的并行垃圾回收器
- UseG1GC:G1垃圾收集器
- UserSerialOldGC:串行老年代垃圾收集器(已经被移除)
底层源码