架构 2 期 - 第九周作业(1)
请简述 JVM 垃圾回收原理。
垃圾回收就是清理掉 JVM 堆中已经不再被引用的对象,用以释放系统资源。启动JVM的时候会开辟一块内存空间作为堆空间,Java运行过程中所有的对象都会被放入堆空间。但由于堆空间的容量是有限的,如果不断有对象放入,那么很快空间就会不够用,因此必须对垃圾对象所占用的内存空间进行清理,回收可用的内存空间给后续的对象创建使用。
垃圾回收原理大致分为四个方面,分别是对象识别、清理方法、分代回收以及垃圾回收器
垃圾对象识别
JVM采用可达性分析算法进行垃圾对象识别,这个算法从线程栈中的局部变量和方法区中的静态变量出发,找到它们所引用的对象,并递归地查找这些对象是否还有引用其他对象,对所有引用到的对象进行标记,直到没有更多对象可以标记。那么所有被标记过的对象就是仍在使用的对象,而剩下的未标记的对象则是可回收的垃圾对象。
清理方法
在对对象进行识别后,也就是标记完存活对象后,对于垃圾对象即可进行清理过程。
最简单的方式就是直接清空这些内存空间,而在实际操作中,只需把这些内存空间的状态改为空闲,这样如果有新对象创建需要分配内存空间,只需从这些空闲空间中进行分配即可。但是,如果只是简单地清理这些垃圾对象占用的内存空间,会导致这些被回收的空间分布零散、不连续,这样如果有较大的对象需要创建的话,小空间就无法被用上。
因此第二种方法是将存活对象统一移动到一段连续的内存空间,而剩下的连续空间则都是空闲的,可以被用于大对象的创建。
第三中方法是将堆空间预先分为两部分,只在其中一部分新建对象,当这部分空间用完时,将其中的存活对象拷贝到另一部分,然后清空这部分的空间即可。
分代回收
JVM中绝大多数新建对象的生命周期都很短,可能创建出来执行相应操作后马上就没用了,因此绝大部分是可以回收的,只有少数对象会被持续使用。因此JVM将对象分为新生代对象和老年代对象。所有新创建的对象都被放置在新生代内存区,新生代还分为了Eden、From、To三个区,在垃圾回收过程中按顺序逐级将存活对象移到下一级,直到进入老年代内存区。
垃圾回收器
垃圾回收器一直在发展,一共经历了四个阶段:
Serial(串行)收集器
Parallel(并行)收集器
CMS(并发)收集器
G1 收集器
评论