Java基础
内存泄露和内存溢出
- List item
强引用,软引用,弱引用,虚引用
强引用 strong reference
最常见的普通对象引用,比如new一个对象,只要强引用存在,就代表对象还活着,就不会发生垃圾回收;
软引用 soft reference
当内存空间足够的时候,不会回收,只有当即将抛出oom的时候才会回收,且会优先回收长时间闲置的对象。
soft reference可以用来实现内存敏感的缓存场景。比如内存足够的时候,就暂时缓存一些业务场景需要的数据,内存不足的时候就清理掉。这样就能够在使用缓存提高性能的同时,也不会导致耗尽内存。
Object obj = new Object();
SoftReference<Object> sf = new SoftReference<Object>(obj);
obj = null;
//有时候会返回null,所以在使用的时候,需要判别是否是null
sf.get();
弱引用 weak reference
弱引用和软引用最大的区别就是弱引用的对象的生命周期更短,只要发生垃圾回收,就会回收它。
一般也用在需要缓存的场景
Object obj = new Object();
WeakReference<Object> wf = new WeakReference<Object>(obj);
obj = null;
//有时候会返回null
wf.get();
//返回是否被垃圾回收器标记为即将回收的垃圾
wf.isEnQueued();
虚引用 phanton reference
并不会决定对象的生命周期,和没有任何引用是一样的。不能通过它来访问对象,用get方法返回的是null,一般用来检查对象是否从内存中删除。
Object obj = new Object();
PhantomReference<Object> pf = new PhantomReference<Object>(obj);
obj=null;
//永远返回null
pf.get();
//返回是否从内存中已经删除
pf.isEnQueued();