对于一个Java的对象而言,存储主要分为两种,一种是内存堆(Heap),内存堆是无序的,主要用来存放创建的Java对象;一种是内存栈(Stack),主要用来存放Java引用,然后在管理过程使用Java引用指向Java对象。

关于Reference引用的“那些事儿"

随着黄金梅丽号在大海之上的飘荡,一切看着是那么的风平浪静,但是每个人似乎都在忙着自己手里的那些事情....突然韦柏向萨博提出了一个问题:都知道JVM调优是当下从事Java开发必须要去具备甚至要去提升自己的一个重要环节,那你知道堆与栈,各自存放机制是什么?也就针对于这个问题,就像当初去探索世界尽头的梦想一样,萨博这样回答韦柏:对于一个Java的对象而言,存储主要分为两种,一种是内存堆(Heap),内存堆是无序的,主要用来存放创建的Java对象;一种是内存栈(Stack),主要用来存放Java引用,然后在管理过程使用Java引用指向Java对象。 听完萨博的回答,韦柏靠在甲板上,点燃了一支猩红的香烟,抽了一口,然后对萨博说道:那你能详细的讲解一下这个引用机制么?萨博思考了一下,于是有了以下的故事.......

GC[Garbage Collectors]的基本原理

在引入Reference引用的概念之前,我们需要清楚的知道内存栈(Stack)和内存堆(Heap)在JVM虚拟机的结构分布以及基本情况,如上图所示。综上所述,我们可以了解到Java的内存管理实际上就是对象的管理,包括对象实例的分配和释放。其中GC的存在就是负责在对象“不可达”的时候将对象回收处理。当系统在创建对象实例的时候,即当使用new关键字创建一个对象的时候,GC就开始监控对象的地址、大小以及使用状态。一般情况下,Java的GC机制都有特定的回收算法,GC通常会使用有向图的方式来记录队中的所有对象,通过此种方式确定甚至标记哪些对象是“可达的”,而哪些是“不可达的”。当GC判断一些对象不可达的时候,GC就有责任回收相关内存空间,是否能被垃圾回收机制回收,具体操作是取决于机器和平台,但判断依据主要是看对象是否有引用指向该对象。

Reference引用基本概述

Abstract base class for reference objects. This class defines the operations common to all reference objects. Because reference objects are implemented in close cooperation with the garbage collector, this class may not be subclassed directly.

不难发现,Reference机制对JVM的垃圾收集活动敏感,Reference的继承关系或者实现是由JDK定制,引用实例是由JVM创建,一般不推荐自行继承Reference实现自定义的引用类型,但是可以继承已经存在的引用类型。 JDK提供了强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference),引用队列(ReferenceQueue)以及析构引用(Final Reference)等引用类型。

[⚠️注意事项]:

强引用可能对垃圾收集活动是不敏感的

自行继承Reference实现自定义的引用类型,其反复造轮子的意义不大。

析构引用(Final Reference),它是一种特化的虚引用

不同JDK版本,需要注意实际源码的对比分析。 5.Reference是所有引用对象的基类

Reference引用类型分析

强引用(Strong Reference):在Java中最常见的就是强引用,也是最普遍存在的引用类型。处于可达状态,是不可能被垃圾回收机制回收的,即使该对象以后永远都不会被用到JVM也不会回收。

软引用(Soft Reference):对于只有软引用的对象来说,当系统内存足够时它不会被回收,当系统内存空间不足时它会被回收。软引用通常用在对内存敏感的程序中。

弱引用(Weak Reference):比软引用的生存期更短,对于只有弱引用的对象来说,只要垃圾回收机制一运行,不管JVM的内存空间是否足够,总会回收该对象占用的内存。 虚引用(Phantom Reference):不能单独使用,必须和引用队列联合使用。虚引用的主要作用是跟踪对象被垃圾回收的状态。 引用队列(ReferenceQueue): 析构引用(Final Reference):

[⚠️注意事项]:

强引用可能对垃圾收集活动是不敏感的,没有对应的类型表示,也就是说强引用是普遍存在的,如Object object = new Object();。

软引用、弱引用和虚引用都是java.lang.ref.Reference的直接子类。

直到JDK11为止,只存在四种引用,这些引用是由JVM创建,因此直接继承java.lang.ref.Reference创建自定义的引用类型是无效的,但是可以直接继承已经存在的引用类型,如java.lang.ref.Cleaner就是继承自java.lang.ref.PhantomReference。

特殊的java.lang.ref.Reference的子类java.lang.ref.FinalReference和Object#finalize()有关,java.lang.ref.Finalizer是java.lang.ref.FinalReference子类。

版权声明:本文为博主原创文章,遵循相关版权协议,如若转载或者分享请附上原文出处链接和链接来源。

