华侨城网站建设,北滘企业网站开发,东莞哪家做网站很有名的公司,解析网站制作面试#xff1a;
1.强引用#xff0c;软引用#xff0c;弱引用#xff0c;虚引用分别是什么#xff1f;
2.软引用和弱引用适用的场景#xff1f;
3.你知道弱引用的话#xff0c;能谈谈WeakHashMap吗#xff1f;
目录
一、Java引用
1、强引用#xff08;默认支持模式…面试
1.强引用软引用弱引用虚引用分别是什么
2.软引用和弱引用适用的场景
3.你知道弱引用的话能谈谈WeakHashMap吗
目录
一、Java引用
1、强引用默认支持模式
2、软引用
3、弱引用
3.1、WeakHashMap
4、虚引用
4.1、引用队列 一、Java引用
整体架构 1、强引用默认支持模式 当内存不足JVM开始垃圾回收对于强引用的对象就算是出现了OOM也不会对该对象进行回收死都不收。 强引用是我们最常见的普通对象引用只要还有强引用指向一个对象就能表明对象还“活着”垃圾收集器不会碰这种对象。在Java中最常见的就是强引用把一个对象赋给一个引用变量这个引用变量就是一个强引用。当一个对象被强引用变量引用时它处于可达状态它是不可能被垃圾回收机制回收的即使该对象以后永远不会被用到JVM也不会回收。因此强引用是造成Java内存泄漏的主要原因之一。 对于一个普通的对象如果没有其它的引用关系只要超过了引用的作用域或者显式地相应强引用赋值为null一般认为就是可以被垃圾收集的了当然具体回收时机还是要看垃圾收集策略。
public static void main(String[] args) {Object o1 new Object();Object o2 o1;o1 null;System.gc();System.out.println(o2);System.out.println(o1);
}
2、软引用 软引用是一种相对强引用弱化了一些的引用需要用java.lang.ref.SoftReference类来实现可以让对象豁免一些垃圾收集。对于只有软引用的对象来说当系统内存充足时它不会被回收。当系统内存不足时它会被回收。 软引用通常用在对内存敏感的程序中比如高速缓存就有用到软引用内存够用的时候就保留不够用就回收
public static void main(String[] args) {softRefMemoryEnough();softRefMemoryNotEnough();//-Xms5m -Xmx5m -XX:PrintGCDetails
}/*** 内存够用的时候就保留不够用就回收*/
public static void softRefMemoryEnough() {Object o new Object();SoftReferenceObject softReference new SoftReference(o);System.out.println(o);System.out.println(softReference.get());o null;System.gc();System.out.println(o);System.out.println(softReference.get());
}/*** 内存不够用的时候就回收*/
public static void softRefMemoryNotEnough() {Object o new Object();SoftReferenceObject softReference new SoftReference(o);System.out.println(o);System.out.println(softReference.get());o null;try {byte[] bytes new byte[30 * 1024 * 1024];}catch (Throwable e){e.printStackTrace();}finally {System.out.println(o);System.out.println(softReference.get());}
}
3、弱引用 弱引用需要用java.lang.ref.WeakReference类来实现它比软引用的生存期更短对于只有弱引用的对象来说只要垃圾回收机制一运行不管JVM的内存空间是否够用都会回收该对象占用的内存。
public static void main(String[] args) {Object o new Object();WeakReferenceObject softReference new WeakReference(o);System.out.println(o);System.out.println(softReference.get());o null;System.gc();System.out.println(o);System.out.println(softReference.get());
}
//结果
//java.lang.Object15db9742
//java.lang.Object15db9742
//null
//null
使用场景
一、假如有一个应用需要读取大量的本地图片 1、如果每次读取图片都从硬盘读取则会严重影响性能 2、如果一次性全部加载到内存中又可能造成内存溢出。
此时使用软引用可以解决这个问题。 设计思路是用一个HashMap来保存图片的路径和相应图片对象关联的软引用之间的映射
关系在内存不足时JVM会自动回收这些缓存图片对象所占用的空间从而有效地避免了OOM的问题。
MapString,SoftReferenceBitmap imageCache new HashMap();
二、Mybatis源码底层使用软引用等。
三、你知道弱引用的话能谈谈WeakHashMap吗
3.1、WeakHashMap
public static void main(String[] args) {hashMap();System.out.println();weakHashMap();
}private static void hashMap() {HashMapInteger, String map new HashMapInteger, String();Integer key new Integer(1);String value HashMap;map.put(key, value);System.out.println(map);//{1HashMap}key null;System.out.println(map);//{1HashMap}System.gc();System.out.println(map \t map.size());//{1HashMap} 1
}private static void weakHashMap() {WeakHashMapInteger, String map new WeakHashMapInteger, String();Integer key new Integer(2);String value WeakHashMap;map.put(key, value);System.out.println(map);//{2WeakHashMap}key null;System.out.println(map);//{2WeakHashMap}System.gc();System.out.println(map \t map.size());//{} 0
}
4、虚引用 虚引用需要java.lang.ref.PhantomReference类来实现。 顾名思义就是形同虚设与其他几种引用都不同虚引用并不会决定对象的生命周期。 如果一个对象仅持有虚引用那么它就和没有任何引用一样在任何时候都可能被垃圾回收器回收它不能单独使用也不能通过它访问对象虚引用必须和引用队列ReferenceQueue联合使用。 虚引用的主要作用是跟踪对象被垃圾回收的状态。仅仅是提供了一种确保对象被finalize以后做某些事情的机制。PhantomReference的get方法总是返回null因此无法访问对应的引用对象。其意义在于说明一个对象已经进入finalization阶段可以被gc回收用来实现比finalization机制更灵活的回收操作。 换句话说设置虚引用关联的唯一目的就是在这个对象被收集器回收的时候收到一个系统通知或者后续添加进一步的处理。Java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。
public static void main(String[] args) {Object o new Object();ReferenceQueueObject referenceQueue new ReferenceQueue();PhantomReferenceObject phantomReference new PhantomReference(o, referenceQueue);System.out.println(o);System.out.println(phantomReference.get());System.out.println(referenceQueue.poll());System.out.println();o null;System.gc();System.out.println(o);System.out.println(phantomReference.get());System.out.println(referenceQueue.poll());
}
//
//java.lang.Object15db9742
//null
//null
//
//null
//null
//java.lang.ref.PhantomReference6d06d69cJava提供了4种引用类型在垃圾回收的时候都有自己各自的特点。 ReferenceQueue是用来配合引用工作的没有ReferenceQueue一样可以运行。 创建引用的时候可以指定关联的队列当GC释放对象内存的时候会将引用加入到引用队列如果程序发现某个虚引用已经被加入到引用队列那么就可以在所引用的对象的内存被回收之前采取必要的行动相当于是一种通知机制。 当关联的引用队列中有数据的时候意味着引用指向的堆内存中的对象被回收。通过这种方式JVM允许我们在对象被销毁后做一些我们自己想做的事情。
4.1、引用队列
public class ReferenceQueueT {
被回收前需要被引用队列保存下。
public static void main(String[] args) {Object o new Object();ReferenceQueueObject referenceQueue new ReferenceQueue();WeakReferenceObject weakReference new WeakReference(o, referenceQueue);System.out.println(o);System.out.println(weakReference.get());System.out.println(referenceQueue.poll());System.out.println();o null;System.gc();System.out.println(o);System.out.println(weakReference.get());System.out.println(referenceQueue.poll());
}
//结果
//java.lang.Object15db9742
//java.lang.Object15db9742
//null
//
//null
//null
//java.lang.ref.WeakReference6d06d69cJava 并发编程三大特性--volatile 一个程序员最重要的能力是写出高质量的代码 有道无术术尚可求也有术无道止于术。 无论你是年轻还是年长所有程序员都需要记住时刻努力学习新技术否则就会被时代抛弃