JVM 引用类型
2019-12-24 09:44:54来源:博客园 阅读 ()
JVM 引用类型
1、强引用
强引用,是在我们的开发工作当中普遍存在的。如果一个对象具有强引用,那就类似我们经常穿的衣服啊等必不可少的生活用品,我们肯定不会把他扔掉,同样jvm的垃圾回收器也不会回收它。当内存空间不足的时候,java虚拟机宁可抛出OOM异常,也不会回收具有强引用的对象来释放内存。我们可以将对象显示的赋值为null,则gc认为该对象不存在引用,这时就可以回收这个对象。具体什么时候收集这要取决于gc的算法。也就是说方法的内部有一个强引用,这个引用保存在栈中,而真正的引用内容(Object)保存在堆中。当这个方法运行完成后就会退出方法栈,则引用内容的引用不存在,这个Object会被回收。
2、软引用
SoftReference:是比强引用弱化的引用,可以让对象豁免一些垃圾回收,软引用通常在对内存比较敏感的程序中,例如高速缓存区,mybatis就是用到了该方式。他的特点就是 存充足的时候不被回收,内存不足时才被回收。
package com.jalja.java.reference; import java.lang.ref.SoftReference; /** * @Auther: XL * @Date: 2019/12/24 07:50 * @Description: */ public class SoftReferenceTest { public static void main(String [] args) throws Exception{ //softReferenceAmple(); softReferenceNotAmple(); } /** * 内存充足 */ private static void softReferenceAmple(){ Object o=new Object(); SoftReference<Object> reference=new SoftReference<>(o); System.out.println(o); System.out.println(reference.get()); o=null; System.gc(); System.out.println(o); System.out.println(reference.get()); } /** * 内存不足就回收 */ private static void softReferenceNotAmple(){ Object o=new Object(); SoftReference<Object> reference=new SoftReference<>(o); System.out.println(o); System.out.println(reference.get()); o=null; try { byte[]bytes=new byte[30*1024*1024]; }finally { System.out.println(o); System.out.println(reference.get()); } } }View Code
3、弱引用
WeakReference:无论内存是否足够,只要发生GC 弱引用的对象一定被回收
package com.jalja.java.reference; import java.lang.ref.SoftReference; import java.lang.ref.WeakReference; import java.util.WeakHashMap; /** * @Auther: XL * @Date: 2019/12/24 08:02 * @Description: */ public class WeakReferenceTest { public static void main(String [] args) throws Exception{ weakReferenceTest(); } /** * 内存充足 */ private static void weakReferenceTest(){ Object o=new Object(); WeakReference<Object> reference=new WeakReference<>(o); System.out.println(o); System.out.println(reference.get()); o=null; System.gc(); System.out.println("==========GC========="); System.out.println(o); System.out.println(reference.get()); } private static void weakHashMapTest(){ WeakHashMap<String,Object> weakHashMap=new WeakHashMap<>(); } }View Code
WeakHashMap:
4、虚引用
PhantomReference:
public static void main(String [] args) throws Exception{ Object o=new Object(); ReferenceQueue<Object> queue=new ReferenceQueue(); PhantomReference<Object> reference=new PhantomReference<>(o,queue); System.out.println(o); System.out.println(reference.get()); System.out.println(queue.poll()); o=null; System.gc(); System.out.println("==========GC========="); System.out.println(o); System.out.println(reference.get()); System.out.println(queue.poll()); }
引用队列:ReferenceQueue
package com.jalja.java.reference; import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; /** * @Auther: XL * @Date: 2019/12/24 08:28 * @Description: ReferenceQueue 引用队列,在GC后悔保留对象的引用 */ public class ReferenceQueueTest { public static void main(String [] args) throws Exception{ Object o=new Object(); ReferenceQueue<Object> queue=new ReferenceQueue(); WeakReference<Object> reference=new WeakReference<>(o,queue); System.out.println(o); System.out.println(reference.get()); System.out.println(queue.poll()); o=null; System.gc(); System.out.println("==========GC========="); System.out.println(o); System.out.println(reference.get()); System.out.println(queue.poll()); } }
原文链接:https://www.cnblogs.com/jalja/p/12057700.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- JVM常见面试题解析 2020-06-11
- switch循环所支持的数据类型 2020-06-07
- java基本数据类型 2020-06-06
- 学习笔记之方法引用 2020-06-06
- 【JVM故事】了解JVM的结构,好在面试时吹牛 2020-06-06
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash