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

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
  • 在Linux虚拟机上安装QT

    一 安装虚拟机 运行VMware workstation full 11 1 0 2496824 exe 二 在虚拟机上安装Linux 1 下载Ubuntu桌面版 从官网进入 选择 桌面版 按照提示进行下载 国内的一个镜像网址是 http
  • 虚拟机安装遇到的一个问题

    我是r7000p用户 由于工作需要 安装了一个虚拟机 安装了VMware Workstation Pro 15 5 0 然后安装了Linux系统 安装成功之后 准备开启虚拟机 但是系统安装过程中出现电脑重启 多次均出现重启现象 到这个界面就
  • 彻底删除VMware虚拟机

    您是否和我一样被VMware气到了呢 您是否再也不想理VMware了呢 您是否不想再在自己电脑上看到VMware这几个英文字母了呢 来吧 跟着我的步骤 一起和VMware说拜拜吧 一 在卸载VMware虚拟机之前 要先把与VMware相关的
  • vaware上安装Linux详细步骤(Slackware10.2)

    环境 HostOS Win2K SP4 GuestOS Slackware10 2 VMware Workstation 5 5 1 b19175 1 建立虚拟机 在VMware上新建一个2 4 x内核的Linux虚拟机 因为Slackwa
  • Win10系统安装使用H3C HCL实验室(最新版)方法

    如果安装了wsl2虚拟机的 首先参照此教程将wsl版本降为1 https blog csdn net qq 26123545 article details 120169070 spm 1001 2014 3001 5501 如果之前的HC
  • ESXi6.5中将虚拟机从厚置备转换为精简置备

    用ESXi做虚拟化 创建了一个原始虚拟机并安装好系统做好基本设置 使用ESXi的web界面复制虚拟机 结果后来发现复制出来的都是厚置备 导致占用大量空间 网上找到一篇教程 但不够清晰 遂有此文 首先要通过ssh连接虚拟机 0 删除需要转换磁
  • 主机与VMware的Linux虚拟机之间共享交换文件

    搭建环境 主机系统 Windows7 Ultimate VM软件 VMware Workstation 7 1 3 虚拟机系统 Linux Ubuntu 10 10 操作步骤 1 在主机上新建一个共享路径 用于将来和虚拟机之间进行共享文件
  • 群晖虚拟机部署线上恋爱网站

    文章目录 前言 1 安装网页运行环境 1 1 安装php 1 2 安装webstation 2 下载网页源码文件 2 1 访问网站地址并下载压缩包 2 2 解压并上传至群辉NAS 3 配置webstation 3 1 配置网页服务 3 2
  • 虚拟机出现错误:“无法连接MKS:套接字连接尝试次数太多,正在放弃“,无法进入系统的解决方法

    开发环境 我在windows上使用的是VMware Workstation 14 Pro Ubuntu16 04的组合进行开发 原因 自从将vm从12pro升级成了14pro之后就出现了这种问题 应该是14pro版本本身还有些问题吧 解决方
  • android studio安装automotive模拟器

    添加源 打开android studio的SDK Manager 选择SDK Update Sites选项卡 点击Add 弹出地址设置界面 添加polestar2 sys img Name填写 Polestar 2 System Image
  • 【xenclient】 使用小结 -- ubuntu的千百bug

    说道多系统 不能不提下ubuntu 以前redhat似乎是linux的领头羊 但在桌面领域 跟windows还是差得太远 在linux最弱的桌面特性上 ubuntu算是第一个以桌面特效全面超越windows的系统了 因此我的系统 除了保留做
  • 【WIN_server_2008】实现【Web服务器】的安装与配置

    1 网络互通 一 WIN7 WIN 2008 WIN10菜单栏 编辑 虚拟机网络编辑器 VMnet1 如上篇文章设置 二 WIN7 WIN 2008 虚拟机设置 网络适配器 如下图配置 三 WIN7 WIN 2008 WIN10的IP 子网
  • VMware安装后打开就蓝屏

    VMware虚拟机开机蓝屏 追风 80 人赞同了该文章 目录 收起 一 查看主板上的虚拟化技术支持是否开启 二 开启虚拟机平台 如果在新建的虚拟机安装好后一点开机出现蓝屏 反复重装并且确定了新建虚拟机没有出错的情况下考虑是否是虚拟化没有开启
  • 【高级篇 / FortiGate-VM】(6.4) ❀ 02. 安装并启用 FortiGate VM ❀ FortiGate 防火墙

    怎么启用VMware FortiGate VM虚拟机 VMware FortiGate VM虚拟机第一次配置要怎么才能启用 首先 你需要下载到VMware FortiGate VM虚拟机文件 在D盘根目下新建一个子目录 例如FortiGat
  • java常见面试题及答案 11-20(JVM)

    11 JVM内存分哪几个区 每个区的作用是什么 java虚拟机主要分为以下一个区 方法区 1 有时候也成为永久代 在该区内很少发生垃圾回收 但是并不代表不发生GC 在这里进行的GC主要是对方法区里的常量池和对类型的卸载 2 方法区主要用来存
  • 将Hypert-V转化为VM虚拟机

    一 准备工具 V2V Converter P2V Converter Converting VM Formats 二 操作步骤 第一步 选中要转化的镜像 第二步 选择目标的镜像格式 第三步 选择生成目录 完成后点击Finish 第五步 打开
  • kvm环境创建虚拟机

    使用libvirt的xml配置文件创建虚拟机 kvm支持的镜像很多 常用的是原始镜像 img 还有支持动态大小扩张的qocw2格式 首选 更优的选择是系统盘如C盘用img格式 数据盘用qcow2格式以减少服务器磁盘闲置空间 本文仅记录如何用
  • VirtualBox虚拟机网络连接设置的四种方式

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

    报错内容如下图所示 当前硬件版本不支持设备 nvme 未能启动虚拟机 我们首先在帮助里面查看VMware的版本 我这里是16 打开报错的虚拟机文件夹 找到镜像文件 vmx文件 使用记事本 文本编辑器 打开 找到 virtualhw vers

随机推荐

  • 温室气体数据记录软件

    温室气体数据记录软件用于记录温室气体分析仪 冷阱系统 阀箱以及采样单元数据的获取及记录 其软件界面如下 在软件操作几面上部是工具栏 可以实现软件的各种操作 工具栏的排布如下所示 最左侧为 连接 工具 用于整体连接所有设备 包括分析仪 冷阱
  • 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的对象就是不能再被使用的 引用计数法实现简单 判定效率也很高 但是它很难解决对象之间相互循环引用的问题 如下