引用计数法和可达性分析算法

2023-11-11

一、引用计数法

给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不能再被使用的。引用计数法实现简单,判定效率也很高,但是它很难解决对象之间相互循环引用的问题。如下代码中 testGC()方法:对象objA和objB都有字段instance,赋值令objA.instance = objB;及objB.instance = objA;除此之外,两个对象再无引用,实际上这两个对象已经不可能再被访问,但是因为它们互相引用着对方,导致它们的引用计数都不为0,于是引用计数器无法通知GC收集器回收它们。

package test;
public class ReferenceCountingGC {
  public Object instance =null;
  private static final int _1MB=1024*1024;
  /**
   * 这个成员属性的唯一意义就是占点内存,以便能在GC日志中看清楚是否被回收过
   */
  private byte[] bigsize=new byte[2 * _1MB];
  public static void testGC() {
    ReferenceCountingGC objA = new ReferenceCountingGC();
    ReferenceCountingGC objB = new ReferenceCountingGC();
    objA.instance = objB;
    objB.instance = objA;
    
    objA = null;
    objB = null;
    //objA和objB是否能被回收?
    System.gc();
  }
}

二、可达性分析算法

在主流的商用语言的主流实现中都是通过可达性分析来判定对象是否存活。这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。例如object5、object6、object7虽然互有关联,但它们到GC Roots是不可达的,所以它们将会被判定为可回收对象。


在java语言中,可作为GC Roots的对象包括下面几种:

1. 虚拟机栈(栈帧中的本地变量表)中引用的对象;

2. 方法区中类静态属性引用的对象;

3. 方法区中常量引用的对象;

4. 本地方法栈中JNI(即一般所说的Native方法)引用的对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

