首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

即使父对象的一个子对象被根线程引用,从GC根线程访问的父对象对于Java GC也是不可接受的吗?

是的,即使父对象的一个子对象被根线程引用,从GC根线程访问的父对象对于Java GC也是不可接受的。

在Java中,垃圾回收器(GC)通过标记-清除算法来回收不再被引用的对象。GC根线程是一个特殊的线程,它负责标记所有活动对象,并清除未被标记的对象。

如果父对象的一个子对象被根线程引用,那么父对象仍然被认为是活动对象,不会被GC回收。这可能导致内存泄漏,因为即使子对象不再被使用,父对象也无法被回收。

为了避免这种情况,可以使用弱引用(Weak Reference)或软引用(Soft Reference)来引用父对象。这些引用类型在GC回收时会被自动清除,从而允许父对象被回收。

弱引用适用于那些只在某些情况下需要被引用的对象,而软引用适用于那些需要在内存不足时被回收的对象。

腾讯云提供了一系列云计算产品,如云服务器、云数据库、云存储等,可以满足各种应用场景的需求。您可以访问腾讯云官网了解更多产品信息:https://cloud.tencent.com/

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JVM之JVM初探

垃圾回收的时候就不会回收这两个对象,但是除此之外没有其他引用指向这两个对象。 循环引用会导致即使外界已经没有任何指针能够访问他们了,但是他们所占资源仍然无法释放的情况。...2.GC Root(根可达算法) 上面的算法无法解决循环引用问题,如果这个时候规定一些永远不会被回收的对象只要能被这些对象引用,那么就不是垃圾,这个时候就是GC Root的算法。...这个向上找的链叫做引用链,和GcRoot没有任何链接的称为“垃圾” **一般而言可以作为Gc Root根节点的有:方法区静态信息,方法区常量信息,Java虚拟机栈所引用的对象,本地方法栈所引用对象。...3.加载该类的ClassLoader已经被回收 关于回收的那些事 1.当触发GC时,对象被标记为垃圾就一定会被回收吗? 2.GCRoots就是固定的那些值吗?...提示:JAVA中并不提倡重写这个方法,最初是因为C和C++的人更容易接受JAVA。

51410

JVM(完结)

