深入理解Java虚拟机笔记---判断对象是否存活

高通camx ThreadManager m_pCore->AcceptNewJob是将一个Job或者任务插入一个Queue,有一个工作线程循环从Queue中取Job任务执行,执行任务就是回调任务中的callback函数,AcceptNewJob实现。调用AddToPriorityQueue将任务添加到queue任务队列,那么什么时候从这个queue中取任务执行呢?有个线程循环执行DoWork,最终调用checkAndDequeue取任务执行。 阅读详情

堆中几乎存放着Java世界中所有的对象实例,垃圾收集器在对堆回收之前,第一件事情就是要确定这些对象哪些还“存活”着,哪些对象已经“死去”(即不可能再被任何途径使用的对象)

1.引用计数算法

很多教科书判断对象是否存活的算法是这样的:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值加1;当引用失效时,计数器减1;任何时刻计数器都为0的对象就是不可能再被使用的。

引用计数算法(Reference Counting)的实现简单,判断效率也很高,在大部分情况下它都是一个不错的算法。但是Java语言中没有选用引用计数算法来管理内存,其中最主要的一个原因是它很难解决对象之间相互循环引用的问题。

例如:在testGC()方法中,对象objA和objB都有字段instance,赋值令objA.instance=objB及objB.instance=objA,除此之外这两个对象再无任何引用,实际上这两个对象都已经不能再被访问,但是它们因为相互引用着对象方,异常它们的引用计数都不为0,于是引用计数算法无法通知GC收集器回收它们。

