Java引用类型具体解释

Java引用类型具体解释

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

JVM  垃圾收集对不同类型的引用的有一种不同的方法。java对于它的对象。仅仅存在有引。它会一直存在于内存中。假设越来越多这样的对象,外JVM的内存量。JVM抛出OutOfMemory错。

虽然垃圾收集的实施细节JVM控制。发者仍然能够在一定程度上与垃圾回收器进行交互,其目的在于更好的帮助垃圾回收器管理好应用的内存。这种交互方式就是使用JDK1.2 引入的  java.lang.ref包。

强引用(strong reference)

在一般的 Java 程序中,见到最多的就是强引用(strong reference)。如 Date date = newDate(),date  就是一个对象的强引用。

对象的强引用能够在程序中到处传递。非常多情况下,会同一时候有多个引用指向同一个对象。强引用的存在限制了对象在内存中的存活时间。

假如对象 A 中包括了一个对象 B 的强引用。那么普通情况下,对象 B  的存活时间就不会短于对象 A。

假设对象 A 没有显式的把对象 B 的引用设为 null  的话,就仅仅有当对象 A 被垃圾回收之后。对象 B  才不再有引用指向它。才可能获得被垃圾回收的机会。

软引用(soft  reference)

软引用(soft  reference)在强度上弱于强引用,通过类SoftReference来表示。

它的作用是告诉垃圾回收器。程序中的哪些对象是不那么重要。当内存不足的时候是能够被临时回收的。当JVM中的内存不足的时候,垃圾回收器会释放那  些仅仅被软引用所指向的对象。假设所有释放完这些对象之后,内存还不足,才会抛出OutOfMemory错误。软引用很适合于创建缓存。当系统内存不足的时候,缓存中的内容是能够被释放的。比方考虑一个图像编辑器的程序。该程序会把图像文件的所有内容都读取到内存中。以方便进行处理。而用户也能够同一时候打开  多个文件。当同一时候打开的文件过多的时候,就可能造成内存不足。假设使用软引用来指向图像文件内容的话,垃圾回收器就能够在必要的时候回收掉这些内存。

import java.lang.ref.SoftReference;

public class ImageData {
	private String path;
	private SoftReference<byte[]> dataRef;

	public ImageData(String path) {
		this.path = path;
		dataRef = new SoftReference<byte[]>(new byte[0]);
	}

	private byte[] readImage() {
		return new byte[1024 * 1024]; // 省去了读取文件的操作
	}

	public byte[] getData() {
		byte[] dataArray = dataRef.get();
		if (dataArray == null || dataArray.length == 0) {
			dataArray = readImage();
			dataRef = new SoftReference<byte[]>(dataArray);
		}
		return dataArray;
	}
}

在执行上面程序的时候,能够使用  -Xmx  參数来限制JVM可用的内存。因为软引用所指向的对象可能被回收掉。在通过  get方法来获取软引用所实际指向的对象的时候,总是要检查该对象是否还存活。

弱引用(weak reference)

弱引用(weak reference)在强度上弱于软引用,通过类 WeakReference来  表示。它的作用是引用一个对象,可是并不阻止该对象被回收。假设使用一个强引用的话。仅仅要该引用存在。那么被引用的对象是不能被回收的。

弱引用则没有这个问题。

在垃圾回收器执行的时候,假设一个对象的全部引用都是弱引用的话,该对象会被回收。

弱引用的作用在于解决强引用所带来的对象之间在存活时间上的耦合关系。弱引用最常见的用处是在集合类中,尤其在哈希表中。

哈希表的接口同意使用不论什么Java对象作为键来使用。当一个键值对被放入到哈希表中之后。哈希表  对象本身就有了对这些键和值对象的引用。

假设这样的引用是强引用的话,那么仅仅要哈希表对象本身还存活,当中所包括的键和值对象是不会被回收的。假设某个存活  时间非常长的哈希表中包括的键值对非常多,终于就有可能消耗掉JVM中所有的内存。对于这样的情况的解决的方法就是使用弱引用来引用这些对象,这样哈希表中的键和值对象都能被垃圾回收。

Java中提供了 WeakHashMap来满足这一常见需求。

虚引用(phantom  reference)

在介绍虚引用之前,要先介绍Java提供的 对象终止化机制(finalization)。在Object类里面有个 finalize方法,其设计的初衷是在一个对象被真正回收之前,能够用来执行一些清理的工作。由于 Java并没有提供类似 C++的析构函数一样的机制,就通过finalize方法来实现。

