java 确定对象的引用_JVM学习笔记之了解对象存活判断和4种引用【三】
垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”
一、对象存活判断
1.1 引用计数算法(Reference Counting)
工作原理
给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加 1;当引用失效时,计数器值就减 1;任何时候计数器为 0 的对象是不可能再被使用的。
分析 Java虚拟机 是否采用该算法
代码
/**
* JVM args :-XX:+PrintGCDetails 通过此命令可以打印GC信息
* 引用计数GC:
*/
public class ReferenceCountingGC {
private Object instance=null;
public static final int _1M=1024*1024;
private byte[] bytes=new byte[2*_1M];
public static void testGC(){
ReferenceCountingGC rA = new ReferenceCountingGC();
ReferenceCountingGC rB = new ReferenceCountingGC();
rA.instance = rB;
rB.instance = rA;
rA=null;
rB=null;
//手动发生GC
System.gc();
}
public static void main(String[] args) {
testGC();
}
}
输出
image
上面例子 rA 与 rB 互相依赖,从结果来看,内存大小从 7462k -> 784k,虚拟机进行了回收,证明虚拟机不是通过引用计数法来判断对象存活的。
1.2 可达性分析算法(Reachability Analysis)
工作原理
通过一系列的成为“GC Roots” 的对象作为起点,从这些节点开始向下搜索,搜索走过的路径成为引用链(Reference Chain),当一个对象到 GC Roots 没有任何 GC 引用链连接时(从 GC Roots 到这个对象不可达)则证明这个对象是不可活的。
图示:
image
GC Roots 的对象包括下面几种
虚拟机栈(栈帧中的本地变量)中引用的对象
方法区中类静态属性引用的对象
方法区中常量引用的对象
本地方法栈中 JNI(Natice 方法)引用的对象
二、Java 四种引用
经过上面描述得知,对象的存活都与“引用”有关。在 JDK1.2 之后,Java 对引用的概念进行了扩充,将引用分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Week Reference)、虚引用(Phantom Reference),引用强度依次减弱。
强引用 > 软引用 > 弱引用 > 虚引用
2.1强引用
是使用最普遍的引用,类似“Object obj = new Object()”。只要强引用还存在,垃圾收集器就不会回收被引用的对象
2.2软引用
描述一些还有用但并非必须的对象。在系统将要发生内存溢出之前,将会把这些对象列进回收范围之中进行二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常。
2.3弱引用
描述非必须对象,强度比软引用还弱一些。被弱引用关联的对象只能生存到下次垃圾收集之前。当垃圾收集器工作时,无论当内存是否足够,都会回收掉只被弱引用关联的对象。
2.4虚引用
一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来获得一个对象实例。为一个对象设置虚引用关联的唯一目的就是在这个对象被收集回收时收到一个系统通知。
2.5总结
引用类型
GC 时 JVM 内存充足
GC 时 JVM 内存不足
应用场景
强引用
不被回收
不被回收
弱引用
被回收
被回收
软引用
不被回收
被回收
软引用通常用于实现内存敏感缓存
虚引用
被回收
被回收
大多被用于引用销毁前的处理工作
参考
《深入理解 Java 虚拟机:JVM 高级特性与最佳实践(第 3 版)》
java 确定对象的引用_JVM学习笔记之了解对象存活判断和4种引用【三】相关推荐
- python学习笔记4(对象/引用;多范式; 上下文管理器)
python学习笔记4(对象/引用:多范式; 上下文管理器) ### Python的强大很大一部分原因在于,它提供有很多已经写好的,可以现成用的对象 21. 动态类型:对象/引用 对象和引用: 对象是 ...
- jmh学习笔记-State共享对象
系列文章目录 jmh学习笔记-源代码编译与bench mode jmh学习笔记-State共享对象 jmh学习笔记-State共享对象前后置方法 jmh学习笔记-代码清除 jmh学习笔记-常量折叠 j ...
- 传智博客学习笔记8--面向对象下
传智博客学习笔记8--面向对象下 2009-3-12 15:41:42 继承 extends 接口 interface 如果一个抽象类中的所有方法都是抽象的,我们就可以将这个类用另外一种方式来定义,也 ...
- ES6基础2(块级作用域、数组对象解构)-学习笔记
文章目录 ES6基础2(块级作用域.数组对象解构)-学习笔记 块级作用域 数组解构 对象解构 字符串解构 函数的参数解构 ES6基础2(块级作用域.数组对象解构)-学习笔记 块级作用域 //let c ...
- JavaScript:学习笔记(9)——Promise对象
JavaScript:学习笔记(9)--Promise对象 引入Promise Primose是异步编程的一种解决方案,比传统的解决方案回调函数和事件更加合理和强大.如下面为基于回调函数的Ajax操作 ...
- Java转义工具类StringEscapeUtils的学习笔记
Java转义工具类StringEscapeUtils的学习笔记 前言 在java.commons.lang3 的包中有许多方便好用的工具类,类似于处理字符串的StringUtils,处理日期的Da ...
- QT学习笔记(五):Qt5的8种标准对话框示例
QT学习笔记(五):Qt5的8种标准对话框示例 前言 实例展示 1.颜色对话框 2.文件对话框 3.字体对话框 4.输入对话框 5.消息对框 6.进度对话框 7.错误信息对话框 8.向导对话框. 前言 ...
- 《Java编程思想》学习笔记【一对象导论】
重头学习Java,大一没怎么学,大二上课也没听.(流下不学无术的眼泪) 所有编程语言都提供抽象机制,我们所能解决的问题的复杂性直接取决于抽象的类型和质量. 汇编语言是对底层机器的轻微抽象," ...
- Java学习笔记07-面向对象
面向对象 面向对象&面向过程的区别 面向过程思想 步骤清晰简单,第一步做什么,第二步做什么以及后续每一步都清清楚楚 面向过程适用于处理一些较为简单的问题 面向对象思想 物以类聚,分类的思维模式 ...
最新文章
- 正则匹配class并替换整个class为空
- Could not load the Tomcat server configuration at \Servers\Tomcat v7.0 Server at localhost-config
- 漂亮的带分步说明的 VBA 自制进度条
- bitcoin转账api,python2.7
- 艾伟_转载:.NET设计模式:工厂方法模式(Factory Method)
- 计算机组装与维护课程教学内容,《计算机组装与维护》课程教学计划
- java类转为er图_ER图,以及转化成关系模式
- 医学诊断报告生成论文综述
- linux历史数据导出命令,Linux Bash history从入门到进阶
- 新一批交通强国试点工作启动
- 用于地址解析的协议是服务器,用于解析域名的协议是什么?
- 转帖:夜夜听雨(四)(中国社会科学院 郑哲)
- 胡昌泽 day4笔记
- JMeter察看结果树响应数据都是相同原因
- HALCON:Optical Flow(光流法)
- (Win8、Win7)MAK激活密钥分享【资源有限】
- c++windows+yolov5-6.2+openvino模型部署超详细
- tp6------上传表单
- HDLBits:在线学习Verilog(七 · Problem 30-34)
- kadm5_init_with_skey
热门文章
- java 动态数据源切换,Java+Spring+MyBatis实现多数据源的动态切换
- 电磁波传播相位是否会变化_民众纷纷转向网上购物,却又担心包裹信件是否会传播病毒?!...
- Connect to repo.maven.apache.org:443 [repo.maven.apache.org/151.101.24.215] failed: connect timed ou
- matlab画爱心代码分享
- 基于JAVA+SpringBoot+Mybatis+MYSQL的科研项目评审系统
- 基于JAVA+SpringMVC+Mybatis+MYSQL的甜品店商城
- 学java需要哪些js知识点_JS重要知识点
- 4.namespace
- svn .a文件上传不了
- GridView控件日期格式化