写点什么

架构师训练营第一期 - 第九周课后作业

发布于: 2020 年 11 月 22 日

请简述 JVM 垃圾回收原理。

JVM 垃圾回收就是将JVM 堆中的已经不再被使用的对象清理掉,释放宝贵的内存资源。如果一个对象不再被在程序中的变量引用就成为不再被使用的对象了,那这个对象就可以被清理掉了。JVM 通过一种可达性分析算法进行垃圾对象的识别,具体过程是:从线程栈帧中的局部变量,或者是方法区的静态变量出发,将这些变量引用的对象进行标记,然后看这些被标记的对象是否引用了其他对象,继续进行标记,所有被标记过的对象都是被使用的对象,而那些没有被标记的对象就是可回收的垃圾对象了。

在实际中Java的对象大部分的生存时间是很短暂的,它们都是方法中的生成的对象引用,方法执行完退出方法的时候栈帧出栈引用被销毁,引用指向的对象就失去引用变成垃圾对象可以被回收了,仅仅是方法内部的生成时间。

在具体回收的时候,JVM使用分代垃圾回收的策略,把内存空间分为新生代和老年代,新生代再分为三个区:edan区、from区、to区。每一个对象都先在edan区创建,当edan区满时进行垃圾回收,回收时先将edan区区还再被引用的对象复制到from区,然后清空eden区。eden区再满时重复之前的垃圾回收处理。当from区也存放满了时,则将edan区和from区的存活对象复制到to区,然后清空edan区和from区,然后将to区的点对象复制到from区,保持from区为空,如此往复。经过多次回收处理仍然存活的对象就复制到老年代,一段时间以后老年代的空间也满了,那对老年代进行一次垃圾回收,在进行老年代垃圾回收的时候新生代也要进行垃圾回收。因此垃圾回收分为两种:只进行新生代的垃圾回收叫Yong GC,同时进行新生代和老年代的垃圾回收叫Full GC。



用户头像

还未添加个人签名 2019.01.15 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第一期-第九周课后作业