弱引用,是为了告诉gc,如果内存不足的话,可以释放这个变量。
但是,就我的了解,变量就算不标记为弱引用,gc一样可以识别出某个变量已经没用,可以释放。
那干嘛还要人为去设置为弱引用呢?而且被设置为弱引用,还有可能变量突然被gc丢的情况,影响代码的逻辑咯?
弱引用,是为了告诉gc,如果内存不足的话,可以释放这个变量。
但是,就我的了解,变量就算不标记为弱引用,gc一样可以识别出某个变量已经没用,可以释放。
那干嘛还要人为去设置为弱引用呢?而且被设置为弱引用,还有可能变量突然被gc丢的情况,影响代码的逻辑咯?
java的引用分那么几类:
强引用: 一般new出的对象, 内存不足时, 如果还被引用, 也不会GC掉;
软引用: GC时如果内存不够, 就会GC掉;
弱引用: GC就干掉, 管他有内存够不够用;
虚引用: 甚至感觉不到他的存在;
看这个分类, 猜测为什么要设置引用分类, 可能就是为了在jvm不同状况下对内存管理的动态性和灵活性吧;
单例类
,利用一个类变量
存储多个线程
的参数设计一:
public class InstanceA {
private static Map<Thread, Object> map = new HashMap<>();
}
设计二:
public class InstanceA {
private static Map<Thread, Object> map = new ConcurrentHashMap<>();
}
设计三:
public class InstanceA {
private static Map<<WeakReference<Thread>>, Object> map = new ConcurrentHashMap<>();
}
Map
中key
为null
的value
设计四:
public class InstanceA {
private static ThreadLocal<Object> map = new ThreadLocal<>();
}
WeakReference
)弱引用,是为了告诉gc,这个变量没用了,下次可以释放。
并不是“因为要回收”所以才设置弱引用
弱引用的意思是:别人还在用我就留着,别人都不用了我就扔了。强引用和软引用都做不到这个效果
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
内存不够的时候
GC 直接回收弱引用,释放内存
没有弱引用,只有强引用的时候,就 OutOfMemoryException 了