解析Java对象引用与JVM自动内存管理

技术解析Java对象引用与JVM自动内存管理 解析Java对象引用与JVM自动内存管理对象引用应用程序设计接口是JDKTM1.2中新定义的。该应用程序设计接口允许应用程序以对象引用的方式与JVM的内存管

解析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

(0)

相关推荐

  • POSTGRESQL10.3 RPM包如何实现主从搭建

    技术POSTGRESQL10.3 RPM包如何实现主从搭建这篇文章主要介绍POSTGRESQL10.3 RPM包如何实现主从搭建,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、POSTGRE

    攻略 2021年11月16日
  • java如何简单快速处理 json 中的数据

    技术java如何简单快速处理 json 中的数据java如何简单快速处理 json 中的数据,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。JSONstr.j

    攻略 2021年12月2日
  • C++怎么正确使用线程

    技术C++怎么正确使用线程这篇文章主要介绍“C++怎么正确使用线程”,在日常操作中,相信很多人在C++怎么正确使用线程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++怎么正确使用线程”

    攻略 2021年11月25日
  • java Socket多线程服务器源代码是怎样的

    技术java Socket多线程服务器源代码是怎样的今天就跟大家聊聊有关java Socket多线程服务器源代码是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收

    攻略 2021年11月21日
  • python里turtle画随机点的分布图(python在地图上画路线)

    技术Python如何根据站点列表绘制站坐标全球分布图本篇内容主要讲解“Python如何根据站点列表绘制站坐标全球分布图”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Pytho

    攻略 2021年12月16日
  • html css js是什么

    技术html css js是什么本篇内容主要讲解“html css js是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“html css js是什么”吧!最准确的网页设计

    攻略 2021年12月10日