简单理解垃圾回收
- 什么是垃圾回收?
- 垃圾回收的是什么?
- 如何判断为垃圾?
- 垃圾是怎样被回收的?
- 垃圾回收哪些区域的内存?
什么是垃圾回收
垃圾回收就是将被虚拟机视为垃圾的对象所占的内存释放掉。
垃圾回收的是什么
回收的是对象所占的内存
如何判断为垃圾
在垃圾收集器对堆内存进行回收前,会先判断哪些对象还在“存活”,哪些对象已经“死去”,这些“死去”的对象,就是我们需要进行回收的垃圾。一般判定为垃圾有两种算法。
-
引用计数算法(已淘汰)
引用计数算法,是指给对象中添加一个引用计数器,每当有一个地方引用它时,计数器的值就加1,当引用失效时,计数器的值就减1。当计数器值为0时,该对象就会被回收。
- 优点:简单直接,效率高。
- 缺点:对于对象之间的相互引用无法解决,导致内存的泄露。
-
可达性分析算法
通过一系列被称为“GC Roots”的对象作为起点,然后向下搜索,所走过的路径被称为引用链。当一个对象到 GC Roots之间没有任何引用链时,则说明该对象是不可用的,虚拟机就会将它们的内存释放掉。
GC Roots有哪些
- 虚拟机栈中引用的对象。
- 方法区中类静态属性引用的对象。
- 方法区中常量引用的对象。
- 本地方法栈中引用的对象。
垃圾是怎样被回收的
通过垃圾回收算法,JVM对垃圾进行标定然后回收其占用的内存空间。常见的垃圾回收算法有三种:
- 复制算法
- 优点:简单高效,不会出现内存碎片问题
- 缺点:内存利用率低,只有一半。如果存活对象很多的时候,效率低,因为需要复制很多对象。
- 标记清除
- 优点:利用率百分之百
- 缺点:标记和清除的效率不高,会产生内存碎片
- 标记整理
- 优点:利用率百分之百,没有内存碎片
- 缺点:效率很低,因为需要挪动内存
不同内存区域采用的回收算法不同,新生代使用复制算法。因为绝大多数对象不需要回收。老年代一般采用标记整理算法,CMS垃圾回收器采用标记清除算法。
垃圾回收哪些区域的内存
我们常谈的回收,绝大多数是回收堆内存。