首页
学习
活动
专区
工具
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

48710

JVM(完结)

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

45730

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

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

61940

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

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

1.1K30

【JavaEE初阶】了解JVM

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

27820

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

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

5.6K42

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

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

54980

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

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

28910

jvm面试题汇总

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

18820

阿里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对象没有在任何地方引用,无法在任何地方利用反射访问该类

35800

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.3K00

架构师面试集锦之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对象没有在任何地方引用,无法在任何地方利用反射访问该类

75500

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对象没有在任何地方引用,无法在任何地方利用反射访问该类

35020

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

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

7.1K00

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

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

58950

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

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

37010

深入浅出java虚拟机

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

41420

深入理解Java垃圾回收机制

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

59810

jvm垃圾回收详解_java 垃圾回收器

对于这种情况,就需要安全区域来解决 安全区域是指在段代码片段中,对象引用关系不会发生变化,在这个区域中任何位置开始GC都是安全线程运行到安全区域代码时,首先标志已经进入了安全区域,如果GC,JVM...(1):如对象个对子对象引用,子对象反过来引用对象。...),当对象GC Roots没有任何引用链相连(用图论的话来说,就是GC Roots到这个对象不可达)时,则证明此对象不可。...这点不满足的话,分析结果准确性就无法保证。 这也是 GC 进行时必须 STW 个重要原因,即使是号称几乎不会发生停顿 CMS 收集器中,枚举节点也是必须要停顿。...标记-清除算法采用集合(GC Roots)进行扫描,对存活对象进行标记,标记完毕后,再扫描整个空间中未被标记对象,进行回收。

1K32

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

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

1.3K30
领券