Java虚拟机知识点【引用】

??Java虚拟机采用可达性分析算法来判断对象是否可以回收。可达性分析算法通过一系列的GC Roots对象作为起始点,向下搜索走过的路径称引用链,当一个对象到GC Roots没有任何的引用链时,证明对象是不可用的。

Java中,可作为GC Roots的对象:

  • 虚拟机栈中引用的对象
  • 本地方法栈的JNI引用的对象
  • 方法区静态属性引用的对象
  • 方法区常量引用的对象

Java对引用进行了扩充,分为强引用、软引用、弱引用、虚引用四种。

  • 强引用:(StrongReference)

强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不回收。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。

// 强引用的示例
String string = "hello";
  • 软引用:(SoftReference)

如果一个对象只具有软引用,则只有在内存空间不足的时,才会回收。可以和一个引用队列联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。

// 软引用的示例
SoftReference<String> softRefString = new SoftReference<>("hello", queue);
  • 弱引用:(WeakReference)

弱引用与软引用的区别在于:弱引用的对象拥有更短暂的生命周期。垃圾回收线程一旦发现了具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。可以和一个引用队列联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。

// 弱引用的示例
WeakReference<String> weakRefString = new WeakReference<>("hello", queue);
  • 虚引用:(PhantomReference)

虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。 必须和引用队列 联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。

// 虚引用的示例
ReferenceQueue<String> queue = new ReferenceQueue<>();
PhantomReference<String> phanRefString = new PhantomReference<>("hello", queue);

参考资料:《深入理解Java虚拟机(第二版)》《Java虚拟机规范(Java SE 8版)》

原文地址:https://www.cnblogs.com/bigshark/p/11219912.html

时间: 2024-10-29 04:09:21

Java虚拟机知识点【引用】的相关文章

Java虚拟机知识点-class文件

Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑排列在Class文件中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙.当遇到需要占用8位字节以上的数据项时,会按照高位在前的方式分割成若干个8位字节进行存储. ClassFile 结构说明magic:魔数.唯一作用是确定这个文件是否为一个能被虚拟机所接收的class文件.固定值:0xCAFEBABE.minor_version:class文件的副版本号.major

java虚拟机之引用

强引用: 类似:object A=new Object();这样的引用,只要强引用还存在,垃圾回收期就永远不会回收被引用的对象,eg:这里的new Oject(). 软引用: 一些还有用,但是非必需的的对象,对于软引用关联的对象,在系统将要发生内存泄漏之前,将会把这些对象列入回收范围,并进行二次回收,如果回收这些对象还是内存不足,就会发生内存溢出,跑出内存溢出异常.在jdk1.2之后,提供了softreference类来实现软引用. 虚引用: 称为幻影引用,幽灵引用,它是最弱的一种引用方式,一个

Java虚拟机15:再谈四种引用状态

JVM的四种引用状态 在Java虚拟机5:Java垃圾回收(GC)机制详解一文中,有简单提到过JVM的四种引用状态,当时只是简单学习,知道有这么一个概念,对四种引用状态理解不深.这两天重看虚拟机这部分的时候,写了很多例子详细研究了一下JVM的几种引用,对于JVM的引用理解加深了不少,因此总结写一篇文章总结并分享下. 首先,还是先从JVM四种引用状态开始,这部分摘抄自周志明老师的<深入理解Java虚拟机:JVM高级特性与最佳实践>一书. 在JDK1.2之前,Java中的引用的定义很传统:如果re

java十分钟速懂知识点——引用

一.由健忘症引起的问题 今天闲来没事在日志中瞟见了个OutOfMemoryError错误,不由得想到前一段时间看到一篇面经里问到Java中是否有内存泄露,这个很久以前是留意过的,大体记得内存溢出和内存泄露是不同的,至于各自都有哪些情况,那个...额....忘了....好吧,记忆力一向不好,忘就忘了,那就再总结一遍吧.翻了下收藏的博客,回顾了下便是想起了了~.~.看起来一切很美好,但是其中的一个例子突然使我困惑了: public class TestDemo { static Test[] tes

Java面试知识点之虚拟机篇(一)

前言:Java虚拟机的重要性不言而喻,不管是在实际工作中,还是面试中. 1.JVM架构 要点: 主要了解Java虚拟机运行时数据区:程序计数器.Java虚拟机栈.本地方法栈.Java堆和方法区. 参考: https://blog.csdn.net/seu_calvin/article/details/51404589 2.新生代.老年代 在JVM中,堆是被JVM所管理的最大一块内存空间,主要用于存放各种类的实例对象. 堆一般分为:新生代.老年代. 新生代:主要是用来存放新生的对象.一般占据堆的1

Java虚拟机详解——JVM常见问题总结

[正文] 声明:本文只是做一个总结,有关jvm的详细知识可以参考之前的系列文章,尤其是那篇:Java虚拟机详解04--GC算法和种类.那篇文章和本文是面试时的重点. 面试必问关键词:JVM垃圾回收.类加载机制. 先把本文的目录画一个思维导图:(图的源文件在本文末尾) 一.Java引用的四种状态: 强引用:  用的最广.我们平时写代码时,new一个Object存放在堆内存,然后用一个引用指向它,这就是强引用. * 如果一个对象具有强引用,那垃圾回收器绝不会回收它*.当内存空间不足,Java虚拟机宁

《深入理解Java虚拟机》:类加载的过程

<深入理解Java虚拟机>:类加载的过程 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载.验证.准备.解析.初始化.使用和卸载七个阶段.其中类加载的过程包括了加载.验证.准备.解析.初始化五个阶段. 下面详细讲述类加载过程中每个阶段所做的工作. 加载 加载时类加载过程的第一个阶段,在加载阶段,虚拟机需要完成以下三件事情: 1.通过一个类的全限定名来获取其定义的二进制字节流. 2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构. 3.在Java堆中生成一

java虚拟机底层结构详解[转]

本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 在以前的博客里面,我们介绍了在java领域中大部分的知识点,从最基础的java最基本语法到SSH框架.这里面应该包含了在java领域里面的大部分内容了吧.但是,那些知识点是让我们从一个应用的层面上了解了java,java程序真正底层的运行机制和一些底层虚拟机的工作我们还不了解,虽然这些内容在我们真正的开发中几乎用不到这些底层的东西,但对于我们对java的理解会有比较大的帮助.尤其也对以后

JAVA基础知识点总结(全集)

1.JAVA简介 1.1java体系结构:j2se,javaweb,j2ee 1.2java特点:平台无关(虚拟机),垃圾回收(使得java更加稳定) 1.3 JDK与JRE,JDK:java开发环境,JRE:java运行环境 1.4第一个java程序:HelloWorld,java的入口是main(public static void main(String[] args)) 1.5java程序的开发步骤:.java编译(javac)成.class运行(java).class文件 2.基本数据