强引用、软引用、弱引用、幻象引用的区别
强引用、软引用、弱引用、幻象引用有什么区别?
首先,为什么要对 Java 对象区别不同的引用类型呢?其主要体现的,其实是对象不同的可达性状态和对 GC 收集垃圾对象的影响。
强引用
强引用是我们最常见的普通对象引用,比例代码中的静态变量(static 修饰),在静态变量的使用中,我们知道,静态变量会一直存在于 JVM 中,随时可供使用。其原因是因为静态变量为强引用,只要是被强引用的对象,就表明对象还存活着,并且不会被垃圾回收机给回收掉。对于普通的对象而言,如果没有其他的引用关系,只要超过了引用的代码块或者是作用域,亦或是在代码中显式地将其值赋为 null,这就表明对象时可以被垃圾收集的了,当然具体回收时机还是要看垃圾收集策略和具体的应用运行情况。
软引用
软引用,是相对强引用弱化一些的一种引用,垃圾收集器进行回收时,不一定会将软引用的对象给回收掉,而只有当 JVM 在进行垃圾回收之后,判定内存不足时,才会去试图回收软引用指向的对象。这样做的话,JVM 可以确保在抛出 OutOfMemoryError 之前,将软引用指向的对象给回收掉。利用这些特性,通常可以将软引用用来实现内存敏感的缓存,这样做可以保证缓存的使用,也可以保证不会因为缓存而将内存耗尽,只有当内存不足时才会清理掉。
弱引用
弱引用也不能保证对象不会被垃圾收集,弱引用仅仅是提供一种访问在弱引用状态下对象的途径。只要发生垃圾回收时,不管当前内存空间是否充足或紧缺,弱引用的对象一定会被回收掉。
幻引用
幻引用也叫做虚引用,对于幻引用,不能通过它进行对象的访问。幻象引用仅仅是提供了一种确保对象被 finalize 以后,做某些事情的机制。虚引用必须和引用队列(RefenenceQueue)联合使用
版权声明: 本文为 InfoQ 作者【zarmnosaj】的原创文章。
原文链接:【http://xie.infoq.cn/article/7353f7bea6aefaffb4dd8bcd2】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论