正常来说,传统的JAVA引用,如
public void doSomeThing(){
User user = new User();
...
}
当方法doSomeThing方法结束时,对象user的引用丢失,其所占的空间将由JVM在下次垃圾回收时收回.如果我们将user对象的引用保存在一个全局的HashMap中,如
Map map = new HashMap();
public void doSomeThing(){
User user = new User();
map.put("user",user);
}
此时,user对象由于在map中保存了引用,只要这个引用存在,那么JVM永远也不会收回user对象所占用的内存.
这样的内存管理机制相信大家都耳熟能详了,在绝大多数情况下,这种解决方案都是非常完美的.但在某些情况下,却有些不便.好比如对于缓存而言,当user对象使用之后,我们希望保留其引用以供下次需要的时候可以重复使用,但又不希望其引用一直存在,如果那样,随着时间的推移,有限的空间将会被这些数据消耗殆尽.最好的方式莫过于一种方式,可以在对象没有被垃圾回收器回收之前依然可以访问,当垃圾回收器启动时,如果此对象没有其它对象引用,则按常规对其进行回收.
SoftReference,WeakReference与PhantomReference为上面的思路提供了有力支持.
这三种类型的引用属于"非持续性引用",也就是说,这种引用关系并非持续存在,它们所代表的引用的生命周期与JVM的运行密切相关,而并非传统意义上的引用一样依赖于编码阶段的预先规划.
SoftReference的例子:
Java代码
SoftReference ref;
public void doSomeThing(){
User user = new User();
ref = new SoftReference(user);
}
public void doAnotherThing(){
User user = (User)ref.get();//通过SoftReference获得对象引用
System.out.println(user.getName());
}
假设我们先执行了doSomeThing方法,产生了一个User对象,并为其创建了一个SoftReference引用.之后的某个时刻,我们调用了doAnotherThing方法,并通过SoftReference获取User对象的引用.此时我们是否还能取得user对象的引用?这要看JVM的运行情况.对于SoftReference而言,只有当目前内存不足的情况下,JVM在垃圾回收时才会收回其包含的引用(JVM并不是只有在内存不足的情况下才会启动垃圾回收器,具体什么时候启动得看具体版本JVM的垃圾回收策略).这里可能出现两种情况:
JVM目前还未出现过因内存不足所引起的垃圾回收,user对象的引用可以通过SoftReference从JVM Heap中收回.
JVM已经因为内存不足启动了垃圾回收机制,SoftReference所包含的user对象的引用被JVM所废弃.此时ref.get方法将返回一个空引用(null),对于上面的代码而言,也就意味着这里可能抛出一个NullPointerException.
WeakReference比SoftReference在引用的维持性上来看更加微弱.无需等到内存不足的情况,只要JVM启动了垃圾回收机制,那么WeakReference所对应的对象就将被JVM回收.也就是说,相对SoftReference而言,WeakReference被JVM回收的概率更大.
PhantomReference 比WeakReference 的引用维持性更弱.与WeakReference 和SoftReference不同,PhantomReference所引用的对象几乎无法被回收重用.它指向的对象实际上已经被JVM销毁(finalize方法已经被执行),只是暂时还没被垃圾回收器收回而已.PhantomReference主要用于辅助对象的销毁过程,在实际应用层研发中,几乎不会涉及.
分享到:
相关推荐
在Java编程语言中,引用是...总的来说,“java引用的demo”旨在帮助开发者掌握这四种引用类型,了解它们在内存管理和优化中的作用。通过实践和理解这些概念,开发者可以编写出更健壮、性能更优的Java或Android应用。
此外,对于Java虚拟机(JVM)的工作原理,了解方法引用的实现也对优化代码性能有一定帮助。 在阅读《深入浅出Java虚拟机》文档(可能包含的内容包括JVM内存模型、垃圾收集、类加载机制等)后,我们可以结合方法引用...
通过上述分析,我们可以清楚地了解到Java中引用和函数参数传递的基本概念以及它们的具体应用。了解这些概念对于正确使用Java进行编程非常重要,尤其是在处理复杂的数据结构和对象交互时。希望本文能帮助读者更好地...
在Java编程语言中,对象和引用的理解是至关重要的,它们构成了Java程序的基础。本文将深入探讨Java中的对象、引用以及它们之间的关系,并结合值传递的概念进行解析。 首先,我们需要理解什么是Java对象。在Java中,...
这个“java 引用相关文档”可能包含了深入探讨Java引用的各种类型及其特性的内容。在这里,我们将详细讲解Java中的四种引用类型:强引用、软引用、弱引用和虚引用,以及它们在内存管理和垃圾收集中的作用。 1. **强...
每种引用都有其特定的用途和生命周期,了解它们之间的区别对于优化应用程序的内存使用至关重要。 #### 二、强引用(Strong Reference) 强引用是最常用也是默认的引用类型。如果一个对象有一个强引用指向它,那么该...
这个压缩包"java调用Kettle引用jar包2.zip"很可能包含了一些示例代码和必要的库文件,帮助开发者学习如何在Java项目中调用Kettle。 首先,我们需要理解Kettle的核心组件:Job和Transformation。Job是一系列步骤的...
- **变量**:Java中的变量必须先声明后使用,可以是基本类型(如int、float)或引用类型(如对象)。 - **控制结构**:包括if-else语句、switch语句、for循环、while循环和do-while循环。 - **方法**:方法是Java...
了解Java中对象的传递方式和克隆机制对于编写高效、安全的代码至关重要。浅拷贝和深拷贝的选择取决于具体的应用场景,需要根据实际情况进行权衡。通过深入理解这些概念,开发者可以更好地利用Java的强大功能来构建高...
首先,我们要了解,在JDK1.2版本之前,Java中的引用只有强引用一种,也就是说,如果一个对象有一个强引用指向它,那么这个对象就不会被垃圾收集器回收,即使内存不足。从JDK1.2版本开始,Java引入了更多的引用类型,...
### Java是传值还是传址引用 #### 一、简单类型是按值传递的 Java在处理简单数据类型(如int、boolean等)时采用的是按值传递的方式。...- 了解这些概念有助于更深入地理解Java中的对象传递机制。
了解这些引用类型对于优化内存使用、防止内存泄漏以及合理地控制对象生命周期至关重要。 1. **强引用(Strong Reference)**: - 强引用是最常见的引用类型,当一个对象被强引用所指向时,即使系统内存不足,垃圾...
在Java编程语言中,了解值传递和引用传递的概念至关重要,因为它们直接影响到函数参数的处理方式。下面将详细探讨这两个概念及其区别。 首先,我们来理解什么是值传递。在Java中,基本数据类型(如int、double、...
多态性是Java引用类型的一个关键特性,允许你用父类引用指向子类对象。这使得代码更加灵活,能够处理不同类型的对象。例如: ```java Animal animal = new Dog(); // 父类引用指向子类实例 animal.eat(); // 调用...
在了解了Java引用类型后,我们可以通过实例来对内存回收有个认识。下面,我们创建公共类MyDate,它的作用是覆盖finalize()函数:在finalize()中输出打印信息,以便追踪。finalize()函数是在JVM回收内存时执行的,但...
### Java对象引用详解 #### 一、Java对象与引用的基本概念 在Java中,对象是类的一个实例,而引用则是指向这些对象的变量。...了解这些基础概念有助于更好地理解和设计Java程序,避免常见的错误和陷阱。
### 学习Java的第一步:深入了解Java虚拟机 在学习Java的过程中,首先需要掌握的核心概念之一就是Java虚拟机(Java Virtual Machine,简称JVM)。理解JVM的工作原理不仅有助于我们更高效地编写Java代码,还能帮助...
首先,我们需要了解Java和.NET平台之间的差异。Java运行在Java虚拟机(JVM)上,而.NET应用程序则依赖于微软的公共语言运行时(CLR)。要让.NET程序能够调用Java代码,我们需要一个中间桥梁,这就是IKVM.NET。 IKVM...
通过上述内容,我们可以了解到在Java中创建对象、初始化以及引用传递的基本流程和概念。对象是通过类创建出来的实例,而引用则是指向这些对象的指针。理解和掌握这些基本概念对于深入学习Java编程至关重要。此外,...
通过本文的介绍,我们可以了解到Java中面向对象的基本概念以及引用的工作原理。面向对象为Java提供了强大的抽象能力和代码组织方式,而引用则使得对象之间的交互变得简单高效。对于初学者来说,深刻理解这些概念是...