Java中的WeakHashMap浅析
作者:小布丁value
这篇文章主要介绍了Java中的WeakHashMap浅析,weakhashmap关键是:当一个对象被GC回收时,响应的值对象的引用从map中删除,weakhashmap能节约存储空间,来实现缓存那些非必要的数据,需要的朋友可以参考下
WeakHashMap介绍
- weakhashmap优化jvm,是GC更加智能回收无用的对象。
- weakhashmap关键是:当一个对象被GC回收时,响应的值对象的引用从map中删除,weakhaskmap能节约存储空间,来实现缓存那些非必要的数据
引用类型
java中提供的引用类型有4种
- 强(Strong)引用
- 软(soft)引用
- 弱(weak)引用
- 虚( phantom)引用
强(Strong)引用
常使用的引用类型,在创建对象时
只要强引用存在,GC永远不会回收被引用的对象,通过new创建的对象所关联引用就是强引用,此时GC就不会碰该对象,当jvm内存空间不足,jvm宁愿抛出OOM(OutOfMemoryError)运行时村务,使得程序终止,也不会随时回收强引用所引用的对象 java中除了强引用还有三种引用,在java.lang.ref.Reference
//referent为引用指向的对象 Reference(T referent) { this(referent, null); } //ReferenceQueue对象,可以理解为队列 Reference(T referent, ReferenceQueue<? super T> queue) { this.referent = referent; this.queue = (queue == null) ? ReferenceQueue.NULL : queue; }
Object o=new Object(); SoftReferencr sr=new SoftReference(o,queue);
sr为软引用,指向O对象,o会在一定实际被垃圾回收器进行回收,sr对象本身的清理依赖Queue,当sr出现在Queue时,说明指向对象已经无效了,可以放心清理
软(soft)引用
软引用用来处理啊一些有用但非必须对象,对于软引用所作用的对象,当内存空间充足时,如果发生GC操作,软引用所作用的对象是不会被回收的,当空间 不足时,GC操作时软引用所作用的对象才会被回收
public static void softReferenceDemo(){<!--{C}%3C!%2D%2D%20%2D%2D%3E--> Object o = new Object(); ReferenceQueue <Object> referenceQueue = new ReferenceQueue <Object>(); SoftReference <Object> softReference = new SoftReference <Object>(o, referenceQueue); System.out.println(softReference.get()); System.out.println(softReference.isEnqueued()); System.out.println(referenceQueue.poll()); /** * java.lang.Object@4aa594e1 * false * null */ /** * 当对象被回收时,他会放入到referenceQueue实例中 */ //创建比较大的对象,模拟内存不足,触发GC,回收软引用对象 byte[] bytes = new byte[7*1024*1024]; System.gc(); //手动触发GC /** * 理论上空间不足,对象会被回收,队列中会有软引用对象 */ System.out.println(softReference.get()); System.out.println(softReference.isEnqueued()); System.out.println(referenceQueue.poll()); /** * java.lang.Object@4aa594e1 false null 空间充足,未回收 */ } public static void softReferenceDemo(){ Object o = new Object(); ReferenceQueue <Object> referenceQueue = new ReferenceQueue <Object>(); SoftReference <Object> softReference = new SoftReference <Object>(o, referenceQueue); System.out.println(softReference.get()); System.out.println(softReference.isEnqueued()); System.out.println(referenceQueue.poll()); /** * java.lang.Object@4aa594e1 * false * null */ /** * 当对象被回收时,他会放入到referenceQueue实例中 */ //创建比较大的对象,模拟内存不足,触发GC,回收软引用对象 byte[] bytes = new byte[7*1024*1024]; System.gc(); //手动触发GC /** * 理论上空间不足,对象会被回收,队列中会有软引用对象 */ System.out.println(softReference.get()); System.out.println(softReference.isEnqueued()); System.out.println(referenceQueue.poll()); /** * java.lang.Object@4aa594e1 false null 空间充足,未回收 */ }
弱(weak)引用
弱引用他的强度会比软引用更弱一些,被软引用所关联的对象,当发生GC操作时,无论当前空间是否充足,都会回收软引用所作用的对象,生命周期会更加短暂
public static void weakReferenceDemo(){ Object o = new Object(); ReferenceQueue <Object> referenceQueue = new ReferenceQueue <Object>(); WeakReference <Object> weakReference = new WeakReference<Object>(o, referenceQueue); System.out.println(weakReference.get()); System.out.println(weakReference.isEnqueued()); System.out.println(referenceQueue.poll()); System.gc(); //手动触发GC System.out.println(weakReference.get()); System.out.println(weakReference.isEnqueued()); System.out.println(referenceQueue.poll()); }
weakHashMap实现就是基于弱来实现的
虚引用
虚引用是最弱的引用关系,一个对象是否有虚引用的存在,不会影响对象的声明周期,虚引用存在的目的是当对象被回收时收到一个系统通知
public static void phantomferenceDemo(){ Object o = new Object(); ReferenceQueue <Object> referenceQueue = new ReferenceQueue <Object>(); PhantomReference <Object> phantomReference = new PhantomReference<Object>(o, referenceQueue); o = null; System.gc(); //手动触发GC if (phantomReference.isEnqueued()) { System.out.println("正在被回收"); } else { System.out.println("没有被回收"); } }
到此这篇关于Java中的WeakHashMap浅析的文章就介绍到这了,更多相关Java的WeakHashMap内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!