JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

Java的4中引用类型:强引用,软引用,弱引用,虚引用

wys521 2024-11-14 19:28:58 精选教程 25 ℃ 0 评论

强引用(java默认):可以直接访问目标对象。所指向的对象在任何时候都不会被系统回收。JVM宁愿抛出OOM异常,也不会回收强引用所指向的对象。可能导致内存泄漏。

Person person = new Person("fsx", 18);

System.out.println(person); //强引用:直接使用

软引用:是用来描述一些还有用但并非必须的对象。对于软引用对象,如果内存充足(注意此处对充足二字的理解)gc不会管它,如果内存不够了,它就不能幸免了。软引用可用来实现内存敏感的高速缓存。软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。

public static void main(String[] args) throws InterruptedException {

//定义一个引用队列

ReferenceQueue<Person> queue = new ReferenceQueue<>();

Person obj = new Person("fsx", 18);

SoftReference sf = new SoftReference<>(obj, queue); // 通过构造函数把Queue传进去 让此软引用关联上队列

obj = null; //置为null 让obj被垃圾回收期回收

System.gc();

TimeUnit.SECONDS.sleep(2);

byte[] bytes = new byte[1024 * 100];

System.gc();

TimeUnit.SECONDS.sleep(1); // 把问题放大,让gc过来回收 保证obj已经被回收

System.out.println("是否被回收:" + sf.get());

//队列里存在 说明对象马上就要被回收了 所以顺势也把软引用对象干掉

if ((sf = (SoftReference<Person>) queue.poll()) != null) {

System.out.println("sf置为null,释放内存");

sf = null;

}

}


Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表