平时写代码的时候,大部分都是使用强引用,声明了一个对象,并且在内存中开辟出相对应的空间。如果一个对象有强引用,虚拟机是不会回收这个对象的,即使在内存不够的情况下,虚拟机宁愿抛出 OutOfMemory 也不会擅自回收有强引用的对象。这个机制是合理的。
虚拟机会在认为内存不够用,或者认为需要清理不必要内存的时候,回收只有软引用的对象。如果一个对象既有软引用,又有强引用,它是不会被回收的。一般软引用会和引用队列(ReferenceQueue)配合使用。如果对象被虚拟机回收了,对应的软引用会出现在这个队列里。
弱引用和软引用非常类似,就是命跟短一些。不管内存是否足够,只要垃圾回收的线程扫描到一个只有弱引用的对象,就会回收它。软引用是有暂住证的,弱引用这倒霉孩子跟逃犯一样,被警察逮着了只能被 kill 掉。垃圾回收线程是比较低优先级的线程,所以弱引用还是有一定能存活的时间的。弱引用一样可以和引用队列配合使用。
虚引用的主要作用是跟踪对象的垃圾回收。虚引用必须配合引用队列一起使用。当垃圾回收线程在回收一个对象的时候,如果这个对象有虚引用,会把该对象的虚引用放入引用队列里,你可以在这个对象被回收前做一些必要的动作。你可以做回收逃逸,但这个逃逸,不是高手不要做。
软引用和弱引用都是为了避免出现 OutOfMemory 出现,把对象的回收交给虚拟机对处理,可以提高内存的使用效率。如果使用一个生命周期短的引用类型,比如弱引用,去创建一个缩略图对象,这个缩略图很快又被虚拟机回收了,你又重新创建一个缩略图对象,其实这样是很耗时间和资源的。所以根据需求,选择一个合适的引用方式很重要。
- EOF -
本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动。
转载请注明:文章转载自 Binkery 技术博客 [https://binkery.com]
本文标题: Java 基础之 强引用,软引用,弱引用和虚引用
本文地址: https://binkery.com/archives/400.html