学了这么久的Java,才知道Java的对象引用类型有4种。所以,赶紧把不知道的东西补上!
对于需要长期运行的应用程序来说,如果无用的对象所占用的内存空间不能得到即时的释放的话,那么在一个局部的时间段内便形成了事实上的内存泄露。
以前我们学过,如果要及时地释放内存,最稳妥的方法就是使用完对象之后,立刻执行"object=null"语句。当然,这也是一种理想状态。
JDK里面引入了4种对象引用类型,可以算是强行的调用System.gc()这个的垃圾回收的方法了。
强引用:前面我们用的全部对象都是强引用类型的。这个就显示地执行"object=null"语句。
软引用:被软引用的对象,如果内存空间足够,垃圾回收器是不会回收它的,如果内存空间不足,垃圾回收器将回收这些对象占用的内存空间。软件引用对应着java.lang.ref.SoftReference类,一个对象如果要被软引用,只需将其作为参数传入SoftReference类的构造方法中就行了。感觉还是比较简单而且容易理解。
弱引用:与前面的软引用相比,被弱引用了的对象拥有更短的内存时间(也就是生命周期)。垃圾回收器一旦发现了被弱引用的对象,不管当前内存空间是不是足够,都会回收它的内存,弱引用对应着java.lang.ref.WeakReference类,同样的道理。一个对象如果想被弱引用,只需将其作为参数传入WeakReference类的构造方法中就行了。
虚引用:虚引用不是一种真实可用的引用类型,完全可以视为一种“形同虚设”的引用类型。设计虚引用的目的在于结合引用关联队列,实现对对象引用关系的跟踪(太高科技了,这几句话。目前还不知道是什么意思)。虚引用对应着java.lang.ref.PhantomReference类。一个对象如果要被虚引用,只需将其作为参数传入PhantomReference类的构造方法中就行了,同时作为参数传入的还有引用关联队列java.lang.ref.ReferenceQueue的对象实例。(没懂)
SoftReference,WeakReference,PhantomReference类都继承自java.lang.ref.Reference抽象类。Reference抽象类定义了clear() 方法用于撤销引用关系,get()方法用于返回被引用的对象。
摘抄一段代码示例:
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.util.Set;
import java.util.HashSet;
public class TestReferences
{
public static void main(String[] args)
{
int length=10;
//创建length个MyObject对象的强引用
Set<MyObject> a = new HashSet<MyObject>();
for(int i = 0; i < length; i++)
{
MyObject ref=new MyObject("Hard_" + i);
System.out.println("创建强引用:" +ref);
a.add(ref);
}
//a=null;
System.gc();
//创建length个MyObject对象的软引用
Set<SoftReference<MyObject>> sa = new HashSet<SoftReference<MyObject>>();
for(int i = 0; i < length; i++)
{
SoftReference<MyObject> ref=new SoftReference<MyObject>(new MyObject("Soft_" + i));
System.out.println("创建软引用:" +ref.get());
sa.add(ref);
}
System.gc();
//创建length个MyObject对象的弱引用
Set<WeakReference<MyObject>> wa = new HashSet<WeakReference<MyObject>>();
for(int i = 0; i < length; i++)
{
WeakReference<MyObject> ref=new WeakReference<MyObject>(new MyObject("Weak_" + i));
System.out.println("创建弱引用:" +ref.get());
wa.add(ref);
}
System.gc();
//创建length个MyObject对象的虚引用
ReferenceQueue<MyObject> rq = new ReferenceQueue<MyObject>();
Set<PhantomReference<MyObject>> pa = new HashSet<PhantomReference<MyObject>>();
for(int i = 0; i < length; i++)
{
PhantomReference<MyObject> ref = new PhantomReference<MyObject>(new MyObject("Phantom_" + i), rq);
System.out.println("创建虚引用:" +ref.get());
pa.add(ref);
}
System.gc();
}
}
class MyObject
{
private String id;
public MyObject(String id)
{
this.id = id;
}
public String toString()
{
return id;
}
public void finalize()
{
System.out.println("回收对象:" + id);
}
}
分享到:
相关推荐
### Java中对象与引用 在Java编程中,深入理解对象与引用的概念对于掌握面向对象编程至关重要。本文将从以下几个方面详细解析对象与引用的基本概念及其相互间的关系。 #### 一、对象与引用的基础概念 **对象**: ...
引用类型是一种对象类型,包括数组、类和接口。引用类型的变量不直接存储值,而是存储对内存空间的引用,也就是地址。例如 MyDate today;这里的 today 变量存储的是对 MyDate 对象的引用,而不是实际的日期值。 在...
Java中的四种引用类型是Java内存管理的重要组成部分,它们分别是强引用(StrongReference)、软引用(SoftReference)、弱引用(WeakReference)和虚引用(PhantomReference)。每种引用类型具有不同的特点和用途,...
这是因为当你通过父类引用调用方法时,Java会根据实际对象的类型来执行相应的方法。 现在,让我们看一个具体的实例代码,这是基于提供的文件名`instanceoftest.java`和`Std.java`的假设内容: ```java // Std.java...
对象是类的一个实例,而对象引用则是用于访问该对象的一种手段。下面将详细探讨这两个概念。 #### 二、对象的创建过程 在Java中,当我们创建一个对象时,实际上是经历了几个步骤: 1. **创建对象**: `new`关键字...
而类作为一种类型,它是属于引用类型,所以 nemo 自然就是一个引用类型的变量即引用变量了啊。 关键的一点是,我们可以从不同的角度来看这一问题:宏观上,nemo 是对象;而微观上,深层的理解,nemo 是引用变量。 ...
这里的“值”指的是基本类型的实际值,以及对象引用的值。 1. **基本类型的参数传递**:当传递基本类型作为参数时,实际上传递的是这些基本类型的值的副本。这意味着在方法内部对这些值所做的任何更改都不会影响...
在Java中,为了更好地管理对象的生命周期,从JDK 1.2开始引入了四种不同级别的引用类型:强引用、软引用、弱引用和虚引用。每种引用类型都有其特定的应用场景,通过灵活运用这些引用类型,开发者可以在内存管理和...
向上转型是指将子类的对象引用赋值给父类的引用。在Java中,这是隐式转换,无需显式操作。例如: ```java class Animal { void eat() { System.out.println("Animal is eating"); } } class Dog extends ...
Java语言支持两种主要的数据类型:**值类型**和**引用类型**。值类型主要包括基本数据类型(如`int`, `float`等)及其对应的包装类(如`Integer`, `Float`)。引用类型则通常指类、数组或接口等对象类型。 ##### 1....
值类型的赋值操作会复制一个副本,而引用类型的赋值只是复制了指向同一对象的引用。 #### 示例解析 以文章中的例子为例: ```java Person person1 = new Person(""); Person person2 = person1; ``` 在这段代码...
Java的4种引用类型: 他们分别是强引用(StrongReference),软引用(SoftReference),弱引用(WeakReference)以及PhantomReference(虚引用),他们被 GC回收的可能性从小到大排列。 强引用(StrongReference) 只要强引用...
在Java编程语言中,理解和掌握引用、对象以及属性等数据类型知识是至关重要的。这些概念构成了Java程序的基础,让我们深入探讨一下。 1. 引用(References): 在Java中,引用是一种变量,它存储了对象在内存中的...
在Java编程语言中,上转型对象(Upcasting)是一种面向对象编程的概念,它涉及到将子类对象赋值给父类类型的引用。这种做法允许我们使用父类引用来调用子类对象的方法,从而实现多态性。在Java中,所有类都隐式地...
本篇文章将深入探讨一种被誉为“史上最牛逼”的Java对象转XML算法,以及它如何解决传统方法的不足。 在Java中,有多种方式可以实现对象到XML的转换,例如使用JAXB(Java Architecture for XML Binding)、DOM、SAX...
在Java中,引用类型主要包括对象引用(Object)、类引用(Class)、数组引用(Array)等。当我们需要在JNI中处理这些引用时,需要进行适当的转换。 1. 对象引用转换: 在Java层,我们可以创建一个对象实例,并将其...
通过上述四种引用类型的介绍,我们可以看到Java在对象引用管理方面提供了丰富的工具和支持。开发者可以根据自己的需求选择合适的引用类型,实现高效而灵活的对象生命周期管理。例如,在开发内存敏感的高速缓存应用时...
### Java对象引用详解 #### 一、Java对象与引用的基本概念 在Java中,对象是类的一个实例,而引用则是指向这些对象的变量。理解Java中的对象与引用之间的区别至关重要,因为这涉及到如何管理和操作对象。 #### 二...
这些引用类型通过`java.lang.ref`包中的`SoftReference`、`WeakReference`和`PhantomReference`类实现,而`ReferenceQueue`类用于与这三种引用类型一起工作,记录引用对象被回收的信息。 以下是一个简单的例子展示...
#### 一、Java对象、引用及创建过程 在Java中,对象是程序的基本单位,它包含了属性(成员变量)和行为(方法)。对象是由类创建出来的实例,而类则是一组具有相同属性和行为的对象的模板。 ##### 1. 对象创建与...