public class ReferenceCountingGC {
    public Object instance = null;
    private static final int _1MB = 1024 *1024;
    /**
     * 只是为了占点内存
     */
    private byte[] bigSize = new byte[2 * _1MB];

<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(<span class="hljs-params">String[] args</span>) </span>{
    ReferenceCountingGC objA = <span class="hljs-keyword">new</span> ReferenceCountingGC();
    ReferenceCountingGC objB = <span class="hljs-keyword">new</span> ReferenceCountingGC();
    objA.instance = objB;
    objB.instance = objA;

    objA = <span class="hljs-literal">null</span>;
    objB = <span class="hljs-literal">null</span>;

    <span class="hljs-comment">//假设在这里发生GC,那么objA与objB是否会被回收</span>
    System.gc();

}

运行结果为:

[GC [DefNew: 234K->64K(960K), 0.0009447 secs][Tenured: 2125K->2189K(4096K), 0.0048757 secs] 2282K->2189K(5056K), [Perm : 365K->365K(12288K)], 0.0058659 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC (System) [Tenured: 4237K->141K(6148K), 0.0052656 secs] 4237K->141K(7108K), [Perm : 365K->365K(12288K)], 0.0052973 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
Heap
 def new generation   total 960K, used 18K [0x23b10000, 0x23c10000, 0x23ff0000)
  eden space 896K,   2% used [0x23b10000, 0x23b14818, 0x23bf0000)
  from space 64K,   0% used [0x23c00000, 0x23c00000, 0x23c10000)
  to   space 64K,   0% used [0x23bf0000, 0x23bf0000, 0x23c00000)
 tenured generation   total 6148K, used 141K [0x23ff0000, 0x245f1000, 0x27b10000)
   the space 6148K,   2% used [0x23ff0000, 0x240136b8, 0x24013800, 0x245f1000)
 compacting perm gen  total 12288K, used 365K [0x27b10000, 0x28710000, 0x2bb10000)
   the space 12288K,   2% used [0x27b10000, 0x27b6b578, 0x27b6b600, 0x28710000)
    ro space 8192K,  63% used [0x2bb10000, 0x2c023b48, 0x2c023c00, 0x2c310000)
    rw space 12288K,  53% used [0x2c310000, 0x2c977f38, 0x2c978000, 0x2cf10000)

在运行结果中可以看到GC日志中包含"4237K->141K",老年代从4273K(大约4M,其实就是objA与objB)变为了141K,意味着虚拟并没有因为这两个对象相互引用就不回收它们,这也证明虚拟并不是通过通过引用计数算法来判断对象是否存活的。大家可以看到对象进入了老年代,但是大家都知道,对象刚创建的时候是分配在新生代中的,要进入老年代默认年龄要到了15才行,但这里objA与objB却进入了老年代。这是因为Java堆区会动态增长,刚开始时堆区较小,对象进入老年代还有一规则,当Survior空间中同一代的对象大小之和超过Survior空间的一半时,对象将直接进行老年代。

2.根搜算法

在主流的商用程序语言中(Java和C#),都是使用根搜索算法(GC Roots Tracing)判断对象是否存活的。这个算法的基本思路就是通过一系列名为"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,如下图:

file

对象bject5, object6, object7虽然有互相判断,但它们到GC Roots是不可达的,所以它们将会判定为是可回收对象。
在Java语言里,可作为GC Roots对象的包括如下几种:

  • 虚拟机栈(栈桢中的本地变量表)中的引用的对象
  • 方法区中的类静态属性引用的对象
  • 方法区中的常量引用的对象
  • 本地方法栈中JNI的引用的对象
基于多智能体协作的量化交易研究框架TradingAgents详解 量化交易系统通过算法模型分析市场数据,旨在实现自动化投资决策。其核心原理在于利用计算机强大的数据处理能力,结合统计学和机器学习方法,从历史数据中挖掘可重复的盈利模式。这一技术的价值在于能够克服人类情绪干扰,实现纪律性交易,并快速处理海量信息。在应用场景上,量化策略广泛应用于股票、期货、外汇等多个金融市场。本文聚焦的TradingAgents框架,创新性地引入了**多智能体协作**和**对抗性验证**机制,通过模拟真实投研团队的分工与辩论流程,构建了一个研究友好、决策过程可解释的量化交易研究平台,为探索大语言 阅读详情

相关推荐

基于Python的携程景点评价爬虫与情感评分分析

摘要: 本项目通过Python技术栈实现携程景点评论的情感分析系统,包含数据爬取、文本预处理、情感评分和可视化分析全流程。使用requests抓取评论接口,jieba进行中文分词,SnowNLP计算情感得分(0-1),并通过词云、情感分布图呈现结果。典型分析显示72%评论为正面,负面反馈多涉及"排队久""票价贵"等问题。系统可辅助景点口碑管理,扩展方向包括多景点对比、BERT模型优化等。项目强调需遵守爬虫伦理,控制请求频率,适用于非商业用途的旅游数据分析。(150字)

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 978

《深入理解Java虚拟机》读书笔记:判断对象是否存活

本节内容的概要如下;对象已死吗?

Gefangenes的博客 114

LDPC码译码原理——概率公式推导

怎么说呢,一直以来都想写一下博客。近半年多来我一直在学习LDPC码译码上的东西,主要是在FPGA实现上的,所以这次想写一些关于这方面的内容,包括译码的原理、仿真以及实现。(当然是基于准循环LDPC码上实现的)不过呢,我写这个的初衷是为了让初学者理解入门用的,而不是在大牛面前班门弄斧,有错误之处欢迎大家批评指正。不知道会不会有人一开始像我一样,为了学好LDPC码,先去好好了解其它的诸如RS码或者是卷...

stand_by_me123的博客 2万+

深入理解java虚拟机学习笔记(4)——判断对象是否存活

判断对象是否存活 程序计数器,虚拟机栈,本地方方法栈这几个区域的内存分配和回收都具备确定性,当线程结束时,内存自然就跟着回收了。 Java堆和方法区这两个区域只有处于运行期,才能知道程序会创建哪些对象,创建多少对象,这部分内存的分配和回收是动态的。 目录判断对象是否存活一、引用计数算法二、可达性分析算法二、 一、引用计数算法 示例:111 二、可达性分析算法 二、 ...

pushen3584的博客 189

MT4-EA自动化交易研究笔记(2022-04-22)

自从接触到mt4的EA自动化交易,更让我这个10多年的老程序员看到了曙光,目前来看也确实出了一点成果,只是是否能稳定盈利有待时间的考验,所以开此专栏,一来做做记录与分析,更好的优化我的EA,二来也希望能与更多的高手交流,以完善我的交易系统

t35254056的博客 2291

微带功分器设计与ADS-EM联合仿真实战解析

本文详细解析了微带功分器设计与ADS-EM联合仿真的实战技巧,涵盖特性阻抗计算、ADS原理图设计、版图生成与EM仿真等关键步骤。通过实际案例分享,帮助工程师掌握射频电路设计中的核心技术和调试方法,提升功分器设计效率与性能。

weixin_29280219的博客 452

深入理解java虚拟机学习笔记 - java 虚拟机判断一个对象是否存活

java 虚拟机判断一个对象是否存活 判断一个对象是否存活依赖就是该对象是否被引用,下面主要介绍两种方法。 引用计数算法 给对象添加一个引用计数器,当对象被引用的时候计数器加1,当引用失效的时候计数器减1,当计数器为0的时候说明该对象没有被引用。 优点 实现起来比较简单 缺点 无法解决循环依赖的问题,A a = b; B b = a; 可达性分析算法 为了解决上述的遗留问题,即解...

微信公众号《后端学长》 230

Minio HTTPS证书配置实战:从申请到部署全流程

本文详细介绍了Minio HTTPS证书配置的全流程,从申请到部署,确保对象存储服务的安全性。内容包括证书类型选择、文件处理、服务配置调整及常见问题解决,帮助用户在生产环境中快速实现HTTPS加密传输,提升数据安全。

weixin_42638178的博客 433

判断Java对象是否存活的方法

0. 前言本文参考于《深入理解Java虚拟机:JVM高级特性与最佳实践》堆中几乎存放着Java世界中所有的对象实例,垃圾收集器在对堆回收之前,第一件事情就是要确定这些对象哪些还“存活”着,哪些对象已经“死去”(即不可能再被任何途径使用的对象),哪用什么办法去确认这些对象存活与否。在主流的商用程序语言中(Java和C#等),都是使用可达性分析算法(Reachability Analysis)来判断对象

腹黑大壁花 3477

使用STM32H7点亮RGB屏幕

希望本文能对你有所帮助!RGB屏幕是一种具有红、绿、蓝三种颜色通道的显示设备,通过控制每个通道的亮度,可以显示出丰富多彩的图像和动画。要使用STM32H7控制RGB屏幕,我们需要连接适当的引脚,并编写适当的代码来控制每个颜色通道的亮度。在主循环中,我们先点亮红色通道,然后延迟一段时间,接着点亮绿色通道,再延迟一段时间,最后点亮蓝色通道,并再次延迟。需要注意的是,示例代码中的延迟循环使用了一个简单的计数器实现,但实际应用中可能需要更精确的延迟方式,例如使用定时器中断或操作系统提供的延迟函数。

QoyOle的博客 925

Windows Server 2019 服务器一天之中内存利用率越来越高直到死机,疑似内存泄漏

环境: 华为桌面云虚拟机 Windows Server 2019 版本1809 OS内部版本17763.107 问题描述: Windows Server 2019服务器 一天之中内存利用率越来越高直到死机,不断扩容内存从10G到16G一重启就正常然后慢慢又循环,连续几天都这样,疑似内存泄漏 内存泄漏是什么? 内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪

本博客,博文仅代表个人操作经验,不能完全解决你的问题,仅供参考,佛系回复。 5394

JVM如何判断Java对象是否存活,是否要被GC回收?

GC在对堆内存进行垃圾清理之前,需要判断哪些Java对象不再被使用,需要被回收。通常有两种算法:引用计数算法、可达性分析算法。 引用计数算法(已被淘汰) 引用计数算法:在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。 存在的问题:主流的Java虚拟机里面都没有选用引用计数算法来管理内存,因为单纯的引用计...

西瓜游侠的博客 1505

cartographer运行错误集合

播放bag的时候错误 Check failed: sensor_to_tracking->translation().norm() < 1e-5 The IMU frame must be colocated with the tracking frame. Transforming linear acceleration into the tracking frame will otherwise be imprecise tracking frame不是imu的link 修改lua文件中的.

Studying…… 2029

如何判断对象是否存活

1.如何判断对象是否存活 1.1引用计数法 给对象中添加一个 引用计数器,每当有一个地方引用它时,计数器值+1,当引用失效时,计数器值-1。任何时刻计数器值为0的对象就是不可能再被使用的。但是这个方法有个问题不能解决:就是当两个对象相互引用时,他们的计数器值永远不会变成0,导致两个对象无法被回收。 1.2可达性分析算法 在主流的商用程序语言(Java、C#)的主流实现中,都是称通过可达性分析来判...

万事胜意 1186

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

如何判断一个对象是否存活?(或者GC对象的判定方法)?

这个问题,面试被问到的概率还是很大的。以下关于如何判断一个对象是否存活的回答,完全参照《深入理解Java虚拟机》一书,有需要的可以看书学习。以下是题目解析 判断对象是否存活的算法包括: 引用计数算法 可达性分析算法 问题的回答就是通过引用计数算法或者可达性分析算法去判断一个对象是否存活,下面开始具体描述这两种算法。 引用计数算法(Reference Countin...

知识分享 2688

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

深入理解Java虚拟机之判断对象是否存活算法

判断对象是否存活算法 引用计数法 给对象添加一个引用计数器,每当有一个地方引用它时,计数器就加1;当引用失效时,计数器就减1;任何时刻计数器为0的对象就是不可能再被使用的. 引用计数法的实现简单,判断效率很高,.**但主流的Java虚拟机并没有选用引用计数法来管理内存,主要原因是它很难解决对象之间相互循环引用的问题. public class Test{ private Object ...

可苯的博客 286

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

深入理解Java虚拟机——判断对象是否存活

目录一、判断对象是否存活的方式二、引用计数法2.1、引用计数法的概述2.2、引用计数法的缺点2.3、查看对象是否被回收掉三、可达性分析3.1、可达性分析的概述3.2、GC Roots的对象的概述 一、判断对象是否存活的方式 引用计数法 可达性分析 二、引用计数法 2.1、引用计数法的概述 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1; 任何时刻计数器为0的对象就是不可能再被使用的。 2.2、引用计数法的缺点 至少主流的java虚拟机里面没有选用引

小志的博客 793

深入理解Java虚拟机之判断对象是否存活

深入理解Java虚拟机之判断对象是否存活       我们知道Java虚拟机中对象的存储位置在堆上,所以GC回收主要也就是在堆上进行的,那么垃圾收集器在进行对象回收的时候肯定不能随便收集,必须要判断对象的状态是不是可以被收集,也就是说对象是不是已经“死亡”?那么垃圾收集器是如何判断对象是否已经死亡呢?        在Java虚拟机中判断对象是否死亡有两中算法,分别是引用计数算法和可达性分析算法。

国世的博客 1666

【跳槽面试】如何判断一个对象是否存活?(或者GC对象的判定方法)?

这个问题,面试被问到的概率还是很大的。以下关于如何判断一个对象是否存活的回答,完全参照《深入理解Java虚拟机》一书,有需要的可以看书学习。以下是题目解析判断对象是否存活的算法包括:引用计数算法可达性分析算法问题的回答就是通过引用计数算法或者可达性分析算法去判断一个对象是否存活,下面开始具体描述这两种算法。例如Object-C,Python语音使用引用计数算法进行内存管理。Java虚拟机没有选用引用计数器算法来管理内存,其中最主要的原因是它很难解决对象之间相互循环引用的问题。

技术分享 928

【26期】如何判断一个对象是否存活?(或者GC对象的判定方法)?

程序员的成长之路互联网/程序员/技术/资料共享关注阅读本文大概需要 3分钟。来自:www.jianshu.com/p/09a574dcd5df这个问题,面试被问到的概率还是很大的。以...

良月柒 703

虚拟机对象是否存活

在堆里面存放真java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是确定这些对象之中哪些还“存活”着,哪些已经“死去”。 可达性分析算法: 这个算法的基本思路:通过一系列的称为“GC Roots&amp;amp;amp;amp;amp;amp;amp;quot;的对象作为起始点,从这个结点开始向下搜索,搜索

手写ArrayList 187

如何判断一个对象是否存活

这个问题,面试被问到的概率还是很大的。以下关于如何判断一个对象是否存活的回答,完全参照《深入理解Java虚拟机》一书,有需要的可以看书学习。以下是题目解析判断对象是否存活的算法包括:引用计数算法可达性分析算法问题的回答就是通过引用计数算法或者可达性分析算法去判断一个对象是否存活,下面开始具体描述这两种算法。例如Object-C,Python语音使用引用计数算法进行内存管理。Java虚拟机没有选用引用计数器算法来管理内存,其中最主要的原因是它很难解决对象之间相互循环引用的问题。

z_ssyy的博客 230

深入理解Java虚拟机-判断对象是否存活算法与对象引用

在之前的文章中我们谈到过Java内存区域的概念,我们知道Java中的对象一般存放在堆中,但是总不能让这些对象一直占着内存空间,这些对象最终都会被回收并释放内存,那么我们如何判断对象已经成为垃圾呢?这篇文章会提出两种算法解决这个问题。另外,本文还要谈一谈对象引用相关的知识,这在面试中也是经常被问到的问题。 判断对象是否存活算法 引用计数算法 引用计数算法的原理比较简单,在对象中添加一个引用计数器,当有一个引用指向一个对象时,这个对象的引用计数器会加1,当引用不再指向对象时,引用计数器便减1。当引用计数器的值

技术进阶之路 310

面试官:如何判定一个对象是否存活?

​ 在进行垃圾回收之前,第一件要做的事情就是要判断哪些对象还存活着,以便于回收非存活状态的对象。那如何去判断一个对象是否存活呢? ​ 本文带领大家深入探究两种算法,再也不需要应付面试了,深入了解底层逻辑后,你将完全掌握如何判定对象是否存活。 引用计数算法 ​ 每一个对象都会添加一个引用计数器,当有一个地方引用它时,该对象的引用计数器就加1,当不引用的时候,该计数器减1,当计数器为0的时候,就代表该对象不可能再被使用。 String str = new String("this is a string");

KnightHONG的博客 916

jvm判断对象是否存活的算法

参考书籍《深入理解Java虚拟机》周志明 1,引用计数算法 在对象中添加一个引用计数器,每当一个地方引用它时,计数器就加1,引用失效时计数器就减1,任何时刻计数器为0的对象就是不可能再被使用的对象。 在Java主流虚拟机中没有选择这一算法管理内存,原因是引用计数算法有很多例外情况要考虑,必须要配合大量额外处理才能保证正确的工作,单纯的使用引用计数就会很难解决对象之间循环引用的问题。 2,可达性分析算法 当前主流的程序语言的内存管理子系统都是通过可达性分析算法来判定对象的存活与否 基本思路是通过一系列称为GC

aigezi_cdd的博客 334
上一篇: 生产环境中,如何提升springboot服务吞吐量
大盛玩java
博客等级 码龄5年 0粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值