引用计数法和可达性分析算法 的相关文章

  • VMware提示此主机支持Intel VT-x,但Intel VT-x处于禁用状态——解决方法

    虚拟机VMware提示此主机支持Intel VT x 但Intel VT x处于禁用状态 也就是需要开启Intel Virtualization Technology虚拟化技术 Intel VT x完整名称是Intel Virtualiza
  • 并发策略之分工原则

    本文主要思想来自 Java虚拟机并发编程 薛笛 译 为什么要用并发 并发是再在有限的资源下提高性能的有效手段 当然现在互联网环境下并发访问的现象也比比皆是 但是本文并不涉及处理并发访问 而是使用并发手段解决复杂任务的策略 另外关于并发和并行
  • getnameinfo failed

    在虚拟机vmware中用netstat 查看网络状态出现一行 getnameinfo failed 可能的一个原因 虚拟机使用NAT方式链接网络 解决方法 使用桥接方式即可
  • VMware安装GHOST版XP教程

    VMware安装GHOST版XP教程 本来我是无法安装GHOST版的XP系统在VMware上 我很苦恼 到处找方法 最后找到了这里 可是每个关于这个问题的帖子里边都说改问题早就被处理 让搜索老帖子 可是我搜索出来的帖子里边的回复都说是改问题
  • java 虚拟机类装载的原理、实现、以及应用

    一 引言 Java虚拟机 JVM 的类装载就是指 将包含在类文件中的字节码装载到JVM中 并使其成为JVM一部分的过程 JVM的类动态装载技术能够在运行时刻动态地加载或者替换系统的某些功能模块 而不影响系统其他功能模块的正常运行 本文将分析
  • 云计算基础教程(第2版)笔记——基础篇与技术篇介绍

    文章目录 前言 第一篇 基础篇 一 绪论 1 1 云计算的概念以及特征 1 1 1云计算的基本概念 1 1 2云计算的基本特征 1 2 云计算发展简史 1 3 三种业务模式介绍 1 基础设施即服务 IaaS 2 平台即服务 PaaS 3 软
  • 主机与VMware的Linux虚拟机之间共享交换文件

    搭建环境 主机系统 Windows7 Ultimate VM软件 VMware Workstation 7 1 3 虚拟机系统 Linux Ubuntu 10 10 操作步骤 1 在主机上新建一个共享路径 用于将来和虚拟机之间进行共享文件
  • 《银河麒麟高级服务器操作系统V10》使用

    一言而论 讲了麒麟服务器V10的基本使用 包括终端 VNC 文章目录 前言 基本架构 环境 硬件环境 软件环境 麒麟安装步骤 1 在宿主机上安装好VM 并且激活 2 使用VM创建虚拟机 3 启动虚拟机 终端常用点 VNC的使用 麒麟上安装V
  • android studio安装automotive模拟器

    添加源 打开android studio的SDK Manager 选择SDK Update Sites选项卡 点击Add 弹出地址设置界面 添加polestar2 sys img Name填写 Polestar 2 System Image
  • 虚拟机安装与双系统(win10+ubuntu)安装及其他

    近来由于想要尝试下双系统 所以整了个虚拟机玩玩 在真实机器上装双系统方法类似 不过在虚拟机上装要安全些 在此记录下过程 以资日后参考 博客原创性是没有啥原创性的 各处借花献佛 算是一个总结性博客吧 文章目录 1 虚拟机安装 2 一个跨浏览器
  • VMware15中安装Linux详细教程

    VMware15中安装Linux详细教程 一 搭建VMware环境 1 打开链接 https www vmware com cn html 选择适合自己电脑系统的版本进行下载 2 下载完成后点击文件进行安装 安装界面如图 注 1 安装目录尽
  • VMware安装后打开就蓝屏

    VMware虚拟机开机蓝屏 追风 80 人赞同了该文章 目录 收起 一 查看主板上的虚拟化技术支持是否开启 二 开启虚拟机平台 如果在新建的虚拟机安装好后一点开机出现蓝屏 反复重装并且确定了新建虚拟机没有出错的情况下考虑是否是虚拟化没有开启
  • Java丨JVM虚拟机与类加载器

    一丶JVM 虚拟机介绍 Sun HotSpot VM 这个目前看起来 血统纯正 的虚拟机在最初并非由Sun公司开发 而是由一家名为 Longview Technologies 的小公 司设计的 甚至这个虚拟机最初并非是为Java语言而开发的
  • 在VMware Workstation Pro中安装Windows 11正式版(包括添加TPM 2.0支持,而不是忽略)

    目录 0 首先检查Windows 11需要的环境 1 创建一个虚拟机 1 1 选择使用下载好的Windows11镜像 1 2 选择操作系统为Windows 10 x64 1 3 给虚拟机系统起个名字并指定存放路径 1 4 把创建的虚拟硬盘大
  • VMware16安装虚拟机遇到的问题

    摘要 前面提到自己安装环境为CPU Intel Core i5 12600K VMware 版本 VMware Workstation 16 Pro 16 0 0 build 16894299 创建虚拟机的时候windwos 系列的win7
  • Failed to create the Java Virtual Machine问题解决

    问题现象 打开eclipse exe 弹出如下对话框 问题分析 这是eclipse启动初始化时报的错 一般出现这种情况跟安装了多个Java虚拟机有关 然后eclipse启动的时候 不知道要配置哪一个JDK 所以会报Failed to cre
  • 虚拟机--无法连接网络

    情况 运行命令 ifconfig 没有看到 ens33 网络 命令 ifconfig a 可以看到 ens33 其他 关闭防火墙 systemctl stop firewalld 查看状态 systemctl status firewall
  • centos8安装postgresql步骤

    1 安装源 1 sudo yum y install epel release 2 postgresql官网发布的postgresql对应的安装源 sudo yum install y https download postgresql o
  • Vmware安装后,没有VMnet0

    安装虚拟机之后 发现只有VMnet1和VMnet8 没有VMnet0 后来了解到桥接不是添加一个VMnet0虚拟网卡 而是添加网络服务 下面是VMware虚拟网卡的说明 网络类型 网络适配器名 Bridged VMnet0 NAT VMne
  • VirtualBox虚拟机网络连接设置的四种方式

    VirtualBox是一款SUN出品的非常优秀的虚拟机程序 版本也非常齐全 你可以在官网上找到适合各种操作系统平台的版本 这里我先给大家大致讲解下VBox的网络配置及应用 VirtualBox的提供了四种网络接入模式 它们分别是 1 NAT

