一、什么是垃圾?
垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。
如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到应用程序结束,被保留的空间无法被其他对象使用。
二、为什么要回收?
内存迟早都会被消耗完.
甚至可能导致内存溢出。
释放没用的对象,垃圾回收可以清除内存里的记录碎片。
JVM将整理出的内存分配给新的对象。
三、垃圾回收机制
Java语言规范没有明确地说明JVM使用哪种垃圾回收算法,但是任何一种垃圾回收算法一般要做2件基本的事情:
(1)发现无用信息对象.
(2)回收被无用对象占用的内存空间,使该空间可被程序再次使用。
四、可达性分析算法
可达性分析算法,也称为根搜索算法,这个算法的基本思路就是通过一系列的名为“GC Roots”的对象为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到“GC Roots”没有任何引用链相连,则证明对象是不可用的,可以对其进行垃圾回收。
1、4种可作为GC Roots的对象
虚拟机引用的对象
方法区中的类静态属性引用对象
方法区中常量引用对象
本地方法栈中JIN(Native方法)引用的对象
引用类型:
强引用(Strong Reference):最常见的普通引用,只要还有强引用指向一个对象,就不会回收
软引用(Soft Reference):JVM认为内存不足阿时候,才会去试图回收软引用指向的对象(缓存场景)
弱引用(Weak Reference):虽然是引用,但随时有可能被回收掉
虚引用(Phantom Reference):不能通过它访问对象,提供对象被finalize以后,执行指定逻辑的机制。
可达性级别:
强可达(Strongly Reachable):一个对象可以有一个或多个线程可以不通过各种引用访问到的情况
软可达(Softly Reachable):只能通过软引用才能访问到的状态
弱引用(Weakly Reachable):只能通过弱引用访问时的状态,当弱引用被清除的时候,就符合销毁条件
幻像可达(Phantom Reachable):不存在其他引用,并且finalize过了,只有幻像引用指向这个对象
不可达(Unreachable):意味着对象可以被清除了
五、垃圾回收算法
1、Marking-Sweep(标记-清除法)
首先标识出所有要回收的对象,然后进行清除
标记、清除过程效率有限,有内存碎片化问题,不适合特别大的堆
2、Marking-Compat(标记-整理法)
类似于标记-清除,但为了避免内存碎片化,它会在清理过程中将对象移动,以确保移动后的对象占用连续的内存空间