强引用
传统理解上的引用,Obeject obj = new ArrayList();
类似的引用,只要存在强引用关系,这个对象就不可能被gc,
注意:不会被gc是说持有引用的对象 与 被引用的对象直接的可达性是绝对的,不会被虚拟机干涉;如果持有引用的对象与GC root不可达的话,依然有可能会被GC
软引用
被软引用关联的对象,会在系统将要发生内存溢出异常之前会被纳入可被回收的对象之列,回收之后内存还不足,就会抛出内存溢出异常,不到万不得已,jvm不会动他
主要使用场景:内存敏感的缓存场景,一些对象池中
弱引用
若用的对象只能生存到下一次垃圾收集之前,弱引用不会干扰gc的判断,只要弱引用的对象愿意死亡被收集,这条弱引用就不会对gc有任何影响
使用场景很多,比如非静态内部类可以维持外部类的弱引用,访问外部类的数据,而不会影响外部类的生存时间,对于防止内存泄漏很有效
虚引用
严格来说不能称之为引用,这个引用不能访问对象的数据,也不能找到他,唯一的作用就是:当弱引用对象死亡时,持有引用方可以获得系统通知。用来跟踪对象是否被垃圾回收的活动。
解释通知:虚引用必须和引用队列(ReferenceQueue)联合使用,程序可以判断引用队列是否加入了虚引用,来了解对象是否被回收,然后可以采取一些必要的措施,比如进行内存回收动作,比如监视缓存,当缓存被回收时新建缓存
意义
在最佳实践的使用中,每个种引用都有他的存在意义,四种引用是jvmGC机制在Java语言层面的一种体现,四种引用是为了让程序员可以以代码的方式控制 对象在gc时的部分行为