JAVA大白话之强引用、软引用、弱引用、虚引用

现在才发现,在学校里学的每一个一带而过的小知识点原来都大有文章,值得好好研究呀~
JAVA大白话之强引用、软引用、弱引用、虚引用_第1张图片

强引用:

只要某个对象有强引用与之关联、JVM必定不对回收这个对象,即使在JVM内存不足的情况下,JVM宁愿抛出OutOfMemory异常也不会回收对象
我们平时写的创建对象就是强引用、下面来看这个经典小例子

public void test() {
	List list = new ArrayList();
	String str = "S1amDuncan";
	Object[] abjArray = new Object[1000000000];
}

当程序调用test()方法时,虚拟机在内存分配两块空间,栈里存放三个引用型变量(存放对象在堆内存的地址),list、str、abjArray,堆里存放真正对象数据,
给list、str所引用的对象分配内存没有问题,到给abjArray所引用的对象分配内存时内存溢出,直接报错,阻断程序

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at reference.LearnReference.test(LearnReference.java:52)
	at reference.LearnReference.main(LearnReference.java:45)

list、str、abjArray都是局部变量,在test()方法执行结束后就消失了,堆中的对象就会失去引用而被JVM回收。
我们也可以将引用变量 = null,中断强引用和堆中对象之间的引用关系,JVM会在合适的时候回收该对象内存。

软引用(java.lang.ref.softReference):

对于弱引用关联着的对象,只有在内存不足的时候JVM才会回收该对象,可以用来解决OOM(OutOfMemory)问题、如网页缓存、图片缓存等

软引用可以和一个**引用队列(ReferenceQueue)**联合使用,如果软引用所引用对象被JVM回收,那么这个软引用就会被加入到与之关联的引用队列中。

你可能感兴趣的:(心得积累)