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)联合
使用。当垃
圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是
否已经加入了虚引用,来了解
被引用的对象是否将要被垃圾回收。程序如果发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。
分享到:
相关推荐
在JDK 1.2之后,Java引入了四种不同强度的引用类型:强引用、软引用、弱引用和虚引用。它们按照从强到弱的顺序排列: 1. 强引用:最常见的引用类型,只要强引用存在,垃圾收集器就不会回收对象。除非显式设置为null...
JVM是一种抽象的计算机,它有自己的指令集并使用各种类型的内存区域。在JVM内存模型中,有几个关键的部分: 1. 堆(Heap):所有类实例和数组对象的存储区。堆是垃圾回收的主要区域。堆空间可以进一步细分为年轻代...
垃圾回收机制中还涉及了对象的引用类型,包括强引用、软引用、弱引用和虚引用。强引用是常见的引用,只要对象存在强引用,垃圾回收器不会回收它。软引用用于描述一些还有用但非必须的对象,在内存不足时会被回收。弱...
Jvm 对象内存分配有两种方式: 1. 指针碰撞(Bump the Pointer):在 Java 堆中内存是绝对规整的,所有用过的内存都放在了一边,空闲的内存放在另外一边,中间放一个指针作为分界点的指示器,那所分配的内存就仅仅...
7. 安全管理:JVM执行严格的类型检查和权限控制,确保代码的安全性。 8. 调优工具:如JVisualVM、JConsole等,帮助开发者监控和调整JVM的性能。 了解JVM源码可以帮助我们深入理解Java程序的运行过程,优化内存使用...
在这个例子中,`T`代表类型参数,它可以是任何引用类型。当我们创建一个`Pair`对象时,我们需要指定类型参数`T`的具体类型。例如: ```java Pair<String> pair1 = new Pair("Hello", "World"); ``` 这里,`String`...
Java的4种引用类型: 他们分别是强引用(StrongReference),软引用(SoftReference),弱引用(WeakReference)以及PhantomReference(虚引用),他们被 GC回收的可能性从小到大排列。 强引用(StrongReference) 只要强引用...
了解Java对象引用类型、垃圾回收算法以及分代处理垃圾的概念是进行JVM性能调优的基础。这些知识点对于准备Java面试的开发者来说,是必须掌握的重要内容,同时也是深入理解JVM内存管理和性能优化的基础。
在Java虚拟机中,数据类型主要分为两大类:基本类型和引用类型。 1. **基本类型**:包括`byte`、`short`、`int`、`long`、`char`、`float`、`double`和`boolean`。这些类型直接存储具体的值,例如整数值、浮点数等...
Java 中的引用类型对象可以分为四种:强引用、软引用、弱引用和虚引用。强引用是 Java 中最常用的引用类型,垃圾回收器不会回收强引用的对象。软引用是指在垃圾回收时,虚拟机根据系统剩余内存来决定是否回收软引用...
5. **对象创建与访问指令**:`new`用于创建一个新的对象实例,`aload`和`astore`用于对象引用的加载和存储,`getfield`和`putfield`用于读写对象字段,`invokevirtual`、`invokespecial`、`invokestatic`、`invoke...
* 装载:装载是指读入二进制的Java类型(class文件)到Java虚拟机中,并形成一定的数据结构(数据结构可理解为存储类中局部变量、方法等类属性的一种方式)。 * 连接:连接是指把读入的类型数据合并到虚拟机运行状态...
4. **设置对象头**:对象创建完成后,JVM需要为对象设置必要的标志位,如哈希码、GC年龄等信息,并将对象的类型指针指向它的类元数据,以便于JVM确定该对象的实例类型。 通过以上步骤,JVM完成了对象的创建过程。...
栈内存用于存放基本类型变量和对象的引用变量,而堆内存用于存放由 new 创建的对象和数组。堆的优势是可以动态分配内存大小,生存期也不必事先告诉编译器,但缺点是要在运行时动态分配内存,存取速度较慢。 JVM ...
4. **解析**:此时,JVM将常量池中的符号引用转换为直接引用。这个阶段不是必需的,可以在类或接口被首次使用时动态解析。 5. **初始化**:最后,JVM执行类的初始化方法(),这包括静态变量的初始化和静态代码块的...
- **对象引用**: - `object`:指向一个Java对象的4字节引用。在某些实现中,这个引用包含指向该对象的方法表和数据区的指针。 - **返回地址**: - `returnAddress`:4字节的数据,用于处理`jsr/ret`和`jsr-w/ret...