动力节点Java培训最新上线Java实验班,等你来测试自己适不适合学习Java编程哦!

Java类型一般有两种,即基本数据类型与引用数据类型。其中,引用数据类型在存储堆中对需要引用的对象进行引用,引用是Java面向对象的一个特点,在Java入门中,我们会接触到四种Java的引用类型,接下来就说说这四种Java引用类型有哪些吧:

1、Java中有哪几种引用?它们的含义和区别是什么?

  从JDK1.2开始,Java中的引用类型分为四种,分别是:

①强引用(StrongReference)

②软引用(SoftRefernce)

③弱引用(WeakReference)

④虚引用(PhantomReference)

  强引用-StrongReference

  这种引用是平时开发中最常用的,例如Stringstrong=newString("StrongReference"),当一个实例对象具有强引用时,垃圾回收器不会回收该对象,当内存不足时,宁愿抛出OutOfMemeryError异常也不会通过回收强引用的对象,因为JVM认为强引用的对象是用户正在使用的对象,它无法分辨出到底该回收哪个,强行回收有可能导致系统严重错误。

  软引用-SoftReference

  如果一个对象只有软引用,那么只有当内存不足时,JVM才会去回收该对象,其他情况不会回收。软引用可以结合ReferenceQueue来使用,当由于系统内存不足,导致软引用的对象被回收了,JVM会把这个软引用加入到与之相关联的ReferenceQueue中。

ReferenceQueuereferenceQueue=newReferenceQueue();

SoftReference<Book>softReference=newSoftReference<>(newBook(),referenceQueue);

Bookbook=softReference.get();

Referencereference=referenceQueue.poll();

  当系统内存不足时,触发gc,这个Book就会被回收,reference将不为null。

  弱引用-WeakReference

  只有弱引用的对象,当JVM触发gc时,就会回收该对象。与软引用不同的是,不管是否内存不足,弱引用都会被回收。弱引用可以结合ReferenceQueue来使用,当由于系统触发gc,导致软引用的对象被回收了,JVM会把这个弱引用加入到与之相关联的ReferenceQueue中,不过由于垃圾收集器线程的优先级很低,所以弱引用不一定会被很快回收。下面通过一个主动触发gc的例子来验证此结论。

ReferenceQueuereferenceQueue=newReferenceQueue();

WeakReference<Book>weakReference=newWeakReference(newBook(),referenceQueue);

Bookbook=softReference.get();

System.gc();

//Runtime.getRuntime().gc();

Referencereference=referenceQueue.poll();

  当然这不是每次都能复现,因为我们调用System.gc()只是告诉JVM该回收垃圾了,但是它什么时候做还是不一定的,但就我测试来看,只要多写几次System.gc(),复现的概率还是很高的。

  虚引用-PhantomReference

  如果一个对象只有虚引用在引用它,垃圾回收器是可以在任意时候对其进行回收的,虚引用主要用来跟踪对象被垃圾回收器回收的活动,当被回收时,JVM会把这个弱引用加入到与之相关联的ReferenceQueue中。与软引用和弱引用不同的是,虚引用必须有一个与之关联的ReferenceQueue,通过phantomReference.get()得到的值为null,试想一下,如果没有ReferenceQueue与之关联还有什么存在的价值呢?

PhantomReference<Book>phantomReference=newPhantomReference<>(newBook(),referenceQueue);

Bookbook=phantomReference.get();//此值为null

Referencereference=referenceQueue.poll();

