`

JVM 四种引用

    博客分类:
  • java
阅读更多
1. 强引用

指通过普通方式创建一个对象,并把这个对象赋给一个引用变量。只要还有引用变量指向,就不会被JVM回收,即使在内存不足时。


2. 软引用

通过SoftReference实现。

和强引用类似,区别是当内存不足时会被JVM回收。

public static void main(String[] args) {
	SoftReference<User>[] users = new SoftReference[16910];

	for (int i = 0; i < users.length; i++) {
		users[i] = new SoftReference<User>(new User("name" + i));
	}
	
	System.out.println(users[0].get());
	System.out.println(users[6].get());
	
	System.gc(); // 垃圾回收
	System.runFinalization(); // 执行析构方法
	
	System.out.println();
	
	System.out.println(users[0].get());
	System.out.println(users[6].get());
}

设置较小的JVM堆大小以模拟堆内存不足场景:-Xms2M -Xmx2M。1M会报Too small initial heap for new size specified错误。

输出:
com.john.jvm.User@39443f
com.john.jvm.User@1afae45

null
com.john.jvm.User@1afae45


3. 弱引用

通过WeakReference实现。

弱引用具有很强的不确定性,垃圾回收每次都会回收弱引用的对象。

public static void main(String[] args) {
	User user = new User("name");
	WeakReference<User> wr = new WeakReference<User>(user);
	user = null; // 去除强引用
	System.out.println(wr.get());

	System.gc(); // 垃圾回收
	System.out.println(wr.get());
}

输出:
com.john.jvm.User@c1c428
null

4. 虚引用

通过PhantomReference实现。

软引用和弱引用可以单独使用,虚引用不能单独使用。虚引用的作用是跟踪对象被垃圾回收的状态。程序可以检测与虚引用关联的引用队列是否已经包含了指定的虚引用,从而了解虚引用的对象是否即将被回收。

本身对对象没有影响,类似于没有引用。对象甚至感觉不到引用的存在。如果一个对象只有一个虚引用存在,那么它就类似于没有引用存在。

public static void main(String[] args) {
	User user = new User("name");
	ReferenceQueue<User> rq = new ReferenceQueue<User>(); // 引用队列
	PhantomReference<User> pr = new PhantomReference<User>(user, rq); // 创建一个虚引用,关联指定对象和队列。
	user = null;
	System.out.println(pr.get()); // 获取虚引用的对象
	System.gc(); // 垃圾回收
	System.runFinalization();
	System.out.println((rq.poll() == pr)); // 取出引用队列的第一个对象与虚引用进行比较
}

输出:
null
true
分享到:
评论

相关推荐

    JVM入门实战/arthas实战/垃圾回收算法/垃圾回收器/jvm内存模型分析

    第四节:垃圾回收算法 1.1标记清除算法 1.2复制算法 1.3 标记整理(标记压缩)算法 第五节:垃圾回收器 1.1Serial/Serial Old收集器 1.2 ParNew收集器 1.3Parallel Scavenge收集器 1.4Parallel Old收集器 1.5CMS...

    深入JVM内核 - 原理、诊断与优化

    引用计数 标记清除 复制算法 标记压缩 可触及性 本章是理论性较强的一章,主要介绍GC的基本算法和思想,本章作为下一章节的前序课程。 第五课 GC控制参数 Serial ParNew等GC参数 GC的参数搭配实例分析 介绍GC的...

    JVM规范--高手总结

    3.2.1 Reference Counting(引用计数) 22 3.2.2 跟踪收集器 22 3.3 JVM的垃圾收集策略 27 3.3.1 Serial Collector 28 3.3.2 Parallel Collector 29 3.3.3 Concurrent Collector 30 Java虚拟机(JVM)参数配置说明 30

    java 查看JVM中所有的线程的活动状况

    java 查看JVM中所有的线程的活动状况 java 查看JVM中所有的线程的活动状况

    jvm指令手册 +JVM必知必会,掌握虚拟机编译过程.rar

    JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 引入Java语言虚拟机后,Java语言在不同平台...

    高级开发jvm面试题和答案.pdf

    面试高级开发的期间整理的面试题目,记录我面试遇到过的jvm题目以及答案,比较常见的虚拟机面试题目 虚拟机内存 jvm jvm内存结构; 栈的顺序:先进后出,栈中方法的顺序 jvm调优; 对象 对象的创建过程; 对象在内存...

    《JVM从入门到入魔》笔记.pdf

    2:垃圾回收:垃圾确定【引用计数法、可达性分析】+垃圾收集算法【标记-清除、标记整理、复制】+垃圾收集器【Serial+PareNew+Serial Old+Paralles Old+CMS+G1】 3:JVM内存调优:JVM参数【标准参数、-X参数、-XX参数等...

    [jvm]深入JVM(一):从

    [jvm]深入JVM(一):从"abc"=="abc"看java的连接过程收藏 一般说来,我不关注java底层的东西,这次是一个朋友问到了,注意不光是 System.out.println("abc"=="abc");返回true, System.out.println(("a"+"b"+"c")....

    基于JVM存储架构对Java引用传递的解析.pdf

    基于JVM存储架构对Java引用传递的解析.pdf

    Android Studio 报错failed to create jvm error code -4的解决方法

    代码如下:failed to create jvm error code -4 这一般应是内存不够用所致,解决方法参考如下。 打开 Android Studio 安装目录下的bin目录,查找并打开文件 studio.exe.vmoptions,修改代码: 代码如下:-Xmx512m 为...

    JVM内存管理和垃圾回收

    &lt;&lt;JVM内存管理和垃圾回收&gt;&gt; word版 博文链接:https://ayufox.iteye.com/blog/214411

    resin-jvm 调优

    引用计数存储对特定对象的所有引用数,也就是说,当应用程序创建引用以及引用超出范围时,jvm必须适当增减引用数。当某对象的引用数为0时,便可以进行垃圾收集。 1.2.对象引用遍历 早期的jvm使用引用计数,现在...

    JVM基础知识

    Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在...

    Java+JVM+垃圾回收机制

    一种是引用计数算法、一种是可达性分析算法。 2.有哪些重要的垃圾回收算法? 图画详细介绍常见的三种垃圾回收算法,包括标记-清除算法、标记-整理算法和标记-复制算法。 3.垃圾回收的具体流程是怎样的? 图画分析...

    jvm工具、参数调优&调试技巧

    目 录 1 表格列表 2 一、 JVM工具 2 1. jps:虚拟机进程状况工具 2 2. jstat:虚拟机统计...四、 参考/引用资料 7 表格列表 表格 1 调试参数 3 表格 2 JVM调优参数 4 表格 3 行为参数 5 表格 4 JVM启动参数 6 一、

    深入理解JVM内存结构及运行原理全套视频加资料.txt

     第33讲 垃圾回收-判断对象是否存活算法-引用计数法详解 00:14:08  第34讲 垃圾回收-判断对象是否存活算法-可达性分析法详解 00:07:09  第35讲 垃圾回收算法-标记清除算法 00:04:36  第36讲 垃圾回收算法-...

    JVM指令手册【完善中文版】.txt

    aconst_null 将null对象引用压入栈 iconst_m1 将int类型常量-1压入栈 iconst_0 将int类型常量0压入栈 iconst_1 将int类型常量1压入栈 iconst_2 将int类型常量2压入栈 iconst_3 将int类型常量3压入栈 iconst_4 将int...

    jvm垃圾回收思维导图

    圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制。该思维导图完整的描述了垃圾回收的各个关键点

    JVM常量池教程吐血整理干货.md

    符号引用: 符号引用包括三种:类的全限定名,方法名和描述符,字段名和描述符。 Class文件常量池 运行时常量池 运行时常量池是在类加载阶段,将class二进制数据加载到内存, 并将数据保存到方法区,其中class文件中...

    java四大引用

    java有四种引用类型:强引用、软引用、弱引用、虚引用 四大引用设计作用 ​ 因为java的内存分配和内存回收,都是由JVM去负责,一个对象是否可以被回收,主要看是否有引用指向此对象,即可达性分析 设计目的: 可以让...

Global site tag (gtag.js) - Google Analytics