开发者学堂课程【Java 面试疑难点串讲1:面试技巧及语言基础:对象引用】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/24/detail/501
对象引用
内容介绍
一、内存分配
二、垃圾回收
一、内存分配
从 JDK 1.2 开始实际上就提出有四种引用关系:强引用、软引用、弱引用、虚引用。
很多的时候你可能并不需要你再去编写这样的代码,但是对于这些概念你必须清楚。
1、强引用:对象将一直被进行引用,即使出现了“OutOfMemeryError”错误信息。
package cn.mldn.demo;
public class TestRefDemo (
public static void main(String[] args) {
Object obj = new Object(); //实例化对象Object ref = obj;//强引用,默认的状态就属于强引用状态obj = null; //原始的对象断开引用,但是ref依然引用着System.gc();//垃圾收集
System.out.println(ref);
二、垃圾回收
1、软引用:
对象将被尽可能长时间的保存,一直到出现内存不足的情况下才会被回收,所以这样的操作很多时候将其用于缓存的开发上,
例如,在 MyBatis.里面就提供有对于软引用模式的缓存模式。
package cn.mldn.demo;
import java.lang.ref.SoftReference;
public class TestRefDemo {
public static void main(String[] args) {
Object obj = new Object(); //实例化对象//发生了一个软引用SoftReference<object> ref = new SoftReference<object>(obj);
obj = null ; //
断开连接System.gc();//进行垃圾收集System.out.println(ref.get());
注:如果说这个时候出现了内存不足的问题,那么才会进行回收,也就是说对象会尽可能的保存时间长一些。
2. 弱引用:
一旦有了垃圾收集操作之后就会进行回收。
package cn.mldn.demo;
import java.util.Map;
import java.util.WeakHashMap;
public class TestRefDemo {
public static void main(String[] args) {
String str = newString("极限IT") ;
0bject obj= new 0bject();//实例化对象Map<String,0bject> map= new WeakHashMap<String ,0bject>() ;
map.put(str, obj) ; //
追加了弱引用System.out.println("GC执行之前"+map.get(str));
str =
System.gc();
System.out.println("GC执行之后" + map.get(str));
3.虚引用(幽灵引用),这种操作返回的内容永远都是 null ,就是不引用;
package cn.mldn.demo;
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
public class TestRefDemo {
public static void main(String[] args) {
Object obj = new0bject();
ReferenceQueue<0bject> queue = new ReferenceQueue<0bject>();
PhantomReference<0bject> pr = new PhantomReference<0bject>(object)
System.gc();
System.out.println(pr·get());
注:在对象垃圾收集前一定会调用 finalize() 方法,但是如果说 finalize() 又占着其它的强引用的对象不放,那么我们就会出现一个逻辑上的死锁,所以这个时候就可以用引用来解决。