只有在
WeakReference weakReferencen=new WeakReference<>(new int[1024*1024]);
入参里定义才算弱引用。
如果是
int[] i=new int[1024*1024];
WeakReference weakReferencen=new WeakReference<>(i);
始终不会被回收。应为i是强引用。(为什么百度上的都说weakReferencen.get()可能返回空?难道jdk版本不对??????????????)
正确的做法是将i设置成null后,weakReferencen.get()才有可能是null
14行返回了0,说明weakReferencen.get()不等于null,弱引用数据不一致。
14行报了空指针,说明weakReferencen.get() ==null
在第一次和第二次之间进行了垃圾回收,所以第二次获取就肯定为空了
()例子:
VM-option:-Xms20M -Xmx20M
package com.example.test.threadLocal;
import java.lang.ref.WeakReference;
import java.util.stream.IntStream;
public class Test2 {
public static void main(String[] args)throws InterruptedException {
IntStream.range(1,100).forEach((is)->{
new Thread(()->{
// int[] i=new int[1024*1024];
WeakReference weakReferencen=new WeakReference<>(new int[1024*1024]);
int[] j =new int[1024];
try {
Thread.sleep(100);
}catch (InterruptedException e) {
e.printStackTrace();
}
int[] l =new int[1024];
System.gc();
System.out.println("若引用的值:"+weakReferencen.get()[0]);
}).start();
});
}
}
网友评论