随机推荐

  • 温室气体数据记录软件

    温室气体数据记录软件用于记录温室气体分析仪 冷阱系统 阀箱以及采样单元数据的获取及记录 其软件界面如下 在软件操作几面上部是工具栏 可以实现软件的各种操作 工具栏的排布如下所示 最左侧为 连接 工具 用于整体连接所有设备 包括分析仪 冷阱
  • MySQL数分:窗口函数

    什么是窗口函数 窗口函数在和当前行相关的一组表行上执行计算 这相当于一个可以由聚合函数完成的计算类型 但不同于常规的聚合函数 使用的窗口函数不会导致行被分组到一个单一的输出行 行保留其独立的身份 在后台 窗口函数能够访问的不止查询结果的当前
  • html怎么控制文字的行数,HTML – 最大.文字行数;这种方法可靠吗?

    我需要限制一些文本 以便它永远不会超过2行 这是我到目前为止 Here is some long text it just keeps on going and going and going Hello how are you I m f
  • 系统更新服务器 win7,win7 64位 sp1 update故障。进行系统更新则始终保持 “正在检查更新”且 - Microsoft Community...

    大家好 如题 win7 64位机子 一旦进行系统更新则 1始终保持Windows update 正在检查更新 并无限读条 2svchost exe netsvcs 则消耗1 2个g内存 且出现较多硬页错误 gt 70 而造成系统无法使用 已
  • 前端实现水波图动态效果

    来自 https blog csdn net sheng li article details 84347987 侵删
  • 地摊经济大火之后,如何从零开始摆摊创业?

    地摊经济大火之后 如何从零开始摆摊创业 分享一份新人摆摊手册 https gitmind cn app doc c29513265
  • Sqlmap的使用方法

    sqlmap是一个非常强大的sql注入检测与辅助工具 但是由于没有图形界面 基本上用起来比较麻烦 我们要了解这些语句 如下 检查注入点 sqlmap u http ooxx com tw star photo php artist id 1
  • C51——IO口配置

    I O口配置 STC89C51RC RD 系列单片机所有I O口均 新增P4口 有3种工作类型 准双向口 弱上拉 标准8051输出模式 仅为输入 高阻 或开漏输出功能 STC89C51RC RD 系列单片机的P1 P2 P3 P4 上电复位
  • 使用pandas将numpy中的数组数据保存为csv文件的方法

    如果想保存numpy中的数组元素到一个文件中 在这方面 pandas工具的使用就会让工作方便很多 下面通过一个简单的小例子来演示一下 首先 创建numpy中的数组 import numpy as np import pandas as pd
  • 面向商用活体检测平台的鲁棒性评估

    摘要 活体检测技术已经成为日常生活中的重要应用 手机刷脸解锁 刷脸支付 远程身份验证等场景都会用到这一技术 但如果攻击者利用虚假视频生成技术生成逼真的换脸视频来攻击上述场景的活体检测系统 将会对这些场景的安全性产生巨大的威胁 针对这个问题使
  • 【Oracle】导入/导出DMP文件

    一 导入dmp文件 1 打开cmd 输入sqlplus 录入账户密码 2 exit 3 输入指令 C Users Administrator gt imp hsa nt person hsa nt person 127 0 0 1 orcl
  • 使用腾讯云盲水印服务进行图片水印添加和提取的一个Python Demo

    目录 前言 起因 可略过 代码 addWatermark py extractWatermark py 运行效果 加水印 提取水印 最后 前言 首先 本文写于 2021 5 17 也许在未来的某个时间点 腾讯云盲水印服务的 Python S
  • 5.时间序列分析

    一 定义 时间序列分析 Time Series Analysis 是指将原来的数据分解为四部分来看 长期趋势 secular trend T 季节趋势 seasonal variation S 循环变动 cyclical variation
  • 西门子博图指令(计数器操作)

    计数器操作 综述 加计数 介绍 程序 程序演示 减计数 介绍 程序 程序演示 加减计数 介绍 程序 程序演示 源程序 综述 主要介绍博图V15中计数器功能块指令的相关操作 仿真PLC为1200系列 1 加计数 介绍 接口参数 声明 数据类型
  • Qt对Excel表格的自动化调用汇总(新建、打开和保存)

    为便于实时采集并保存数据到excel 需要调用QAxObject 首先定义变量excel workbooks workbook worksheets worksheet range 等 ifndef EXCEL H define EXCEL
  • riscv 指令集与寄存器

    文章目录 指令集 寄存器分类 RV64 和 RV32 有什么不同总览 指令集分类 base optional 内嵌汇编 参考文章 指令集 RV32指令集 和 RV64指令集 并不是单独的 一类指令集的集合 而很多类指令集的集合 RV32指令
  • Oracle12c中空格引发的ORA-01516问题

    2019 年 1 月 29 日 zabbix 显示一个索引表空间告警 所以登录服务器查看 10 02 22 SQL gt col file name for a50 10 02 42 SQL gt select file id tables
  • Java BigInteger用法详解

    在用C或者C 处理大数时感觉非常麻烦 但是在Java中有两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类 至于两个类的对象能表示最大范围不清楚 理论上能够表示无线大的数 只要计算机内存足够大 这两个类都在java
  • springboot项目避免脏读影响修改数据的几种方法

    文章目录 1 通过sql层面进行行锁 2 通过cas原则 compareAndSwapInt 进行自旋 3 通过synchronized锁住查询跟修改语句 4 通过分布式锁redission 1 通过sql层面进行行锁 1 Update时
  • 引用计数法和可达性分析算法

    一 引用计数法 给对象中添加一个引用计数器 每当有一个地方引用它时 计数器值就加1 当引用失效时 计数器值就减1 任何时刻计数器为0的对象就是不能再被使用的 引用计数法实现简单 判定效率也很高 但是它很难解决对象之间相互循环引用的问题 如下