这篇文章将为大家详细讲解有关java中弱引用的使用方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
在Java里, 当一个对象被创建时, 它被放在内存堆里. 当GC运行的时候, 如果发现没有任何引用指向该对象, 该对象就会被回收以腾出内存空间。
或者换句话说, 一个对象被回收, 必须满足两个条件:
1)没有任何引用指向它
2)GC被运行。
Java对于简单的情况, 手动置空是不需要程序员来做的, 因为在java中, 对于简单对象, 当调用它的方法执行完毕后, 指向它的引用会被GC回收,
实际中我们写代码,往往是通过把所有指向某个对象的referece置null实现,如:
Person p = new Person("张三",18,"男");//强引用
...
p=null;//不再使用的时候置null
很明显,手动置null对象对于程序员来说, 是一件繁琐且违背自动回收机制的。
Java对于简单的情况, 如方法中的产生的局部对象,是不需要程序员来手动置空, 当调用它的方法执行完毕后, 指向它的引用会被GC回收。
而复杂一点的情况,比如使用cache,因为cache的对象正是程序运行需要的,那么只要程序正在运行, cache中的引用就不会被GC,那么随着cache中的引用越来越多, GC无法回收的对象也越来越多,无法被自动回收,此时就必须有开发者来进行处理回收,显然也违背了java自动回收机制。
对此,java中引入了弱引用(WeakReference)。
当一个对象仅仅被weak reference指向, 而没有任何其他strong reference指向的时候, 如果GC运行, 那么这个对象就会被回收。如果存在强引用同时与之关联,则进行垃圾回收时也不会回收该对象。
WeakReference的语法:
WeakReference<T> weakReference = new WeakReference<T>(referent);
当要获得weak reference引用的对象时, 首先需要判断它是否已经被回收:
weakReference.get();
如果此方法为空, 那么说明weakReference指向的对象已经被回收了。
下面一个WeakReference的栗子:
Person类:
package com.yx.test.model;
/**
* Person
*
* @author yx
* @date 2019/11/26 16:28
*/
public class Person {
private String name;
private int age;
private String sex;
public Person() {
}
public Person(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
测试类TestWeakReference:
package com.yx.test.reference;
import com.yx.test.model.Person;
import java.lang.ref.WeakReference;
/**
* TestWeakReference
*
* @author yx
* @date 2019/11/26 16:30
*/
public class TestWeakReference {
public static void main(String[] args) {
Person p = new Person("张三",18,"男");
WeakReference<Person> weakPerson = new WeakReference<Person>(p);
int i=0;
while(true){
if(weakPerson.get()!=null){
i++;
System.out.println("Object is alive for "+i+" loops - "+weakPerson);
}else{
System.out.println("Object has been collected.");
break;
}
}
}
}
运行结果:
p is alive for 1 loops - java.lang.ref.WeakReference@330bedb4
...
p is alive for 62331 loops - java.lang.ref.WeakReference@330bedb4
p is alive for 62332 loops - java.lang.ref.WeakReference@330bedb4
p has been collected.
可以看到,在while循环执行数万次后,p被回收了。
多次测试运行程序,发现p回收时循环执行的次数是不确定的,这个很容易理解:因为这是由GC运行的不确定性所确定的。
关于java中弱引用的使用方法就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。