写点什么

架构师训练营第九周

用户头像
跨域刀
关注
发布于: 2020 年 08 月 05 日

简述 JVM 垃圾回收原理

目的:使 JVM 堆中不再使用的对象被清除掉,释放内存资源

问题:1、怎么知道哪些对象要回收;2、如何回收;3、回收后内存空间怎么管理;4、用什么样的过程回收。

回答:1、回收非热点的对象,释放其占用的内存资源。通过可达性分析算法对非热点对象进行标记,过程:从栈里的变量 a 出发,将这些引用变量的对象 A 进行标记后;再对引用 A 的对象 B 标记.....这样就确定了哪些是热点对象,其他的就是非热点对象,可以回收其内存空间。

2、回收手段:

清理:将非热点对象标注为空闲,让出内存空间给新对象使用;

压缩:将热点对象都放在堆空间的头部,剩下的就是非热点对象占用的空间;

复制:堆空间分为两部分,用一部分创建对象,当该空间占满时,把对象复制到另一个空间去。

3、JVM 分代垃圾回收

内存空间分为新生代,老年代。新生代一般空间比较小,存放新陈代谢比较快的对象。老年代比较大存放寿命比较长的对象。

新生代又可以分为 Eden 区,From 区,To 区。

创建对象后,先放入 Eden 区,如果 Eden 区满了,则复制到 From 区,继续在 Eden 区创建对象。Eden 区又满了,把 Eden 区和 From 区的对象复制到 To 区,继续在 Eden 区创建对象,Eden 区又满了,将 Eden 区和 To 区的对象放到 From 区。如此在 from 区和 To 区反复,对象还活着,则放到老年区。最终 Eden 区,From 区,To 区都满了,则对新生代和老年代做一次全量回收,把新生代的对象放到老年代。

4、JAVA 垃圾回收器算法

(1)串行回收器:适合单核,回收的时候,回收进程启动,回收期间应用进程全部停止;

(2)并行回收器:出现在多核,也就是回收进程有多个,并行回收,回收期间应用进程全部停止;

(3)并发回收器 CMS:进程启动的时候标记根对象,应用进程和标记进程同步进行。当标记到一定程度的时候,暂停所有应用进程进行重标记,然后启动所有应用进程,同时也启动垃圾回收进程,使得应用程序和垃圾回收进程并发进行;

(4)G1 回收器:将一个较大的内存空间分成 2000 个小块,其中有 Eden 区,survivor 区,Old 区,Humongous 区。在某个 Eden 区中建立对象,在另一个 Eden 区中回收对象,其他进程不受影响。


用户头像

跨域刀

关注

还未添加个人签名 2020.03.18 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第九周