写点什么

第九周作业

用户头像
Geek_ce484f
关注
发布于: 2020 年 11 月 22 日

JVM(java 虚拟机)就是一层用软件实现的物理机。Java 通俗来说就是编译器将 Java 文件编译成.class,通过 JVM 加载并执行这些.class 文件


所谓垃圾回收,指的是 JVM 将堆空间中不再使用的对象清理掉的过程,这是由 JVM 自动完成的。根据 JVM 的架构,在启动 JVM 的时候会开辟一块内存空间作为堆空间,这个空间被 JVM 中的所有线程共享,Java 程序运行中所有新创建的对象都会被放入堆空间。如由于堆空间的容量是有限的,如果不断的新建对象放入堆空间,那么很快空间就会不够用,因此必须对垃圾对象所占用的内存空间进行清理,回收可用的内存空间给后续的对象创建使用。

JVM 的垃圾回收原理大致分为四个方面,分别是垃圾对象的识别、内存清理方法、分代回收以及垃圾回收器。


垃圾对象识别

JVM 识别垃圾对象使用一种可达性分析算法,这个算法从线程栈中的局部变量和方法区中的静态变量出发,找到它们所引用的对象,并递归地查找这些对象是否还有引用其他对象,对所有引用到的对象进行标记,直到没有更多对象可以标记。那么所有被标记过的对象就是仍在使用的对象,而剩下的未标记的对象则是可回收的垃圾对象。

可达性分析 从 GC Roots 对象出发一路向下遍历,将遍历到的对象标记为可达,其他对象即不可达。其中 GC Root 包括:栈中引用对象、方法区中的静态或是常量引用,以及本地方法栈中的 JNI 引用对象。

GC 算法 经可达性分析后,那些不可达的对象将等待回收。


内存清理方法

在标记完存活对象之后,对于垃圾对象所占用的内存空间即可执行清理。最简单的方式就是直接清空这些内存空间,而在实际操作中,只需把这些内存空间的状态改为空闲,这样如果有新对象创建需要分配内存空间,只需从这些空闲空间中进行分配即可,这跟硬盘删除文件时的原理是类似的。但是,如果只是简单地清理这些垃圾对象占用的内存空间,会导致这些被回收的空间分布零散、不连续,这样如果有较大的对象需要创建的话,小空间就无法被用上。因此第二种方法是将存活对象统一移动到一段连续的内存空间,而剩下的连续空间则都是空闲的,可以被用于大对象的创建。第三种方法是将堆空间预先分为两部分,只在其中一部分新建对象,当这部分空间用完时,将其中的存活对象拷贝到另一部分,然后清空这部分的空间即可。

常用的回收算法有:

mark-sweep 标记清除法:将标记的回收区域直接清空

mark-copy 标记拷贝法:将内存对半分,总保留一半是空闲的;回收时,将零散存活的对象连续地复制到另一半的空闲内存区。

mark-compact 标记合并法:先清理垃圾对象,再挪动存活对象,并保证连续存储

generation-collect 分代收集算法


分代回收

JVM 中绝大多数新建对象的生命周期都很短,可能创建出来执行相应操作后马上就没用了,因此绝大部分是可以回收的,只有少数对象会被持续使用。因此 JVM 将对象分为新生代对象和老年代对象。所有新创建的对象都被放置在新生代内存区,新生代还分为了 Eden、From、To 三个区,在垃圾回收过程中按顺序逐级将存活对象移到下一级,直到进入老年代内存区。

分代收集算法提供了两种模式:

Minor GC 也叫 Young GC,顾名思义主要在新生代活动的回收机制:

Eden 满了,标记复制到 S0;Eden 清空

Eden+S0 满了,标记复制到 S1;Eden 和 S0 清空

Eden+S1 满了,标记复制 S0;Eden 和 S1 清空

循环往复步骤 2、3

将 S0 和 S1 间多次往复的标记块晋升到老年代

Major GC:老年代也满了,就整体标记清除或是标记合并一下,但是会比较耗时


垃圾回收器

早期单核 CPU 时代,JVM 在进行垃圾回收的时候需要暂停住所有正在运行的工作线程,这一步被称为 stop-the-world,然后启动一个垃圾回收线程进行垃圾回收,回收完之后继续运行各个工作线程。后来有了多核 CPU,支持多线程并行运行,于是 stop-the-world 之后的垃圾回收线程从一个扩展到多个,以并行的方式进行垃圾回收,从而极大缩短了工作线程暂停的时间。为了进一步减少工作线程被暂停的情况,又出现了并发回收机制,即将垃圾回收分为多个阶段,在第一轮标记的时候,垃圾回收线程与工作线程并发运行,然后进入 stop-the-world,对标记进行检查更新,再恢复工作线程,让垃圾回收线程以并发的方式进行清理。

垃圾回收器一直在发展,一共经历了四个阶段:

Serial(串行)收集器

Parallel(并行)收集器

CMS(并发)收集器

G1 收集器


用户头像

Geek_ce484f

关注

还未添加个人签名 2020.05.10 加入

还未添加个人简介

评论

发布
暂无评论
第九周作业