写点什么

第 9 周作业

用户头像
cafebaby
关注
发布于: 2021 年 02 月 28 日

JVM 垃圾回收即使将 JVM 堆中的已经不再被使用的对象清理掉,释放宝贵的内存资源。


JVM 通过一种可达性分析算法进行垃圾对象的标识。具体过程是:


从线程栈帧中的局部变量,或者方法区的静态变量出发,将这个变量引用的对象进行标记;

然后看这些被标记的对象是否引用了其它对象,继续进行标记;

所有被标记过的对象都是被使用的对象,而那些没有被标记的对象就是可回收的垃圾对象了。

进行完标记以后,JVM 就会对垃圾对象占用的内存进行回收,回收主要有三种方法:


清理:将垃圾对象占据的内存清理掉,其实 JVM 并不会真的将这些垃圾内存进行清理,而是将这些垃圾对象占用的内存空间标记为空闲,记录在一个空闲的列表里,当应用程序需要创建新的对象的时候,就从空闲列表中找一段空闲内存分配给这个对象。

压缩:从堆空间的头部开始,将存活的对象拷贝到一段连续的内存空间中,那么其余的空间就是连续的空闲空间。

复制:将堆空间分成两部分,只在其中一部分创建对象,当这个部分空间用完的时候,将标记过的可用对象复制到另一个空间中。


  1. 创建新对象在 Eden 区,当 Eden 区满了以后,就会进行 Young GC,把在用的对象 copy 到 From 区;

  2. 当 Eden 区再次满了以后,再次进行 YoungGC,把 Eden 区和 From 区的在用对象,copy 到 To 区;

  3. 当多次 Eden 发送 YoungGC,把一些还用的对象放到老年代;

  4. 当老年代满了以后,就会进行 Full GC。这是要应用线程都要暂停,进行 Full GC。


用户头像

cafebaby

关注

还未添加个人签名 2020.11.27 加入

还未添加个人简介

评论

发布
暂无评论
第9周作业