网站首页 > java教程 正文
- java 中的引用分为 4种
1.强引用 引用存在就不会被GC *
2.软引用 heap memory(堆内存)满了就会被GC掉 *
3.弱引用 每次GC就会回收掉(应用有:ThreadLocal) *
4.虚引用 每次GC就会回收掉(应用有,控制jvm外的内存) */
- demo1 强引用案例1
public class ReferenceDemo {
@Override
protected void finalize() throws Throwable{
System.out.println( "ReferenceDemod对象死亡了");
}
}
/**
* 1.强应用就是我们平常的引用
* 引用存在就不会被回收 引用!=null
*/
public static void strongReference(){
ReferenceDemo referenceDemo = new ReferenceDemo();
System.out.println("1.引用是否存在"+referenceDemo);
sleepThread(1000);
System.gc();
System.out.println("2.引用是否存在"+referenceDemo);
sleepThread(1000);
referenceDemo=null;
System.gc();
System.out.println("3.引用是否存在"+referenceDemo);
}
执行结果是:
1.引用是否存在com.gyj.study.referece.ReferenceDemo@1b6d3586
2.引用是否存在com.gyj.study.referece.ReferenceDemo@1b6d3586
3.引用是否存在null
ReferenceDemod对象死亡了
2、软引用 SoftRefernce 当heap memory 满了就会被GC回收掉;
/**
* 2.软引用:heap momory 堆内存满了就会被GC回收掉;
*/
public static void softReference(){
// 设置 jvm的内存为20m
SoftReference<byte[]> sr= new SoftReference<byte[]>(new byte[1024 * 1024*10]);
// 软引用对象 st---强引用--> 软引用实例---- 软引用----> 学习引用对象 学习对象比软引用 引用着,heap momory满了GC就会回收掉 学习引用对象(销毁)
System.out.println("1 软引用类 引用 st :"+sr);
System.out.println("1 byte[]引用类 引用 :"+sr.get());
System.gc(); //垃圾回收
System.out.println("2 软引用类 引用 st :"+sr);
System.out.println("2 byte[]引用类 引用 :"+sr.get());
byte[] bytes = new byte[1024 * 1024 * 11];
System.out.println("3 软引用类 引用 st :"+sr);
System.out.println("3 byte[]引用类 引用 :"+sr.get());
}
打印结果:
1 软引用类 引用 st :java.lang.ref.SoftReference@1b6d3586
1 byte[]引用类 引用 :[B@4554617c
2 软引用类 引用 st :java.lang.ref.SoftReference@1b6d3586
2 byte[]引用类 引用 :[B@4554617c
3 软引用类 引用 st :java.lang.ref.SoftReference@1b6d3586
3 byte[]引用类 引用 :null (已经被GC回收掉了)
3 弱引用 WeakReference 弱应用引用的对象,每次GC都会回收掉! (应用场景有ThreadLocal)
/**
* 3.弱引用:每次GC就回收掉;
*/
public static void weakReference(){
WeakReference<ReferenceDemo> wr = new WeakReference<ReferenceDemo>(new ReferenceDemo());
// 弱引用对象 wr---强引用--> 弱引用实例---- 弱引用----> 学习引用对象 学习对象实例用弱引用引用着,每次GC就会回收掉 学习引用对象(销毁)
System.out.println("1.引用是否存在"+wr);
System.out.println("1.学习引用对象 是否存在"+wr.get());
sleepThread(1000);
System.gc();
System.out.println("2.引用是否存在"+wr);
System.out.println("2.学习引用对象 是否存在"+wr.get());
}
打印结果:
1.引用是否存在java.lang.ref.WeakReference@1b6d3586
1.学习引用对象 是否存在com.gyj.study.referece.ReferenceDemo@4554617c
2.引用是否存在java.lang.ref.WeakReference@1b6d3586
2.学习引用对象 是否存在null
ReferenceDemod对象死亡了 (GC异步回收!)
4.虚引用 phantomReference 弱应用引用的对象,每次GC都会回收掉! (应用场景有ThreadLocal)并且GC回收钱也获取不到
public static void phantomReference(){
ReferenceQueue referenceQueue = new ReferenceQueue<ReferenceDemo>();
PhantomReference<ReferenceDemo> pr = new PhantomReference<ReferenceDemo>(new ReferenceDemo(),referenceQueue);
// 虚引用对象 pr---强引用--> 虚引用实例---- 虚引用----> 学习引用对象 学习对象实例用虚引用引用着,每次GC就会回收掉 学习引用对象(销毁)
//虚用获取不到
System.out.println("1.引用是否存在"+pr);
System.out.println("1. Queue:"+referenceQueue.poll());
System.out.println("1.学习引用对象 是否存在"+pr.get());
sleepThread(1000);
System.gc();
System.out.println("2.引用是否存在"+pr);
System.out.println("1. Queue:"+referenceQueue.poll());
System.out.println("2.学习引用对象 是否存在"+pr.get());
}
结果:
1.引用是否存在java.lang.ref.PhantomReference@1b6d3586
- Queue:null
1.学习引用对象 是否存在null
2.引用是否存在java.lang.ref.PhantomReference@1b6d3586
- Queue:null
2.学习引用对象 是否存在null
ReferenceDemod对象死亡了
最后总结:
* java 的引用分为4中
* 1.强引用 引用存在就不会被GC
* 2.软引用 heap memory(堆内存)满了就会被GC掉
* 3.弱引用 每次GC就会回收掉(应用有:ThreadLocal)
* 4.虚引用 每次GC就会回收掉(应用有,控制jvm外的内存)
猜你喜欢
- 2025-01-08 JVM中的对象及引用
- 2025-01-08 一文带你解读?JavaScript的引用类型和函数对象
- 2025-01-08 如何理解java基础中的Reference和引用类型?
- 2025-01-08 强引用、软引用、弱引用、幻象引用有什么区别?有哪些使用场景?
- 2025-01-08 Java中的四种引用详解
你 发表评论:
欢迎- 04-26Java高效处理大文件读写的全方位指南
- 04-26省钱兄JAVA视频交系统开发
- 04-26Java常用工具类技术文档
- 04-26高效使用Java构建工具,Maven篇|云效工程师指北
- 04-26Java中自定义配置文件可以如此简单
- 04-26Java 技术文档(详细版)
- 04-26DuckDuckGo应用和扩展全面禁止谷歌的单点登录弹窗
- 04-26单点登录的终级解决方案-xxlSso
- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)