java四大引用
- 强引用(StrongReference):程序代码中普遍存在的赋值,如Object obj = new Object();无论任何情况下,只要强引用还存在,垃圾收集器就永远不会回收掉被引用对象
- 软引用(SoftReference):定义SoftReference softReference = new SoftReference(所要引用的对象),该软引用是在java.lang.ref下的,如果要成功回收软引用,必须要进行第二次回收,就是内存要满的时候就会回收软引用
package EveryGCTest;
//参数:-XX:+UseParallelGC -XX:+PrintGCDetails -Xmx5m -Xms5m这里要依据你自己的回收内存而定,你自己设置让堆接近满的状态,让他自己回收
import java.lang.ref.*;
/**
* @author wang
* @create 2022-2022-30-18:32
*/
public class softReferenceTest {
static class User{
private int age;
public User(int age){
this.age = age;
}
@Override
public String toString(){
return this.age+"";
}
}
public static void main(String[] args) {
SoftReference softReference = new SoftReference(new User(1));
System.out.println("first:"+softReference.get());
System.gc();
// System.gc();
try {
byte [] bytes = new byte[4096*1024-1681*1024+1024*571];
}catch(RuntimeException e) {
e.printStackTrace();
}finally{
// System.gc();
System.out.println("seconde:" + softReference.get());
// System.out.println("third:" + softReference.get());
}
}
}
如果你主动调用两个System.gc()也是没有办法消除软引用的。
- 弱引用:WeakReference,被弱引用关联的对象只能活到下一次垃圾回收之前,当进行垃圾回收的时候,无论内存是否足够,弱引用都会被回收。
- 虚引用:是否存在不构成影响,也无法通过该虚引用来获取一个实例,虚引用的作用就是跟踪对象,然后再对象被回收的时候向系统发送一个消息。