Java引用


前言

垃圾回收的机制主要是看对象是否有引用指向该对象。
java对象的引用包括
  强引用,软引用,弱引用,虚引用

1、强引用

 强引用有引用变量指向时永远不会被垃圾回收,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。

当运行至Object[] objArr = new Object[1000];这句时,如果内存不足,JVM会抛出OOM错误也不会回收object指向的对象。不过要注意的是,当fun1运行完之后,object和objArr都已经不存在了,所以它们指向的对象都会被JVM回收。

1
2
3
4
5
6
7
8
9
public static void main(String[] args) {  
  new Main().fun1();  
 }  
       
public void fun1() {  
Object object = new Object();  
  Object[] objArr = new Object[1000];  
}  

2、软引用(SoftReference)

如果一个对象具有软引用,内存空间足够,垃圾回收器就不会回收它;
如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。


软引用可用来实现内存敏感的高速缓存,比如网页缓存、图片缓存等。使用软引用能防止内存泄露,增强程序的健壮性。   

SoftReference的特点是它的一个实例保存对一个Java对象的软引用, 该软引用的存在不妨碍垃圾收集线程对该Java对象的回收。
也就是说,一旦SoftReference保存了对一个Java对象的软引用后,在垃圾线程对 这个Java对象回收前,SoftReference类所提供的get()方法返回Java对象的强引用。
另外,一旦垃圾线程回收该Java对象之 后,get()方法将返回null。

3、弱引用(WeakReference)

  
  弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类来表示。

4、虚引用(PhantomReference)

  虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。
  要注意的是,虚引用必须和引用队列关联使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。


Author: jony
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source jony !
 Previous
内存分配和回收策略以及虚拟机参数配置 内存分配和回收策略以及虚拟机参数配置
前言1、对象优先在Eden分配(如果小于Survivor,先进入Survivor)复制算法还记得吧,就是说的商业虚拟机关于新生代的垃圾收集就是采用的复制算法 将内存分为3分分别为8:1;1 那么Eden 就代表着8份 123456789
2018-04-09
Next 
垃圾收集器 垃圾收集器
前言垃圾收集器GC ,同通常需要考虑3个事情 1、那些内存需要回收 2、什么时候回收 3、如何回收 1、不需要回收的 程序计时器,虚拟机栈,本地方法栈这3个区域都是线程所私有的,随着线程而生,而死。 关于栈的话,基本上就是在运行方
2018-04-09
  TOC