一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情。
Java·引用
1. Java中引用的简介
Java虚拟机很好地摒弃了指针地概念,通过垃圾回收器回收无用的对象,从而不用程序员手动去释放内存。 而关于引用API的出现为了让程序员创建所需要声明周期的内存对象,
2. Java中引用的分类
- 强引用
强引用对象的特点是永不回收,即使启动了垃圾回收器也不会回收这种引用的对象。
- 弱引用
弱引用对象的特点是垃圾回收器运行时会对此引用对象进行回收。
- 虚引用
虚引用对象的特点是无法确定此对象的存活时间。
- 软引用
软引用对象的特点是当内存不足时会对此对象进行回收。
3. 案例
- 强引用
案例一:强引用对象不会被垃圾回收器回收,进而导致内存溢出
public class Demo1 {
public static void main(String[] args) {
List<StringBuffer> stringBufferList = new ArrayList<StringBuffer>();
while(true){
StringBuffer stringBuffer = new StringBuffer();
for(int i = 0 ; i < 10000 ; i++){
stringBuffer.append(i);
}
stringBufferList.add(stringBuffer);
}
}
}
- 弱引用
案例二:当垃圾回收器运行时,弱引用对象会被垃圾回收器回收
public class Demo2 {
public static void main(String[] args) {
WeakReference<String> weakReference = new WeakReference<String>(new String("2"));
System.out.println(weakReference.get());
System.gc(); // 此处只是向JVM发出垃圾回收的请求,并不保证每次都能执行
System.out.println(weakReference.get());
}
}
- 软引用
案例三:让内存不足时,软引用对象会被垃圾回收器回收,建议与案例一做对比
public class Demo3 {
public static void main(String[] args) {
SoftReference<List<StringBuffer>> listSoftReference = new SoftReference<List<StringBuffer>>(new ArrayList<StringBuffer>());
while(true){
StringBuffer stringBuffer = new StringBuffer();
for(int i = 0 ; i < 10000 ; i++){
stringBuffer.append(i);
}
listSoftReference.get().add(stringBuffer);
}
}
}
4.ReferenceQueue
ReferenceQueue此类的出现主要是为了解决各种引用的回收,即我们创建的对象小时候,对这些对象的强引用,弱引用等各类引用依然占据内存,所以此类的出现是在创建这些引用时,在某些时刻进行回收。