单例模式与垃圾回收

单例模式创建的对象是否会被JVM回收

在单例模式中,如果对象长久没有被使用,该对象是否会被JVM进行垃圾回收呢?
在回答这个问题之前得先弄懂JVM会在什么时候对对象进行垃圾回收的。
JVM如何判断一个对象需要被回收
   JVM判断一个对象是否需要被回收,得对这个对象进行可达性分析。所谓的可达性分析,     
就是判断这个对象是否有到达GC Roots的一个引用链,即是否能够到达这个GC Roots。   
即从GC Roots开始搜索,经过一系列的路径,如果可以到达java对象,那这个对象就是   
不可回收的。  
    既然,要判断对象是否可以被回收,得判断对象是否可达GC Roots,那GC Roots是什么?  
可以充当GC Roots的对象如下:
    - 虚拟机栈中的引用对象。  
    - 方法区中的类静态属性引用的对象。
    - 方法区中常量引用的对象。
    - 本地方法栈中JNI的引用对象。  
    通俗的讲,就是能否在方法区或者堆栈中找到一个该对象的引用,如果有这个对象就是不可  
回收的,如果没有JVM就会回收该对象。  

    知道了垃圾回收对象的方法之后,我们得弄懂单例模式中的对象的GC Roots是哪一种类型的。  
单例模式对象分析
public class Singleton {  
    private static Singleton instance = new Singleton();  
    private Singleton (){}  
    public static Singleton getInstance() {  
        return instance;  
    }  
}   
    上面的单例模式是一个饿汉式的。由上面的代码可以知道,这个对象是被"private static" 
修饰的,因此,这个对象是从属于类的,它的GC Roots即为"方法区中的类静态属性引用的对象",  
所以,只要这个类加载到内存中且这个类还没有被垃圾回收,那这个对象就不会被垃圾回收。     
    既然,这个单例类被加载到内存中,这个单例对象就不会被垃圾回收。但是,如果这个类长时  
不使用,是否会被垃圾回收呢?那么,类是在什么条件下会被回收?
Java类垃圾回收的条件
    JVM对类的回收条件如下:
    1. Java堆中不存在该类的所有实例;
    2. 加载该类的ClassLoader已经被回收;
    3. 该类对应的java.lang.Class对象没有在任何地方被引用,无法再任何地方通过反射访问该类。
    JVM对类的回收要求比较严格,即使同时满足上面的所有条件也只是能够有资格回收类,但是  
并不能够保证一定会回收。  
    由上面的第一个条件可以知道,JVM要回收单例模式的类,该类需要满足堆中不存在该类的所有  
实例,但是单例模式中总是存在一个实例instance,所以该单例类也不会被垃圾回收。
总结
    通过上面的分析可以知道,单例模式的对象是不会被垃圾回收的,其中起关键作用的是我们得  
把该对象定义为"static"类型的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值