java 引用机制_Java编程开发之浅析Java引用机制相关推荐

  1. java异步处理_Java编程开发好入门吗 消息队列的用途有哪些

    Java编程开发好入门吗?消息队列的用途有哪些?消息队列是指能够提供消息排队消费功能的软件程序,是消息队列中间件的一部分.消息队列中间件是分布式系统中重要的组件.接下来就给大家讲解消息队列的优势.类型 ...

  2. java 自幂数_JAVA 编程01:用JAVA语言实现所有自幂数的输出

    数学,是一门古老而又神奇的学问,它离不开数字:但数学也非常"霸道",古今中外,人世间.宇宙中,凡是和数字打交道的学问都包含数学的影子. 在数学领域,四则运算是最基础的也是最常用的运 ...

  3. java split()方法_Java编程性能优化一些事儿

    点击上方 "程序员小乐"关注, 星标或置顶一起成长 每天凌晨00点00分, 第一时间与你相约 每日英文 Smile and stop complaining about the t ...

  4. Java中文编程开发,让Java编写更加容易

    Java中文编程开发,让Java编写更加容易 目录 创建Java项目 创建类 编写方法 调用方法 Tips:文件必须以UTF-8格式保存才能够运行 1.创建Java项目 项目创建完成后,创建一个资源包 ...

  5. J2EE Java黑客大曝光:开发安全的Java应用程序

    J2EE Java黑客大曝光:开发安全的Java应用程序 本书首先从Java及J2EE体系结构和基本安全机制入手,阐述Java认证和授权服务.Java密码系统扩展和Java安全套接字扩展等安全包,书中 ...

  6. 视频教程-网络聊天室Java基础版(Socket_Swing编程)仿QQ聊天-Java

    网络聊天室Java基础版(Socket_Swing编程)仿QQ聊天 IT行业资深从业者,7年资深Java高级开发,Java架构师.曾就职银行.电信等行业多家上市公司.担任项目负责人,软件架构师.有丰富 ...

  7. java属性绑定_java基础:10.1 Java FX与属性绑定

    图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面. JavaFX作为Java新一代的GUI编程框架,受到Java ...

  8. java开发 职业技能_java编程开发程序员需要具备哪些职业技能

    随着互联网的不断发展,java编程开发可以说是目前学习人数和应用范围非常多的一种编程语言了,而今天我们就一起来了解一下,java编程开发程序员需要具备哪些职业技能. 1.数据结构和算法分析 数据结构和 ...

  9. java vector编程_Java编程开发中向量(Vector)及其应用

    要学习Java编程开发中向量及其应用方面的知识就要先了解什么是向量,向量是如何声明及初始化的,下面就让IT培训网专家来给大家详细介绍下如何认识向量及其使用方法吧! 关于向量的介绍: 向量 vector ...

  10. java面向字符的输入流_Java编程开发中面向字节的输入输出流

    关于面向字符的输入流和输出流方面教程已经讲解完了,下面要介绍的就是Java编程开发中面向字节的输入输出流,希望本节内容可以帮助大家更好的学习Java. 教程回顾点击查看: 字节流以字节为传输单位,用来 ...

最新文章

  1. The Apply method of function object
  2. 一步一步实现扫雷游戏(C语言实现)(三)
  3. R可视化绘制泊松分布(Poisson Distribution)
  4. golang for循环 使用多个变量
  5. [日常] Go语言圣经--Channel习题
  6. java进程调度怎么画图,[Java教程]进程调度的两种算法JAVA实现
  7. python移动文件中某个内容_如何在Python中移动文件
  8. chrome里面模拟手机上打开网页的场景方法
  9. 安徽省2012年下半年计算机水平考试(二级 c语言程序设计),安徽省计算机等级级考试真题C语言2012年12月.doc...
  10. JS--我发现,原来你是这样的JS:面向对象编程OOP[1]--(理解对象和对象属性类型)...
  11. SosoApi,编辑Swagger UI的神器
  12. 计算机专业复试离散数学,考研复试没头绪?计算机考研复试的同学看过来
  13. php导入rtf文件获取内容,可以使用PHP在网页中显示RTF文件吗?
  14. 非计算机专业,如何学习计算机视觉
  15. 仿支付宝输入密码界面
  16. Python爬虫:查国家安全信息库
  17. 如何实现Linux下的U盘(USB Mass Storage)驱动
  18. 湖北智禾教育:淘宝店铺如何找货源?
  19. 闪电连接算法之Python实现
  20. 1-1 基于黑金AX516开发板 fpga 按键点灯程序 #每周3例程坚持3个月激励计划#

热门文章

  1. 【滤波器】基于matlab GUI分数延迟滤波器设计【含Matlab源码 1347期】
  2. 【语音合成】基于matlab GUI语音合成【含Matlab源码 293期】
  3. 上海市二级c语言软件环境,上海市2019年9月计算机二级考试复习教程:(C语言)上机考试新版题库+全真模拟试卷(2本装)...
  4. 问题2:无法打开包括文件:“windows.h”:No such file or directory
  5. axure 鼠标样式_Axure教程:简单开关按钮的实现
  6. 苹果系统安装python环境_Mac下安装Python虚拟环境Virtualenv
  7. C语言读取文件输入输出
  8. 聊聊flink JobManager的High Availability
  9. 用技术——设计模式22——行为型模式——模板模式——待补充
  10. vue-cli中引入jquery的方法