文章目录
1. 什么是垃圾回收机制(GC)
在早期的计算机语言,比如 C 和 C++,需要开发者手动的来跟踪内存,这种机制的优点是内存分配和释放的效率很高。但是它也有它的缺点,如果程序员不小心忘记释放内存,从而造成内存的泄露
内存泄露:申请内存之后,忘记释放了 导致 可用的内容越来越少,最终无内存可用
新的编程语言,比如 JAVA,Go,Python,PHP… 现在市面上的大部分主流编程语言,都采取了一个方案,那就是 “垃圾回收机制”,运行时自身会运行相应的垃圾回收机制。程序员只需要申请内存,而不需要关注内存的释放。垃圾回收器(GC)会在适当的时候将已经终止生命周期的变量的内存给释放掉。
1.1 垃圾回收机制的优缺点
GC的优点:
- 它大大简化了应用层开发的复杂度(不需要开发者再去手动跟踪内存)
- 降低了内存泄露的风险
GC的缺点:
- 消耗额外的开销(消耗的资源更多了)
- 会影响程序的流畅运行
2. 哪些内存需要回收
JVM的内存结构包括四大区域:1.程序计数器 2.栈 (虚拟机栈,本地方法栈)3.堆 4.方法区

举个例子,任何组织里,人都有三个派别,1.积极派 2.消极派 3.中间摇摆派,如图,对于上述三个派别,哪些是要进行回收释放内存的?
正在使用的内存中的对象 代表 积极派
不再使用,但是尚未回收的内存中的对象 代表消极派
中单部分为中间摇摆派

需要进行回收释放资源的:消极派
为什么中间摇摆派不回收释放内存呢?对于这种部分仍在使用,一部分不在使用的对象,整体来说是不释放的!等到这个对象彻底完全不使用,才真正的释放!!
注意:
垃圾回收的基本单位是“对象”,而不是“字节”
3. 垃圾回收具体是如何回收的
分为两个阶段:
- 找垃圾/判定垃圾
- 回收垃圾(释放内存)
3.1 找垃圾/判定垃圾
如何找 垃圾/判定垃圾呢?当下主流的思路,有两种方案:
- 基于引用计数(不是Java中采取的方案,这是别的语言,像Python采取的方案)
- 基于可达性分析(这个是Java采取的方案)
3.11 基于引用计数
什么是基于引用计数:简单来说,针对每个对象,都会额外引入一小块内存,保存这个对象有多少个引用指向他
举个例子
1.Test t = new Test();,此时 new 了一个对象,那么我们就会额外引入一小块内存,此时 t 指向这个对象的引用,因此 引用计数 加 1

最低0.47元/天 解锁文章
1214

被折叠的 条评论
为什么被折叠?



