JVM
强软弱虚引用
reference类里面会记录对象的内存地址和在方法区中的类的信息和父类信息、实现接口、方法等信息
- 强:垃圾回收的时候永远不会回收的对象
- 软:垃圾回收时内存不够了就会回收的对象引用
- 弱:垃圾回收的时候一定回收的对象引用
- 虚:无法实例化对象,使用只是为了在垃圾回收的时候能收到系统的通知
垃圾对象的判定
- 引用计数法:每有一个地方使用了就加一,缺点就是无法解决循环引用的问题
- 根可达算法:GCRoot就是当前的Java程序,Java虚拟机栈、本地方法栈、堆和方法区的对象引用,包括静态对象引用和常量对象引用
垃圾回收算法
- 标记清除算法:先使用根可达算法对对象进行标记,然后就进行垃圾对象的清除回收,缺点就是会产生内存碎片
- 复制算法:将内存划分为一半,垃圾回收的时候还是先根可达算法标记存活对象,然后将存活对象复制到另一边的内存中,然后清除一边内存中的所有对象,缺点就是浪费内存,但是解决了内存碎片的问题,效率还很高
- 标记整理算法:前面和标记清除一样,但是最后会把存活的对象整理到一边,缺点就是效率低了
垃圾回收器
MinGc:Serial、ParNew FullGc:SerialOld、ParallelOld、ConcurrentMarkSweep、Parallel Scavenge、G1
因为大部分的对象都是朝生夕死的,所以在年轻代使用的垃圾回收器使用的都是复制算法,年轻代有伊甸园区和survivorfrom区和to区,新生的对象都在伊甸园区,每进行一次轻gc还存活的对象就到幸存者区,然后就是1和0区的不断复制转移,伊甸园区和幸存者区的比例是8:1,当一个对象的年龄超过15,就会转移到老年代,大对象直接进入老年代 Jdk1.8默认使用的是Serial和CMS垃圾回收器,只有Jdk1.9才默认使用G1 补充:G1垃圾回收器是基于分区的垃圾回收器,RSet来记录引用到别的Region的对象的区域
垃圾回收器的垃圾回收过程
CMS:
- 根可达算法初始标记GCRoot
- 并发标记
- 重新标记(STW)
- 并发清除
G1: - 根可达算法标记GCRoot
- RSet记录引用到对象的RSet,并发标记
- 重新标记(STW)
- 根据RSet的情况,只清除垃圾多的Region,并发清除
|