前言
本篇博客博主将介绍jvm中的GC机制,坐好板凳发车啦~~
一.GC相关
1.1回收栈内存
对于虚拟机栈,本地方法栈这部分区域而言,其生命周期与相关线程相关,随线程而生,随线程而灭。并且这三个区域的内存分配与回收具有确定性,因为当方法结束或者线程结束时,内存就自然跟着线程回收了。
1.2回收堆内存与方法区内存
我们所讲的有关内存分配和回收关注的为Java堆与方法区这两个区域
Java堆中存放着几乎所有的对象实例,垃圾回收器在对堆进行垃圾回收前,首先要判断这些对象哪些还存活,哪些已经“死去”。
1.3死亡对象的判断
1.引用计数法
2.可达性分析算法
对象5-7之间虽然彼此还有关联,但是它们到GC Roots是不可达的,因此它们会判定为可回收对象。
在Java语言中,可作为GC Roots 的对象包含下面几种:
1.虚拟机栈(栈帧中的本地变量表)中引用的对象;
2.方法区中类静态属性引用的对象;
3.方法区中常量引用的对象;
4.本地方法栈中JNI(Native 方法)引用的对象。
1.4垃圾回收的指导思想
1.4.1标记-清除思想
“标记-清除”算法是最基础的收集算法,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象
缺点:
1.效率问题:标记和清除这两个过程效率都不高;
2.会产生内存碎片化问题。
1.4.2复制算法思想
1.4.3标记-整理算法思想
1.4.4分代算法思想
垃圾回收过程:
1.5Minor GC 和 Full GC
1.6垃圾收集器
如果说上面的收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。
1.6.1为什么有这么多垃圾回收器
⾃从有了 Java 语⾔就有了垃圾收集器,这么多垃圾收集器其实是历史发展的产物。最早的垃圾收集器为 Serial,也就是串⾏执⾏的垃圾收集器,Serial Old 为串⾏的⽼年代收集器,⽽随着时间的发展,为了提升更⾼的性能,于是有了 Serial 多线程版的垃圾收集器 ParNew。后来⼈们想要更⾼吞吐量 的垃圾收集器,吞吐量是指单位时间内成功回收垃圾的数量,于是就有了吞吐量优先的垃圾收集器 Parallel Scavenge(吞吐量优先的新⽣代垃圾收集器)和 Parallel Old(吞吐量优先的⽼年代垃圾收集器)。随着技术的发展后来⼜有了 CMS(Concurrent Mark Sweep)垃圾收集器,CMS 可以兼顾吞吐量和以获取最短回收停顿时间为⽬标的收集器,在 JDK 1.8(包含)之前 BS 系统的主流垃圾收集 器,⽽在 JDK 1.8 之后,出现了第⼀个既不完全属于新⽣代也不完全属于⽼年代的垃圾收集器 G1(Garbage First),G1 提供了基本不需要停⽌程序就可以收集垃圾的技术,下⾯我们来看每种垃圾收集器具体的介绍
1.6.2CMS收集器
1.6.3G1收集器
结果如下:
1.7总结:一个对象的一生
尾语
这篇博客到这里就结束啦,希望可以给大家带来帮助~~