,用于记录对象被引用的情况 对于一个对象,引用 计数器 加1,否则减1 只要对象的引用计数器值为0.即表示 不可能再被使用,可进行回收。...** 一个严重的问题,既无法 处理循环引用的情况,这是一条致命的缺陷,导致java的垃圾回收器重没有使用这类算法 15.2可达性分析算法 可迭代分析算法: 也可以成为根算法,追踪性垃圾回收 相对于引用计数器算法来说...,内存中存活对象都会被跟对象集合直接或间接链接着,搜索所走过的路径称为链引用 如果目标对象没有被任何引用链相连,则不可达,就意味着该对象已经死亡 在可达性分析算法中,只有能够被根对象集合直接或者间接连接的对象才是存活对象...,就会停止整个程序,然后经行两项工作,第一项就是标记,第二项清除 标记:Collector从引用根节点开始遍历, 标记所有被引用的对象,一般时子啊对象的header 中记录为可达对象(注意: 标记的是被引用的对象...所以现在的商业虚拟机都是用这种收集算法回收新生代。 ? 标记-压缩算法 第一阶段和标记清除算法一样,从根节点开始标记所有被引用对象 第二阶段将所有的存活对象压缩到内存的一端,按顺序排放。

48030
  • 2019年JVM最新面试题,必须收藏它

    PDM更好的保证了Java平台的安全性,在该机制中,JVM自带的Bootstrap是根加载器,其他的加载器都有且仅有一个父类加载器。...理论上Java因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是Java被广泛使用于服务器端编程的一个重要原因);然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,因此也会导致内存泄露的发生...如果一个对象引用被无意识的保留起来了,那么垃圾回收器不会处理这个对象,也不会处理该对象引用的其他对象,即使这样的对象只有少数几个,也可能会导致很多的对象被排除在垃圾回收之外,从而对性能造成重大影响,极端情况下会引发...当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,不可达对象。 16、JVM的永久代中会发生垃圾回收么?...请参考下Java8:从永久代到元数据区 (注:Java8中已经移除了永久代,新加了一个叫做元数据区的native内存区) 17、引用的分类 强引用:GC时不会被回收 软引用:描述有用但不是必须的对象,在发生内存溢出异常之前被回收

    63340

    聊到JVM(还怕面试官问JVM吗?)

    根加载器加载拓展类加载器,并且将拓展类加载器的父加载器设置为根加载器, 然后再加载应用程序加载器,应将应用程序加载器的父加载器设置为拓展类加载器 由于引导类加载器涉及到虚拟机本地实现细节,我们无法直接获取到启动类加载器的引用...防止重复加载同一个.class。通过不断委托父加载器直到根加载器,如果父加载器加载过了,就不用再加载一遍。保证数据安全。 2. 保证系统核心.class,如上述的String类不能被篡改。...java中的安全模型演进 在Java中将执行程序分成本地代码和远程代码两种 本地代码可信任,可以访问一切本地资源。 远程代码不可信信在早期的Java实现中,安全依赖于沙箱 (Sandbox) 机制。...虚拟机为不同的类加载器载入的类提供不同的命名空间,命名空间由一系列唯一的名称组成,每一个被装载的类将有一个名字,这个命名空间是由Java虚拟机为每一个类装载器维护的,它们互相之间甚至不可见。...8大基本类型 对象引用 实例的方法 2、栈运行原理 栈表示Java方法执行的内存模型 每调用一个方法就会为每个方法生成一个栈帧(Stack Frame),每个方法被调用和完成的过程,都对应一个栈帧从虚拟机栈上入栈和出栈的过程

    1.2K30

    【JavaEE初阶】了解JVM

    (此说法不完全对).私有的意思是我的你用不了.实际上,一个线程栈上的内容,可以被另一个线程使用.比如通过变量捕获,一个线程可以访问到另一个线程的局部变量....引用计数(不是java的做法,Python/PHP) 给每个对象分配了一个计数器(整数).每次创建一个引用指向该对象,计数器就+1,每次该引用被销毁,计数器就-1. { Test t = new Test...可达性分析(Java的做法) 把对象之间的引用关系理解成了一个树形结构,从一些特殊的起点出发,进行遍历,只要能遍历访问到的对象,就是"可达的",再把"不可达的"当作垃圾即可....,总的来所,就是从所有的gcroots的起点出发,看看该对象里又通过引用能访问那些对象,依次遍历,把所有可以访问的对象都给遍历一遍(遍历的同时把对象标记成"可达"),剩下的遍历不到的对象就是"不可达"....上述规律,对于Java的对象也是有效的.(是有一系列的实验和论证过程) java的对象要么就是生命周期特别短,要么就是特别长.根据生命周期的长短,分别使用不同的算法. 给对象引入一个概念,年龄.

    30120

    JVM面试题,看这篇就足够了(87题详解)

    20、堆(Heap-线程共享) -运行时数据区 是被线程共享的一块内存区域, 创建的对象和数组都保存在 Java 堆内存中,也是垃圾收集器进行垃圾收集的最重要的内存区域。...当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收机制回收的,即使该对象以后永远都不会被用到 JVM 也不会回收。因此强引用是造成 Java 内存泄漏的主要原因之一。...并发清除 清除 GC Roots 不可达对象,和用户线程一起工作,不需要暂停工作线程。...各种虚拟机实现的内存布局可以各不相同,但是它们能接受的符号引用必须是一致的,因为符号引用的字面量形式明确定义在 Java 虚拟机规范的 Class 文件格式中。...当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,不可达对象。

    8.4K42

    面试重点:Java虚拟机常见问题详解

    三、Java对象在内存中的状态: 可达的/可触及的: Java对象被创建后,如果被一个或多个变量引用,那就是可达的。即从根节点可以触及到这个对象。...2、根搜索算法:(jvm采用的算法) 设立若干种根对象,当任何一个根对象(GC Root)到某一个对象均不可达时,则认为这个对象是可以被回收的。...3、标记-整理算法:(老年代的GC) 标记阶段:先通过根节点,标记所有从根节点开始的可达对象。...CMS收集器是一个被认为具有划时代意义的并发收集器,因此如果有一个垃圾收集器能和它一起搭配使用让其更加完美,那这个收集器必然也是一个不可或缺的部分了。...对应常见笔试题 注意:子类初始化问题:满足主动调用,即父类访问子类中的静态变量、方法,子类才会初始化;否则仅父类初始化。 ? ? ? ?

    56580

    JVM面试题,看这篇就足够了(87题详解)「建议收藏」

    20、堆(Heap-线程共享) -运行时数据区 是被线程共享的一块内存区域, 创建的对象和数组都保存在 Java 堆内存中,也是垃圾收集器进行垃圾收集的最重要的内存区域。...当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收机制回收的,即使该对象以后永远都不会被用到 JVM 也不会回收。因此强引用是造成 Java 内存泄漏的主要原因之一。...并发清除 清除 GC Roots 不可达对象,和用户线程一起工作,不需要暂停工作线程。...各种虚拟机实现的内存布局可以各不相同,但是它们能接受的符号引用必须是一致的,因为符号引用的字面量形式明确定义在 Java 虚拟机规范的 Class 文件格式中。...当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,不可达对象。

    30510

    jvm面试题汇总

    存在问题:循环引用 2.根可达算法 基本思路就是通过一系列名为”GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到...GC Roots没有任何引用链相连时,则证明此对象是不可用的。...3.分代收集算法 绝大多数最新被创建的对象会被分配到这里,由于大部分对象在创建后会很快变得不可达,所以很多对象被创建在新生代,然后消失。对象从这个区域消失的过程我们称之为 minor GC。...那么,就可以避免有人自定义一个有破坏功能的java.lang.Integer被加载。这样可以有效的防止核心Java API被篡改 13."父子加载器"之间的关系是继承吗?...包括对于文件格式的验证,比如常量中是否有不被支持的常量?文件中是否有不规范的或者附加的其他信息? 对于元数据的验证,比如该类是否继承了被final修饰的类?类中的字段,方法是否与父类冲突?

    21220

    阿里Jvm必问面试题及答案

    JVM栈(JVM Stacks),与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。...当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,不可达对象。 JVM的永久代中会发生垃圾回收么?...请参考下Java8:从永久代到元数据区 (注:Java8中已经移除了永久代,新加了一个叫做元数据区的native内存区) 引用的分类 强引用:GC时不会被回收 软引用:描述有用但不是必须的对象,在发生内存溢出异常之前被回收...弱引用:描述有用但不是必须的对象,在下一次GC时被回收 虚引用(幽灵引用/幻影引用):无法通过虚引用获得对象,用PhantomReference实现虚引用,虚引用用来在GC时返回一个通知。...如何判断无用的类: 1.该类所有实例都被回收(Java堆中没有该类的对象) 2.加载该类的ClassLoader已经被回收 3.该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方利用反射访问该类

    36600

    架构师面试集锦之JVM面试题

    JVM栈(JVM Stacks),与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。...当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,不可达对象。 JVM的永久代中会发生垃圾回收么?...请参考下Java8:从永久代到元数据区 (注:Java8中已经移除了永久代,新加了一个叫做元数据区的native内存区) 引用的分类 强引用:GC时不会被回收 软引用:描述有用但不是必须的对象,在发生内存溢出异常之前被回收...弱引用:描述有用但不是必须的对象,在下一次GC时被回收 虚引用(幽灵引用/幻影引用):无法通过虚引用获得对象,用PhantomReference实现虚引用,虚引用用来在GC时返回一个通知。...如何判断无用的类: 1.该类所有实例都被回收(Java堆中没有该类的对象) 2.加载该类的ClassLoader已经被回收 3.该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方利用反射访问该类

    76900

    java 针对jvm的面试题_24个Jvm面试题总结及答案

    JVM栈(JVM Stacks),与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。...当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,不可达对象。 14.JVM的永久代中会发生垃圾回收么?...请参考下Java8:从永久代到元数据区 (注:Java8中已经移除了永久代,新加了一个叫做元数据区的native内存区) 15.引用的分类 强引用:GC时不会被回收 软引用:描述有用但不是必须的对象,在发生内存溢出异常之前被回收...弱引用:描述有用但不是必须的对象,在下一次GC时被回收 虚引用(幽灵引用/幻影引用):无法通过虚引用获得对象,用PhantomReference实现虚引用,虚引用用来在GC时返回一个通知。...如何判断无用的类: 1.该类所有实例都被回收(Java堆中没有该类的对象) 2.加载该类的ClassLoader已经被回收 3.该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方利用反射访问该类

    36620

    24个Jvm面试题总结及答案

    JVM栈(JVM Stacks),与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。...当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,不可达对象。 14.JVM的永久代中会发生垃圾回收么?...请参考下Java8:从永久代到元数据区 (注:Java8中已经移除了永久代,新加了一个叫做元数据区的native内存区) 15.引用的分类 强引用:GC时不会被回收 软引用:描述有用但不是必须的对象,在发生内存溢出异常之前被回收...弱引用:描述有用但不是必须的对象,在下一次GC时被回收 虚引用(幽灵引用/幻影引用):无法通过虚引用获得对象,用PhantomReference实现虚引用,虚引用用来在GC时返回一个通知。...如何判断无用的类: 1.该类所有实例都被回收(Java堆中没有该类的对象) 2.加载该类的ClassLoader已经被回收 3.该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方利用反射访问该类

    1.4K00

    2020年最全面的78道JVM面试题总结(含答案解析和思维导图)

    20、堆(Heap-线程共享) -运行时数据区 是被线程共享的一块内存区域, 创建的对象和数组都保存在 Java 堆内存中,也是垃圾收集器进行垃圾收集的最重要的内存区域。...当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收机制回收的,即使该对象以后永远都不会被用到 JVM 也不会回收。因此强引用是造成 Java 内存泄漏的主要原因之一。...并发清除 清除 GC Roots 不可达对象,和用户线程一起工作,不需要暂停工作线程。...PDM更好的保证了Java平台的安全性,在该机制中,JVM自带的Bootstrap是根加载器,其他的加载器都有且仅有一个父类加载器。...当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,不可达对象。

    7.3K00

    JVM 概述,层次结构 以及 GC工作原理 笔记

    Java 的多线程机制离不开程序计数器,每个线程都有一个自己的PC,以便完成不同线程上下文环境的切换。 2、java虚拟机栈:与 PC 一样,java 虚拟机栈也是线程私有的。...每一个方法被调用直至执行完成的过程就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。...鉴于上面的原因,Sun Hotspot JVM为了提升对象内存分配的效率,对于所创建的线程都会分配一块独立的空间,这块空间又称为TLAB TLAB仅作用于新生代的Eden Space,因此在编写Java...程序运行期间,所有对象实例存储在运行时数据区域的heap中,当一个对象不再被引用(使用),它就需要被收回。在GC过程中,这些不再被使用的对象从heap中收回,这样就会有空间被循环利用。...那么什么叫做不可达?其实就是没有办法再引用到该对象了。主要有以下情况使对象变为垃圾: 1.对非线程的对象来说,所有的活动线程都不能访问该对象,那么该对象就会变为垃圾。

    60850

    2万字JVM面试题含答案解析(2020年78道JVM面试题总结)

    20、堆(Heap-线程共享) -运行时数据区 是被线程共享的一块内存区域, 创建的对象和数组都保存在 Java 堆内存中,也是垃圾收集器进行垃圾收集的最重要的内存区域。...当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收机制回收的,即使该对象以后永远都不会被用到 JVM 也不会回收。因此强引用是造成 Java 内存泄漏的主要原因之一。...并发清除 清除 GC Roots 不可达对象,和用户线程一起工作,不需要暂停工作线程。...PDM更好的保证了Java平台的安全性,在该机制中,JVM自带的Bootstrap是根加载器,其他的加载器都有且仅有一个父类加载器。...当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,不可达对象。

    40110

    深入浅出java虚拟机

    ,这两个对象都相互持有对方的引用,除此之外,这两个对象再无任何其他引用,实际上这两个对象已经不可能再被访问(引用被置空,无法访问),但是它们因为相互引用着对方,导致它们的引用计数器都不为0,于是引用计数算法无法通知...根据引用计数算法的思想,值不为0的对象被认为是存活的,不会被回收;而事实上这两个对象已经不可能再被访问了,应该被回收。...到这个对象是不可达的,判定此对象为不可用对象,可以被回收。...上图是标记/清除算法的示意图,在标记阶段,从对象GC Root 1可以访问到B对象,从B对象又可以访问到E对象,因此从GC Root 1到B、E都是可达的,同理,对象F、G、J、K都是可达对象;到了清除阶段...双亲委派模型要求除了顶层的根类加载器外,其余的类加载器都应当有自己的父类加载器。

    43120

    深入理解Java垃圾回收机制

    对程序需要不被长时间打断的实时环境比较有利。 缺点: 无法检测出循环引用。如父对象有一个对子对象的引用,子对象反过来引用父对象。...根搜索算法是从离散数学中的图论引入的,程序把所有的引用关系看作一张图,从一个节点GC ROOT开始,寻找对应的引用节点,找到这个节点以后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之后,剩余的节点则被认为是没有被引用到的节点...2.3标记-清除算法分析 标记-清除算法采用从根集合进行扫描,对存活的对象对象标记,标记完毕后,再扫描整个空间中未被标记的对象,进行回收,如上图所示。...它开始时把堆分成 一个对象 面和多个空闲面, 程序从对象面为对象分配空间,当对象满了,基于copying算法的垃圾 收集就从根集中扫描活动对象,并将每个 活动对象复制到空闲面(使得活动对象所占的内存之间没有空闲洞...也就是说尽管o 引用已经被置空,但是 Object 对象仍然存在其他的引用,是可以被访问到的,所以 GC 无法将其释放掉。

    60810

    你想要的Android性能优化系列:内存优化 !

    这样,他们的引用计数永远不可能为0. 2、根搜索算法 这个算法的基本思想就是选定一些对象作为GC Roots,并组成根对象集合,然后以这些GCRoots的对象作为起始点,向下搜索,如果目标对象到GC Roots...但是即使在可达性分析算法中不可达的对象,也并非一定要死。当gc第一次扫过这些对象的时候,他们处于“死缓”的阶段。要真正执行死刑,至少需要经过两次标记过程。...小强已经死翘翘,第二次 在例子中,对象第一次被执行了finalize方法,但是把自己交给别的引用,但再次被置空的时候,GC又一次发现该对象到GC Root 不可达,这个时候就没办法自救了,只有被回收。...总结: 对象第一次被GC 判断到gc root不可达时,会调用finalize()方法,第二次还是不可达时,直接回收 对象被回收,至少需要经过两次标记。...一个只具有虚引用的对象,被垃圾收集器回收时会收到一个系统通知,这也是虚引用的主要作用。Java提供了PhantomReference类来实现虚引用。

    1.4K30

    Lua基础知识总结笔记-八股文

    当子类定义了与父类同名的函数时,由于子类可以直接找到这些函数,因此不会去父类中查找,这就导致了子类会隐藏父类的同名函数。 多重继承 多重继承允许一个子类继承多个父类的功能。...这些对象不会被垃圾回收器回收。在标记阶段,从根集开始,递归地标记所有可达的对象为黑色。 灰色(Gray) 灰色对象是指正在被处理的对象。这些对象已经标记为可达,但是它们指向的其他对象还没有被标记。...它分为两个主要阶段: 标记(Marking): 从根集(root set)开始,这些根集通常包括全局变量、活动函数的局部变量和其他活跃对象。 递归地标记所有从根集可达的对象为黑色或灰色。...如果一个对象被标记为灰色,则标记它所指向的所有对象。 当一个对象的所有引用都被处理完毕后,它就变成了黑色。 清扫(Sweeping): 清除所有未被标记的对象(即白色对象),因为它们是不可达的。...在 Lua 中,闭包允许函数访问其外部作用域中的变量,即使该函数在其定义的作用域之外被调用也是如此。

    17410
    领券