解析Java对象引用和JVM自动内存管理。
JDKTM1.2中新定义了引用应用程序编程接口。该API允许应用程序以对象引用的形式与JVM的内存管理器进行交互。当应用程序需要在创建新的Java对象之前管理大量内存对象或删除原始对象时,Java对象引用应用程序编程接口有相当多的用途,例如:
基于Web的应用程序通常需要显示大量图片。当用户离开某个网页时,他们往往不确定是否能顺利返回。在这个程序中,Java对象引用API的应用程序可以创建一个环境,在这个环境中,当堆内存以最小的速度运行时,内存管理器会创建对象。当用户返回时,应用程序将重新加载创建的图片。
对象引用队列的应用程序可以创建一个环境,在该环境中,当通过对象引用获取对象时,应用程序会得到通知。然后,应用程序可以清除相关对象,并在内存管理器中将它们合法化。
内存管理器的工作机制。
下面将首先介绍未嵌入引用对象时内存管理器的工作机制,然后讨论添加引用对象后Java堆的变化。
内存管理器的功能是识别程序中不再使用的对象并回收它们的内存。
一个Java应用程序由一系列线程组成,每个线程执行一系列方法,每个方法通过参数或局部变量引用一个对象。这些引用是引用集合的一部分,直接转到应用程序。此外,引用集合还包括类库中定义的静态引用变量以及通过Java本地接口(JNI)API获得的引用。引用集合中的所有被引用对象都可以由当前应用程序获取,而无需回收。类似地,这些对象可能包含对其他对象的引用,或者它们可能被应用程序获取,等等。Java堆中的其他对象被认为是不可访问的,所有这些不可访问的对象在内存管理中也是合法的。如果一个不可用的对象使用finalize()方法,任务将被移交给该对象调用的终结器。在内存回收过程中,没有关闭器的不可访问对象和已经调用关闭器的对象被简单地回收。
内存回收的算法是不断变化的,共同的方面是从引用集中识别可获取的对象,回收其他对象占用的内存空间。
添加引用对象后的引用与常规引用的区别在于引用对象中的引用是由内存管理器专门处理的。引用封装了其他对象的引用,我们称之为指示性对象。创建参考对象时,定义参考对象的指示器对象。
Java对象引用
图1显示了对象引用应用程序设计界面中定义的类层次结构。其中SoftReference类、WeakReference类和PhantomReference类分别定义了三种引用对象和三种相应的获取对象的能力。因此,按照从强到弱的顺序,对象的可达性可以分为以下五种类型:强可达、软可达、弱可达、幻可达和不可达。
图1对象应用程序的类层次结构。
根据应用需求,对象可以是强引用、软引用、弱引用和幻影引用的任意组合。为了确定对象的可用性,JVM内存管理器从引用集合中搜索堆中对象的所有路径。当一个对象的任何路径都不包含参考对象时,就说这个对象具有很强的获取能力。当路径包含一个或多个参考对象时,根据内存管理器查询的参考对象类型,分为二次获取、弱获取和虚拟获取。
此外,引用对象队列(java.lang.ref.ReferenceQueue)也是在对象引用API中定义的,这是内存管理器管理引用对象的简单数据结构。值得注意的是,在定义引用对象时,必须在引用对象队列中生成幻影引用对象,而软引用和弱引用对象没有此限制,例如:
reference queue queue=new reference queue();
PhantomReference pr=new PhantomReference(对象,队列);
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/61502.html