「这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战」
一、 Java 回收机制简介
垃圾回收是Java虚拟机垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制。它可以有效的防止内存泄漏和内存溢出
- 内存泄漏:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。
- 内存溢出:指程序申请内存时,没有足够的内存供申请者使用
- 内存泄露量大到一定程度会导致内存溢出。但是内存溢出不一定是内存泄露引起的。
1. Java中的垃圾分类
| 类型 | 详情 |
|---|---|
| 强引用 | 本身不是垃圾,new创建的对象即使抛出OOM异常,也不会进行回收 |
| 软引用 | 内存不足时,才是垃圾 |
| 弱引用 | 下一次GC回收 |
| 虚引用 | 一个对象是否有虚引用的存在,不会对其生存时间造成影响,也无法通过虚引用得到一个对象(目的就是为了回收finalize) 为对象设置虚引用的唯一目的就是能在这个对象被回收时收到一个系统通知 |
2. 哪些对象可以被当做GC Root
- 虚拟机栈中引用的对象(栈帧中的本地变量表)
- 方法区中的常量引用的对象。
- 方法区中类静态属性引用的对象。
- 本地方法栈中JNI(Native方法)的引用对象。
- 活跃线程的引用对象
3. 如何回收
(1)引用计数:判断对象的引用数量
- 每个对象实例都有一个引用计数器,如果对象被引用,引用计数器加1,引用完成,则-1,通过判断对象的引用数量,来决定对象是否可以被回收。
- 优点: 执行效率高,程序执行受影响小。
- 缺点: 无法检测出循环引用的情况,导致内存泄漏
(2)可达性分析
- 可以理解为有向图,从GC Root开始找,只要可以找到的都是活动对象,如果找不到,这个对象就被标记为垃圾
4.垃圾回收算法
- 标记清除算法
- 复制算法
- 标记整理算法。
- 分代收集算法
今天就研究到这里,下篇继续分析内存泄漏和内存溢出