垃圾回收GC
追踪所有正在被使用的对象,将不被使用的标记为垃圾。
手动管理
用malloc和free 或者 new / delete手动回收
智能指针
基于引用计数,比如c++里面的智能指针,当引用计数为0时,回收该对象
。
自动内存管理
1. 引用计数法
可能会出现,互相引用 无法回收。c++中可用weak_ptr 弱引用
2. 可达性分析算法
依赖于gc root对象。
可以充当gc root 对象的
- 虚拟机栈中引用的对象
- 方法区中静态属性引用的对象
- 方法区中常量所引用的对象
- 本地方法栈中JNI引用的对象
从gc root对象出发 联通的称之为 存活对象
不联通的称之为垃圾。
java中的引用
在jdk1.2之后,java对引用进行了扩充
强引用: 被强引用关联对象 永远不会被垃圾回收
软引用:当内存要溢出是就会去回收
弱引用:只要发生垃圾回收,就会被回收
虚引用:在发生垃圾回收的时候,会收到一个通知
至此,可以确定哪些垃圾可以被回收了
常用的垃圾收集算法
1. 标记并清除
标记出来垃圾后,清理掉
缺点:会产生大量内存碎片
2. 复制算法
在上一个算法的基础上演化而来的,解决了内存碎片的问题
将内存分为两块,在一块被用完之后,将还活着的对象移到一个空闲的块上去,清楚以前那一块。
这样就解决了内存碎片的问题。
新的问题:内存折半,没法发挥内存最大作用
3. 标记整理算法
从1中演化而来,将活动的对象,移动到一端,然后清除另一端
问题:效率问题,对内存变动更频繁,需要整理所有存活对象的引用地址,效率上比2差很多。
4. 分代收集算法 🌟
一套组合拳
根据对象存活周期的不同,它分为新生代和老年代
新生代:每次垃圾回收时都会有大批对象死去,少量存活。所以采用2算法
老年代:存活对象比例高,所以使用1 / 3算法来进行回收
https://www.bilibili.com/video/BV1by4y127eD
https://space.bilibili.com/59546029/video?keyword=垃圾回收
https://www.cnblogs.com/zackstang/p/10034699.html