java对象的引用类型
-
强引用对象:
如果强引用对象一直在程序中持有,在垃圾回收时不会去释放清理,new 的对象都是强引用对象
-
软引用对象:
当内存不足时,垃圾回收时会去释放清理软引用对象
-
弱引用对象:
当垃圾回收时就会释放清理弱引用对象
-
虚引用对象:
不会影响对象生命周期,可以监控哪些对象被回收了
例:
@AllArgsConstructor
@NoArgsConstructor
public class MyUser {
private String username;
private String password;
}
public static void main(String[] args) throws Exception {
//强引用对象的创建
MyUser myUser = new MyUser();
//软引用对象的创建
SoftReference<MyUser> myUserSoftReference = new SoftReference<>(new MyUser());
//弱引用对象的创建
WeakReference<MyUser> myUserWeakReference = new WeakReference<>(new MyUser());
//虚引用对象的创建
ReferenceQueue<MyUser> myUserReferenceQueue = new ReferenceQueue<>();
PhantomReference<MyUser> myUserPhantomReference = new PhantomReference<>(new MyUser(), myUserReferenceQ
System.gc();
System.out.println("普通垃圾回收时:");
System.out.println("强引用对象 myUser --> "+myUser);
System.out.println("软引用对象 myUserSoftReference --> "+myUserSoftReference.get());
System.out.println("弱引用对象 myUserWeakReference --> "+myUserWeakReference.get());
System.out.println("虚引用对象 myUserPhantomReference --> "+myUserPhantomReference.get());
System.out.println("内存不够时:");
ArrayList<Object> objects = new ArrayList<>();
try {
while (true){
objects.add(new int[1024*1024*1024]);
}
}catch (Error e){
System.out.println("强引用对象 myUser --> "+myUser);
System.out.println("软引用对象 myUserSoftReference --> "+myUserSoftReference.get());
System.out.println("弱引用对象 myUserWeakReference --> "+myUserWeakReference.get());
System.out.println("虚引用对象 myUserPhantomReference --> "+myUserPhantomReference.get());
}
}
结果:
普通垃圾回收时:
强引用对象 myUser --> bean.MyUser@7cc355be
软引用对象 myUserSoftReference --> bean.MyUser@6e8cf4c6
弱引用对象 myUserWeakReference --> null
虚引用对象 myUserPhantomReference --> null
内存不够时:
强引用对象 myUser --> bean.MyUser@7cc355be
软引用对象 myUserSoftReference --> null
弱引用对象 myUserWeakReference --> null
虚引用对象 myUserPhantomReference --> null
Process finished with exit code 0