说一下TreadLocal,深拷贝和浅拷, 强引用,软引用,弱引用和虚引用

ThreadLocal 是什么?有哪些使用场景?

线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java提供ThreadLocal类来支持线程局部变量,是一种实现线程安全的方式

  1. ThreadLocal 是java中所提供的线程本地存储机制,可以利用该机制将数据缓存在某个线程内部,该线程可以在任意时刻,任意方法中获取缓存的数据。
  2. Thread Local 底层是通过ThreadLocalMap来实现的,每个Thread对象中都存在一个ThraedLocalMap,Map的key为ThreadLocal对象,Map的value为所需要缓存的值。
  3. 如果在线程池中使用ThreadLocal会造成内存泄漏,因为当ThreadLocal对象在使用完之后,应该要把设置的key,value,也就是Entry对象进行回收,但线程池中的线程不会回收,而线程对象是通过强引用指向ThreadLocalMap,ThreadLocalMap也是通过强引用指向Entry对象,线程不被回收,Entry对象也就不会被回收,从而出现线程泄露,解决办法是,在使用了ThreadLocal对象之后,手动调用ThreadLocal的remove方法,手动清除Entry对象。

深拷贝和浅拷贝区别是什么?

  1. 浅拷贝只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化,这就是浅拷贝(例:assign())
  2. 深拷贝是将对象及值复制过来,两个对象修改其中任意的值另一个值不会改变,这就是深拷贝(例:JSON.parse()和JSON.stringify(),但是此方法无法复制函数类型)

强引用,软引用,弱引用和虚引用

不同的引用类型,主要体现的是对象不同的可达性(reachable)状态和对垃圾收集的影响。

强引用:

强引用类就是指在代码中普遍存在的,类似于Object object = new Object();只要强引用还在,垃圾回收器就永远不会回收被引用的对象,即使发生OOM,如果没有其他引用关系,只要超过了引用的作用于或者显式的将相应引用赋值为null,就可以被垃圾回收器回收掉。

软引用:

软引用是用来描述一些还有用但是非必须的对象。软引用可以让对象豁免一些垃圾回收,只有当JVM内存不足时,才会回收掉软引用指向的对象,JVM会确保抛出OOM之前回收掉软引用指向的对象,如果这次回收后还是没有足够的内存,JVM将会抛出OOM。软引用通常来实现内存敏感的缓存数据,如果还有空闲内存,就可以暂时保留缓存,如果内存不足时,清理掉缓存,这样就 保证了使用缓存的同时不会耗尽内存。使用SoftReference类来实现软引用。

弱引用:

弱引用也是用来描述非必须对象的,但是强度比软引用更弱一些。被软引用关联的对象只能活到下次垃圾收集前。无论当前内存是否充足,都会回收掉弱引用关联的对象。使用WeakReference类来实现弱引用。

虚引用:

虚引用是一种最弱的引用关系,一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例(获取到的是null)。虚引用的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。有人利用幻象引用监控对象的创建和销毁。提供了PhantomReference类来实现虚引用

你可能感兴趣的:(Spring,jvm,java,算法)