可是问题在于垃圾回收器的执行时间是不固定的,所以这些清理工作的实际执行时间也是不能预知的。虚引用(phantom  reference)能够解决问题。在创建虚引用 PhantomReference的时候必需要指定一个引用队列。当一个对象的finalize方法已经被调用了之后。这个对象的虚引用会被增加到队列中。

通过检查该队列里面的内容就知道一个对象是不是已经准备要被回收了。

在有些情况下。程序会须要在一个对象的可达到性发生变化的时候得到通知。比方某个对象的强引用都已经不存在了,仅仅剩下软引用或是弱引用。

可是还须要对引用本身做一些的处理。典型的情景是在哈希表中。引用对象是作为WeakHashMap中的键对象的。当其引用的实际对象被垃圾回收之后。就须要把该键值对从哈希表中删除。有了引用队列(ReferenceQueue),就能够方便的获取到这些弱引用对象,将它们从表中删除。

前软而弱引用对象被添加到队列。其引用实际的对象会被清空主动。

通过参考队列 poll/remove该方法可以是非堵塞和的方式堵塞分别得到一个引用队列对象。

参考:

深入了解JVM

Java深入探索

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117806.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 逆向分析学习入门教程

    逆向分析学习入门教程转在于逆向工厂(一):从helloworld开始前沿从本篇起,逆向工厂带大家从程序起源讲起,领略计算机程序逆向技术,了解程序的运行机制,逆向通用技术手段和软件保护技术,更加深入地去探索逆向的魅力。一、程序如何诞生?1951年4月开始在英国牛津郡哈维尔原子能研究基地正式投入使用的英国数字计算机“哈维尔·德卡特伦”,是当时世界上仅有的十几台电脑之一。图中两人手持的“纸带”即是早期的程序,纸带通过是否

    2022年6月19日
    37
  • Redis选择数据库分区

    Redis选择数据库分区Redis-cli命令连接:redis-cli命令下选择数据库分区可以有2种方式:1、选择数据库(redis可以有多个数据库,默认情况下是连接数据库0,redis配置文件中通过databasesnum来配置数量)127.0.0.1:6379>select2OK2、那么我们登录的时候,如何制定登录哪个库呢?./redis-cli-n3指定登录下标为3的数据库./redis-cli-n0等价于./redis-cli默认登录下标为0的数据库即使…

    2022年5月7日
    54
  • RARP_arp协议主要用来

    RARP_arp协议主要用来ARP的工作原理如下:1.首先,每台主机都会在自己的ARP缓冲区(ARPCache)中建立一个ARP列表,以表示IP地址和MAC地址的对应关系。2.当源主机需要将一个数据包要发送到目的主机时

    2022年8月5日
    5
  • 四种黑盒测试方法_八大心态的总结怎么写

    四种黑盒测试方法_八大心态的总结怎么写一、等价类划分法1.定义2.划分等价类2.1有效等价类2.2无效等价类3.划分等价类的标准4.划分等价类的方法5.设计测试用例6.三角形实例二、边界值分析法1.定义2.与等价划分的区别3.边界值分析方法的考虑4.常见的边界值5.边界值分析6.基于边界值分析方法选择测试用例的原则7.实例说明8、三角形问题的边界值分析测试用例三、错误推测方法1.定义2.错误推测方法的基本思想:四、因果图方法1.定义2.因果图法产生的背景:3.因果图介绍4.因果图概念5.采用因果图法设计测试用例的步.

    2022年10月3日
    0
  • java常量池在方法区还是堆_JAVA常量池

    java常量池在方法区还是堆_JAVA常量池要是没有实践过别人书本上的理论的话,就还是会说常量池在方法区里面,要是知道方法区已经随jdk升级,被逐步干掉的话,就会看到有的文章说移动到heap堆里面了,还有极少的说移动到Metaspace里面了,产生了分歧。这个时候就需要实践出真知了。/***测试常量池在分区的位置**@authorLiXuekaion2020/6/9*/publicclassStringConstantPoolTest{publicstaticvoidmain(String[]

    2022年7月28日
    44
  • 无键盘屏幕配置树莓派连接WiFi

    无键盘屏幕配置树莓派连接WiFi前言Ubuntu20.04LTS都发布好一段时间了,官方支持RaspberryPi,手痒痒了想试试,结果发现没带miniHDMI的转接线,看了下Ubuntu官方的树莓派安装文档:https://ubuntu.com/tutorials/how-to-install-ubuntu-on-your-raspberry-pi#1-overview可以直接在TF卡根目录下面创建配置文件来实现WiFi连接的.记录一下实操过程Ubuntu20.04LTS系统镜像写入TF卡习惯了先手动下载系统镜像:

    2022年6月13日
    24

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号