强引用
- A a = new A();就是强引用
- 可以重写finalize来测试,当没有引用指向这个对象时,就会被回收
软引用
- 一个对象,如果是软引用指向它,那只有在内存不够用的情况下,才会回收它,内存够的情况下不会回收
- 设置jvm参数 -Xms20M -Xmx20M配合SoftReference来测试,堆内存不够了才会回收
- 软引用主要用作缓存
弱引用
- 只要遭遇到GC垃圾回收就会被回收
- 如果有一个强引用和一个弱引用同时指向一个对象,只要强引用消失,这个对象就会被回收
- 可以防止内存泄漏,一般用在容器中
- WeakHashMap:弱引用的Map
虚引用
- 当对象被回收,会向队列中仍进去一个值,通知你那个对象被回收了
- 一般用于写虚拟机,回收堆外内存的时候可以使用
ThreadLocal
- ThreadLocal是线程局部变量,里面的变量都是privat和static修饰的,set和get在线程之间是隔离开的,可以保证每个线程之间设置的值,是线程独有的
- ThreadLocal提供了线程的本地的实例,每个使用该变量的线程都会初始化一个完全独立的副本。
- 这个功能主要是由ThreadLocalMap实现的,这个map是在Thread中的属性,把使用的线程作为key值传入,所以可以做到线程独有
- 当一个线程结束时,它所使用的所有ThreadLocal对应的副本都会被回收。
- 根据以上特性,ThreadLocal可以用来做声明式事务
- 也就是在读取配置文件的时候,第一个线程把配置内容读取到ThreadLocal中,后面的线程可以直接从ThreadLocal里面拿,这样就可以保证读到的是同一个Connection
- ThreadLocalMap
- ThreadLocalMap使用了弱引用,为了防止线程等于null时,map的key引用依然指向ThreadLocal,这样会产生内存泄漏
- 但是key值变为null时,会导致整个value再也无法被访问,依然会造成内存泄漏,所以如果用了ThreadLocal一定要把它remove掉