Java的引用类型(附图说明)

本文深入探讨Java中的四种引用类型:强引用、软引用、弱引用和虚引用的特点及应用场景。通过对每种引用类型的讲解,帮助读者理解它们如何影响内存管理和垃圾回收机制。

本章的主要内容来自:javaconceptoftheday 一小部分是自己整理的,英文OK的可以直接读原文

Java的一个优点是程序员不需要关心内存是如何被分配的,Java有一套自己的机制去管理它,程序员不需要考虑当对象不用时要释放该内存。垃圾回收器会有一套自己的算法去负责何时清理垃圾,我们无法控制垃圾回收器怎样回收垃圾,但我们能够通过灵活地使用Java的引用类型在一定程度上控制内存的分配。
Java引用类型分为

  1. Strong Reference(强引用)
  2. Soft Reference(软引用)
  3. Weak Reference( 弱引用)
  4. Phantom Reference(虚引用)

强引用

这种引用类型我们几乎每天都能看到(如果你在coding时),任何对象只要它是强引用,垃圾回收器就不会回收它,即使内存空间不足导致JVM抛出OutOfMemoryError错误以致程序异常退出。所以当你所创建的对象不再使用时最好给它置null(特别是嵌入式编程)例如,下述代码中的变量a就是强引用

class A{
    //class A
}
public class mainClass{

    public static void main(String[] args){

        //强引用
        A a = new A();  

        //告诉垃圾回收器a对象可以被回收了
        a = null;  
    }
}

看下面的图你会对对象在内存中如何被分配有更清晰的了解

这里写图片描述


软引用

软引用的对象一般不会被垃圾回收器回收,除非JVM非常需要内存。如果内存吃紧,软引用对象将会从内存中清除掉。下述代码向你展示如何创建一个软引用的对象

class A{
    //A class
}

class class MainClass{

    public static void main(String[] args){

        //强引用
        A a = new  A(); 

        //创建一个软引用对象,该对象指向变量a所指的对象
        SoftReference<A> softA = new SoftReferences<A>(a);

        //现在a变量置null了,但a对象不会被释放除非JVM非常需要内存
        a = null;    

        //你可以通过Reference.get()方法获取a对象
        a = softA.get();    
    }
}

下面的图会加深你对软引用的理解
这里写图片描述

注意:如果内存吃紧,软引用所指向的对象很可能被垃圾回收器回收,此时Reference.get()返回为null


弱引用

JVM会忽视弱引用,换句话说就是仅仅持有弱引用的对象是会被垃圾回收器回收的,下述代码向你展示了如何创建一个弱引用对象

class A{
    //A class
}

public class MainClass{

    public static void main(String[] args){

        //强引用
        A a = new A();  

        //创建一个弱引用,该引用持有a对象的引用
        WeakReference<A> weakA = new WeakReference<A>(a);

        //a变量置null
        a = null;

        //你可以通过Reference.get()方法来恢复a
        a = weakA.get();
    }
}

看下述图,你会对其有更深的理解

这里写图片描述


虚引用

被虚引用引用的对象垃圾回收器是能够回收对,但是,在回收对象前JVM会把它们放到一个叫 ‘reference queue’ 的队列。它们在调用finalize()方法后回进入reference queue,你不能通过虚引用来恢复对象,也就是说Reference.get()返回的总是null,下述代码向你展示了如何创建虚引用

class A{
    //A class
}

public class MainClass{

    public static void main(String[] args){

        //强引用
        A a = new A();  

        //创建一个引用队列
         ReferenceQueue<A> refQueue = new ReferenceQueue<A>();

        //创建一个虚引用,并指向a所指向的地方
        PhantomReference<A> phantomA = new PhantomReference<A>(a, refQueue);

         //现在a对象能被垃圾回收器回收,但是a对象在回收前会一直保持在refQueue队列中
        a = null;    

         //总是返回null
        a = phantomA.get();    
        }
    }
}   
### 创意医疗数据共享平台专利申请说明附图说明添加方法 #### 确定附图类型 针对创意医疗数据共享平台,可考虑绘制以下几种类型的附图: - **架构**:展示平台的整体架构,包括各个模块(如区块链模块、人工智能模块、数据存储模块、用户交互模块等)的组成和它们之间的连接关系。架构能清晰呈现平台的宏观结构,便于理解各部分的功能和协作方式。 - **流程**:描述平台的数据处理流程,如数据上传、存储、分析、共享等环节。流程有助于说明平台的工作逻辑和数据流向。 - **交互**:体现用户(医疗机构、患者、研究人员等)与平台之间的交互过程,例如用户如何进行数据上传、查询和下载等操作。交互能展示平台的用户体验和操作流程。 #### 绘制附图 - **使用专业绘工具**:如Visio、Lucidchart、Draw.io等。这些工具提供丰富的形元素和模板,可方便绘制各种类型的附图。以Visio为例,它具有强大的绘功能,能创建高质量、规范的技术纸。 - **遵循统一的绘规范**:保持附图的风格一致,包括形的形状、颜色、线条粗细等。标注要清晰、准确,使用统一的字体和字号。例如,对于架构中的各个模块,可以使用不同颜色进行区分,但颜色选择要遵循一定的逻辑和视觉美感。 #### 附图编号与命名 - **编号**:对每一幅附图进行编号,编号应连续且唯一。例如,1、2、3等。 - **命名**:为每幅附图赋予准确、简洁的名称,反映附图的主要内容。如“创意医疗数据共享平台架构”、“医疗数据上传流程”等。 #### 在说明书中插入附图说明 - **描述附图位置**:在说明书中明确指出附图的位置,一般在相应文字描述的附近插入附图说明。例如,在描述平台架构时,紧接着插入“如1所示,为创意医疗数据共享平台架构”。 - **详细说明附图内容**:对附图中的各个元素进行详细解释,包括形的含义、模块的功能、箭头的指向等。以架构为例,说明区块链模块、人工智能模块等的具体作用和它们之间的交互方式。 以下是一个简单的示例代码,用于生成一个基本的架构(使用Python的`graphviz`库): ```python from graphviz import Digraph dot = Digraph(comment='创意医疗数据共享平台架构') # 添加节点 dot.node('A', '区块链模块') dot.node('B', '人工智能模块') dot.node('C', '数据存储模块') dot.node('D', '用户交互模块') # 添加边 dot.edges([('A', 'C'), ('B', 'C'), ('D', 'A'), ('D', 'B'), ('D', 'C')]) # 保存为片 dot.render('platform_architecture.gv', view=True) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值