Java引用类型有哪些相关推荐

  1. 【Java 虚拟机原理】Java 引用类型 ( 强引用 | 软引用 | 弱引用 | 虚引用 | 静态变量 )

    文章目录 一.静态变量 二. Java 引用类型 ( 强.软.弱.虚 ) 一.静态变量 GC Root 对象 : 线程栈 中的 栈帧 中的 局部变量表 中的 引用对象 ; 方法区 中的 静态引用对象 ...

  2. 【Android 内存优化】Java 引用类型 ( 强引用 | 软引用 | 弱引用 | 虚引用 )

    文章目录 一. Java 引用类型 ( 强.软.弱.虚 ) 二. 软引用代码示例 三. 弱引用代码示例 强引用 ( 不回收 ) > 软引用 ( OOM 前回收 ) > 弱引用 ( GC 必 ...

  3. Java引用类型与常量

    Java引用类型与常量 引用数据类型 Java中,引用类型的变量非常类似于C/C++的指针. 引用类型指向一个对象,指向对象的变量是引用变量,这些变量在声明时被指定为一个特定的类型,比如Employe ...

  4. 深入理解Java引用类型

    深入理解Java引用类型 在Java中类型可分为两大类:值类型与引用类型.值类型就是基本数据类型(如int ,double 等),而引用类型,是指除了基本的变量类型之外的所有类型(如通过 class ...

  5. Java引用类型分类以及详解

    Java引用类型分类以及详解 - Java引用类型概述 在JVM之中再好的算法,也敌不过一个好烂的程序员.一个程序要想写好有两点:按照开发标准进行.请写有用代码. 而对于垃圾的产生与回收的处理之中,要 ...

  6. Java引用类型用法总结(重点)

    Java引用类型 引用数据类型:数组,类(String),接口. class作为成员变量 类作为成员变量时,对它进行赋值的操作,实际上,是赋给它该类的一个对象. Role.java package r ...

  7. java的虚引用_你不可不知的Java引用类型之——虚引用

    定义 虚引用是使用PhantomReference创建的引用,虚引用也称为幽灵引用或者幻影引用,是所有引用类型中最弱的一个.一个对象是否有虚引用的存在,完全不会对其生命周期构成影响,也无法通过虚引用获 ...

  8. java引用类型使用场景_下面有关java的引用类型,说法正确的有?

    发现这道题完全没头绪,就去查了一下,感觉说的比较清楚了. 四种引用类型 JDK1.2 之前,一个对象只有"已被引用"和"未被引用"两种状态,这将无法描述某些特殊 ...

  9. java引用类型和值类型_[Java教程]JavaScript中值类型和引用类型的区别

    [Java教程]JavaScript中值类型和引用类型的区别 0 2017-02-24 00:00:35 JavaScript的数据类型分为两类:原始类型和对象类型.其中,原始类型包括:数字.字符串和 ...

最新文章

  1. python哪些是可变对象_python的不可变对象与可变对象及其妙用与坑
  2. groupby多个字段性能_MySQL今天我们说下分组(group by)
  3. HDU2089——不要62 (数位DP)
  4. 产品经理必懂技术术语(后台类)
  5. SpringBoot + MyBaties 实现其XML方式
  6. python win32api messagebox_如何在Python中使用Win32 API?
  7. 声音均衡器怎么调好听_调音师必备:如何调出最佳人声?
  8. c语言延时时间计算器,rc延时电路延时时间计算公式
  9. eclipse安卓插件ADT下载地址
  10. CRC冗余校验的真正原理之模2除法
  11. 服务器被攻击了怎么办?海外服务器有什么有特点?网址或者APP被攻击了怎么办?
  12. springboot项目Banner配置
  13. DataStream API【1】
  14. Vue常用的内置指令的底层细节分析
  15. 【Java并发编程的艺术】读书笔记——Java并发编程基础
  16. 纽约州立大学环境与林业学院计算机科学专业,纽约州立大学环境科学与林业学院...
  17. stranded 和 non-stranded RNA-seq
  18. wxX11移植到arm板上(序)
  19. 运维标准化与流程化建设
  20. 读《小强升职记》有感 时间管理

热门文章

  1. 对于SAP的月结相关流程介绍
  2. Ext JS高级程序设计
  3. 第 3 章 Systems architecture(系统架构)
  4. 在一个tomcat 里面 两个相同的项目不能同时运行??
  5. 绝对定位元素设置水平居中
  6. Socket accept failed
  7. cnetos6,centos7添加新网卡,系统不识别的解决办法
  8. IOS Key-Value Observing (KVO)
  9. Exadata上oracle binary的make日志
  10. 10-穿墙代理的设置 | 01.数据抓取 | Python