JVM中判断无效对象算法

这篇具有很好参考价值的文章主要介绍了JVM中判断无效对象算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

JVM 内存大致分为 线程私有区域线程共享区域

虚拟机栈、本地方法栈和程序计数器,这三个区域是线程私有的。

虚拟机栈用于描述Java方法执行的过程。每一个方法在执行的过程中会创建一个栈帧。栈帧中包括局部变量、操作数栈、动态链接和方法出口等信息。当方法执行完成后,对应的栈帧就会弹栈。虚拟机栈的内存分配是确定的,所以不需要特别关注虚拟机栈及其他线程私有区域的内存使用情况。

方法区和堆是线程共享区域。方法区和堆主要存放对象、数组等不确定数量的数据。在方法执行的过程中创建的对象数量是不确定的。所以需要合理的内存管理机制来管理这两个区域。方法区和堆内存是垃圾回收器进行垃圾回收的主要区域。

内存中的垃圾

在程序运行过程中,会创建对象,但是当方法执行完成或对象不再使用时,它们被定义为"垃圾"。此时,需要通过垃圾回收器来清理这些内存区域。为了将"垃圾"量化成计算机语言,我们需要设计一套算法供垃圾回收器使用。垃圾回收的动作是由垃圾回收器自动运行和判定的。

判断一个对象是否为垃圾

常见的算法有两种:引用计数算法和根搜索算法。

引用计数算法(Reference Counting Collector)

在该算法中,每个对象都会有一个引用计数器。当对象被引用时,计数器会增加;当引用失效时,计数器会减少。当计数器为零时,意味着对象不再被引用,可以进行回收。

这种算法简单且高效,判定过程相对容易。然而,它存在一个致命的缺点,即无法处理循环引用的情况。当两个对象相互引用时,它们的计数器永远不会变为零,导致内存泄漏。因此,引用计数算法在早期的 JVM 中使用较多,但现在已经较少使用。

根搜索算法(Tracing Collector)

根搜索算法的核心思想,就是从某一些指定的对象出发,寻找与该根对象具有引用关系的对象,然后再从这些对象开始继续寻找,形成一个个的引用链。不在引用链上的对象被标记为引用不可达对象。

那么哪些对象可以叫做根对象呢?

  • 虚拟机栈中引用的对象
  • 方法区中常量引用的对象
  • 方法区中静态属性引用的对象
  • 本地方法栈中JNI(Native方法)引用的对象
  • 活跃线程

上述算法只是一个算法的中心思想,实际执行过程要比这个复杂的。另外,GC判断对象是否可达看的还是强引用。

  1. 进行根搜索的时候,是需要暂停所有线程的,即执行一次 STW(Stop The World),最主要的目的是防止上述的对象图在算法运行的过程中有变化从而影响算法的准确性。

  2. 线程暂停的时间长短,取决于对象的多少,和堆内存的大小无关。

  3. 宣告一个对象的“死亡”其实不仅仅通过上述的算法计算,而是需要经历两次的标记,本文暂不进行赘述。文章来源地址https://www.toymoban.com/news/detail-526103.html

到了这里,关于JVM中判断无效对象算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Jvm对象回收算法-JVM(九)

    上篇文章介绍了jvm运行时候对象进入老年代的场景,以及如何避免频繁fullGC。 Jvm参数设置-JVM(八) 老年代分配担保机制 这个机制的目的是为了提升效率,在minorGC之前,会有三次判断,之后再次minorGC速度会很快。 老年代剩余空间是否 大于 年轻代里现在所有对象 大于的话则

    2024年02月13日
    浏览(52)
  • 【Java】图解 JVM 垃圾回收(一):GC 判断策略、引用类型、垃圾回收算法

    垃圾 是指运行程序中 没有任何引用指向的对象 ,需要被回收。 内存溢出 :经过垃圾回收之后,内存仍旧无法存储新创建的对象,内存不够溢出。 内存泄漏 :又叫 “ 存储泄漏 ”,对象不会再被程序使用了,但是 GC 又不能回收它们。例如:IO 流不适用了但是没有被 Close、

    2024年02月19日
    浏览(47)
  • JVM零基础到高级实战之对象存活算法引用计数法存在的特点分析

    JVM零基础到高级实战之对象存活算法引用计数法存在的特点分析 JVM零基础到高级实战之对象存活算法引用计数法存在的特点分析 优点 引用计数收集器可以很快的执行,交织在程序运行中。对程序需要不被长时间打断的实时环境比较有利。 缺点 无法检测出循环引用。如父对

    2024年02月15日
    浏览(94)
  • Jvm创建对象之内存分配-JVM(七)

    上篇文章介绍了jvm创建,会校验是否已加载类,没有则加载,通过之前学的源码,classLoader加载完之后,虚拟机开始给类分配内存,指针移动分配和free链表分配,解决并发分配情况用cap和TLAB方法。之后设置对象头部信息,有mark word线程锁,分代年龄等,klass pointer。还有指针

    2024年02月13日
    浏览(68)
  • JVM-JVM中对象的结构

    对象内存布局 对象里的三个区: 对象头(Header):Java对象头占8byte。如果是数组则占12byte。因为JVM里数组size需要使用4byte存储。 标记字段MarkWord: 用于存储对象自身的运行时数据,它是synchronized实现轻量级锁和偏向锁的关键。 默认存储:对象HashCode、GC分代年龄、锁状态等

    2024年02月20日
    浏览(41)
  • JVM-JVM中对象的生命周期

    申明:文章内容是本人学习极客时间课程所写,文字和图片基本来源于课程资料,在某些地方会插入一点自己的理解,未用于商业用途,侵删。 原资料地址:课程资料 对象的创建 常量池检查 :检查new指令是否能在常量池中定位到这个类的符号引用,检查类之前是否被加载过

    2024年02月20日
    浏览(42)
  • JVM系列(六) JVM 对象终结方法finalize

    我们有几个特别容易混淆的final、finally、finalize, 他们之间的区别是什么? final 是java finally 是try-catch-finally finalize 是Object 根类的方法 今天我们着重讲下 finalize方法 1.finalize方法的原理及调用 finalize方法也是Java中所有类中必有的方法,因为它是属于Object根类的方

    2023年04月08日
    浏览(37)
  • jvm之对象大小分析

    本文看下计算对象大小相关内容。 一个对象由对象头和对象体组成,其中对象头包含如下内容: 对象体存储的是具体的对象内容以及内部padding: 当对象头和对象体的总大小不是8byte的整数倍时需要通过外部aligment来填充到整数倍,整体结构如下: 因此就算是一个空对象其大

    2024年02月06日
    浏览(38)
  • 四、JVM-对象内存模型

    一个Java对象在内存中包括3个部分:对象头、实例数据和对齐填充 数据 内存 – CPU 寄存器 -127 补码 10000001 - 11111111 32位的处理器 一次能够去处理32个二进制位 4字节的数据 64位操作系统 8字节 2的64次方的寻址空间 指针压缩技术 JDK1.6出现的 开启了指针压缩 什么时候指针压缩会

    2024年02月14日
    浏览(32)
  • JVM 对象引用类型

    对象引用类型分为强引用、软引用、弱引用和虚引用。 强引用         声明对象时虚拟机生成的引用,是指在程序代码之中普遍存在的引用赋值。强引用环境下,垃圾回收时需要严格判断当前对象是否被强引用,如果被强引用,则不会被垃圾回收,当内存空间不足的时候

    2024年02月09日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包