JVM 中将对象的引用分为了四种类型,不同的对象引用类型会造成GC 采用不同的方法进行回收:
1.强引用
默认情况下,对象采用的均为强引用,例如:
A a=null;
public void execute(){
a=new A();,
// 其他代码
}
只有当execute 所在的这个对象的实例没有其他对象引用,GC 时才会被回收。
2.软引用(Soft Reference)
软引用是Java 中提供的一种比较适合于缓存场景的应用,采用软引用修改之上的代码
如下:
SoftReference aRef=null;
A a=null;
public void execute(){
if((aRef==null)||(aRef.get()==null)){
a=new A();
aRef=new SoftReference(a);
}
else{
a=aRef.get();
}
// 执行代码
a=null;
}
代码中不同于强引用中的为在execute 方法的最后将a 设置为了null,当execute 方法执
行完毕后,a 对象只有在内存不够用的情况下才会被GC,这对于合理的使用缓存而言无疑
非常有作用,既可以保证不至于大量使用缓存出现OutOfMemory,又可以在内存够用的情
况下提升性能。
3.弱引用(WeakReference)
采用弱引用修改之上的代码如下:
WeakReference aRef=null;
A a=null;
public void execute(){
if((aRef==null)||(aRef.get()==null)){
a=new A();
aRef=new WeakReference(a);
}
else{
a=aRef.get();
}
// 执行代码
a=null;
}
对于a 这个引用,在GC 时a 一定会被GC 回收,这种引用有助于GC 更快的回收对象,
尤其是位于集合中的对象,同时也有助于在GC 未回收之前仍然调用此对象来执行一些动作。
4.虚引用(PhantomReference)
采用虚引用修改之上的代码如下:
ReferenceQueue aRefQueue=new ReferenceQueue();
PhantomReference aRef=null;
A a=null;
public void execute(){
a=new A();
aRef=new PhantomReference(a,aRefQueue);
// 执行代码
a=null;
}
在SoftReference 和WeakReference 中也可以放入ReferenceQueue,这个Queue 是用于
对象在被GC 后用于保存Reference 对象实例的,由于虚引用只是用来得知对象是否被GC,
通过PhantomReference.get 返回的永远是null,因此它要求必须有ReferenceQueue,当上面
代码中的a 对象被GC 后,通过aRefQueue.poll 可以获取到aRef 对象实例,从而可以做一些
需要的动作。
"虚引用"顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。
虚引用主要用来跟踪对象被垃圾回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合
使用。当垃
圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是
否已经加入了虚引用,来了解
被引用的对象是否将要被垃圾回收。程序如果发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。
分享到:
相关推荐
Java的4种引用类型: 他们分别是强引用(StrongReference),软引用(SoftReference),弱引用(WeakReference)以及PhantomReference(虚引用),他们被 GC回收的可能性从小到大排列。 强引用(StrongReference) 只要强引用...
Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在...
Java中的JVM基础可以分为两大类,即基本类型和引用类型。基本类型的变量保存原始值,而引用类型的变量保存引用值。基本类型包括byte、short、int、long、char、float、double、Boolean、returnAddress等,引用类型...
Java JVM 调优浅谈 Java 虚拟机(JVM)是 Java 语言的核心组件之一,...因为 Java 中没有指针的概念,程序运行永远都是在栈中进行的,因而参数传递时,只存在传递基本类型和对象引用的问题。不会直接传递对象本身。
* 引用链法:通过一种 GC ROOT 的对象(方法区中静态变量引用的对象等)来判断,如果有一条链能够到达 GC ROOT 就说明,不能到达 GC ROOT 就说明可以回收。 五、SafePoint SafePoint 是 JVM 中的一种机制,用于...
在需要将一个继承链下把一个类的对象转换为另一个类的对象(注意:这里强调转换的是对象而不是类),更确切地说其实应该是引用类型和对象类型不一致的时候考虑到对象类型转换 这里拓展一下引用和对象的区别 对象...
在 Java 中,引用类型分为强引用、软引用、弱引用和虚引用四种。强引用是我们最常用的引用类型,而软引用、弱引用和虚引用则是 Java 为我们提供的三种特殊的引用类型,它们可以和 GC 做交互,以满足不同的应用场景。...
JAVA 的五种引用类型及引用队列 在介绍 JAVA 的五种引用之前,先介绍一下什么是引用,以及引用和对象之间的关系 什么是引用 众所周知,JAVA 是一种面向对象的语言,在 JAVA 程序运行时,对象是存储在堆内存...
java有四种引用类型:强引用、软引用、弱引用、虚引用 四大引用设计作用 因为java的内存分配和内存回收,都是由JVM去负责,一个对象是否可以被回收,主要看是否有引用指向此对象,即可达性分析 设计目的: 可以让...
aconst_null 将null对象引用压入栈 iconst_m1 将int类型常量-1压入栈 iconst_0 将int类型常量0压入栈 iconst_1 将int类型常量1压入栈 iconst_2 将int类型常量2压入栈 iconst_3 将int类型常量3压入栈 iconst_4 将int...
第33讲 垃圾回收-判断对象是否存活算法-引用计数法详解 00:14:08 第34讲 垃圾回收-判断对象是否存活算法-可达性分析法详解 00:07:09 第35讲 垃圾回收算法-标记清除算法 00:04:36 第36讲 垃圾回收算法-...
在解析阶段,JVM会把符号引用替换为直接引用(对象的索引值)。例如:类中的一个字符串常量在class文件中时,存放在class文件常量池中的。在JVM加载完类之后,JVM会将这个字符串常量放到运行时常量池中,并在解析...
4. GC的两种判定方法:GC的两种判定方法是引用计数法和可达性分析法。 5. GC的三种收集方法:GC的三种收集方法是标记清除法、标记整理法、复制算法。 6. Minor GC和Full GC:Minor GC和Full GC是两种不同的GC类型。 ...
第33节垃圾回收-判断对象是否存活算法-引用计数法详解00:14:08分钟 | 第34节垃圾回收-判断对象是否存活算法-可达性分析法详解00:07:09分钟 | 第35节垃圾回收算法-标记清除算法00:04:36分钟 | 第36节垃圾回收算法-...
一, 垃圾回收机制 在系统运行过程中会产生一些无用的对象,这些对象一直占用内存,不清理这些无用的对象可能会导致内存...jvm会把虚拟机栈和本地方法栈中正在引用的对象、静态属性引用的对象和常量,作为 GC Roots。
Java 中有四种引用类型:强引用、软引用、弱引用、虚引用。强引用是普通的对象引用,软引用是 WeakReference 对象,弱引用是 WeakReference 对象,虚引用是 PhantomReference 对象。 5. 死锁 死锁是指两个或多个...
想必很多朋友对OOM(OutOfMemory)这个错误不会陌生,而当遇到这种错误如何有效地解决这个问题呢?今天我们就来说一下如何利用软引用和弱引用来有效...Java中提供这四种引用类型主要有两个目的:第一是可以让程序员通过
基本类型数组和引用类型的数组创建、读写 字符串常量,即String name = "hello, 世界" main方法中可以读取到命令行参数 对象字段读写、静态字段读写 方法重载、方法重写、接口方法调用、形参全部为int类型的static...
/ 44 3.2.1 引用计数算法 / 44 3.2.2 根搜索算法 / 46 3.2.3 再谈引用 / 47 3.2.4 生存还是死亡? / 48 3.2.5 回收方法区 / 50 3.3 垃圾收集算法 / 51 3.3.1 标记 -清除算法 / 51 3.3.2 复制算法 / 52 ...