当前位置: 首页 > news >正文

JVM中判断对象是否需要回收的方法

        在堆里面存放着Java 世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“ 存活 着,哪些已经 死去 ”。

引用计数算法


引用计数法是一种内存管理技术,它是通过对每个对象进行引用计数来判断对象是否可以被释放的。

基本思想是:每一个对象都有一个计数器,当有一个新的指针指向该对象时,该对象的计数器增加1;当有一个指针不再指向该对象时,该对象的计数器减少1。当对象的计数器为0时,说明该对象没有被任何指针引用,即该对象已经没有被使用,可以被释放。

引用计数法的优点是实现简单、实时性高。它可以较快地释放不再使用的对象,因为只需要在对象引用数为0时立即释放该对象,不需要等待垃圾回收器运行。

然而,引用计数法也存在一些缺点。一个常见的问题是循环引用,即两个或多个对象相互引用,导致它们的引用计数器永远不会为0,这样就会导致内存泄漏。解决循环引用问题需要引入其他的垃圾回收算法,比如标记-清除、复制和标记-整理等算法。同时,引用计数还可能会对程序的性能产生一定的影响,因为需要维护每个对象的引用计数器,这会增加程序的开销。

可达性分析算法


可达性分析算法是现代垃圾回收器常用的算法之一。其基本思想是通过一系列扫描操作,检查每个对象与根对象之间是否存在引用链,如果不存在引用链,则说明该对象已经没有被使用,可以被释放。

在可达性分析算法中,根对象是指一些已知的存在于内存中的对象,如全局变量、静态变量和栈中的变量等。垃圾回收器通过对根对象的扫描,检查每个根对象是否引用了其他对象,如果引用了,则对被引用的对象进行标记。然后对所有被标记的对象再进行扫描,检查它们是否引用了其他对象,如果引用了,则对被引用的对象进行标记。依此类推,直到所有可到达对象都被标记为活动对象,未被标记的对象则可以被视为垃圾对象,可以进行回收。

可达性分析算法的优点是能够精确地确定哪些对象可以被回收。同时,该算法具有较好的扩展性,可以应用于分代垃圾回收、增量垃圾回收、并行垃圾回收等多种垃圾回收方案。

然而,可达性分析算法也存在一些缺点。首先,该算法需要对所有对象进行扫描,因此时间复杂度较高,可能会影响程序的性能。其次,该算法无法处理循环引用的情况,即当两个或多个对象相互引用时,无法确定它们是否应该被回收。因此,可达性分析算法需要与其他垃圾回收算法配合使用,如引用计数法、标记-清除、复制和标记-整理等算法,以便实现更高效的垃圾回收。

相关文章:

  • STM32F10x进入低功耗模式
  • HuggingFace-利用BERT预训练模型实现中文情感分类(下游任务)
  • 机器学习与计算机视觉 D2
  • 能否在一台电脑上安全地登录多个Facebook账号?
  • AI“胡说八道”?怎么解?
  • 前端JS模块化对外暴露的三种方法
  • Linux C 基于tcp和epoll在线聊天室
  • SpringCloud原理-OpenFeign篇(一、Hello OpenFeign项目示例)
  • PS 计数工具 基础使用方式讲解
  • 如何更有效地进行薪酬调查?
  • Virutalbox安装ubuntu22.04手把手教学
  • 大话java异常家族-检查与非检查
  • redis非关系型数据库(缓存型数据库)——中间件
  • 线性空间(也叫向量空间)、线性运算
  • 内存屏障与JVM指令
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 《Java编程思想》读书笔记-对象导论
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • css布局,左右固定中间自适应实现
  • httpie使用详解
  • input实现文字超出省略号功能
  • java2019面试题北京
  • js对象的深浅拷贝
  • leetcode-27. Remove Element
  • MYSQL 的 IF 函数
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • nodejs:开发并发布一个nodejs包
  • Vue UI框架库开发介绍
  • vue 配置sass、scss全局变量
  • Vue.js 移动端适配之 vw 解决方案
  • 分类模型——Logistics Regression
  • 前端技术周刊 2019-01-14:客户端存储
  • 探索 JS 中的模块化
  • 听说你叫Java(二)–Servlet请求
  • 携程小程序初体验
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​第20课 在Android Native开发中加入新的C++类
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • ![CDATA[ ]] 是什么东东
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (+4)2.2UML建模图
  • (27)4.8 习题课
  • (六)vue-router+UI组件库
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)nsfocus-绿盟科技笔试题目
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET gRPC 和RESTful简单对比
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .Net6使用WebSocket与前端进行通信