Java面试题:哪些对象可以作为GC Roots?

简介: Java面试题:哪些对象可以作为GC Roots?

Java是托管运行对语言,内存对分配和回收是自动进行对。 那么JVM如何确定哪些内存可以被回收呢?这里面是有特定对算法的。
1、GC自动垃圾收集?
Java虚拟机(JVM)垃圾回收GC任务自动确定Java应用程序不再使用的内存并将该内存回收以用于其他用途。
由于内存是在JVM中自动回收的,因此Java开发人员不必考虑复杂的内存释放工作,基本不需要显式释放未使用的内存对象。
类似与自己买菜做饭洗碗和专有保姆买菜做饭洗碗的区别。
工作还是要有人做,只是把复杂琐碎的GC工作交给其他线程来做。
好处就是:省事。解放码农的双手,去干其他的开发工作。
1、GC垃圾回收算法
GC垃圾回收的规则和方法很多,Java经历了20多年的发展,还在不断进化。GC算法也多种多样。这里比较成熟的CMS。还有比较新的算法G1。无论何种算法,都有一个最重要的问题:
如何认定某个对象可以被GC垃圾回收?
image
GC回收垃圾操作基于以下假设前提:Java中大多数对象都是短命的,并且可以在创建后不久将其回收。
由于未引用的对象会自动从堆内存中删除,因此GC使Java的内存效率更高。
GC自动垃圾回收是查看堆内存,识别正在使用的对象和未使用的对象以及删除未使用的对象的过程。
使用中的对象或引用的对象意味着程序的某些部分仍维护着指向该对象的指针。
程序的任何部分都不再引用未使用的对象或未引用的对象。 因此,GC可以回收未引用对象使用的内存。
image
双重释放会导致错误,当程序尝试释放已经释放并且可能已经重新分配的内存区域时,会发生双重释放错误。
内存泄露,是经常面试考察的问题,某些类型的内存泄漏,其中程序无法释放已变得无法访问的对象占用的内存,这可能导致OOM错误内存耗尽。
很多开源工具可以帮助分析Java的内存泄露问题。
2、GC Root作用
GC Root是很特殊的对象,在GC进行垃圾回收之前,要判断对象是否可以被回收。这里判断的标准需要有依据。就是一个对象如何确定是不是被引用,或者被使用。
image
在Java中,有一些特殊的对象称为GC垃圾回收根(GC Root)。 它们充当垃圾收集标记机制的根对象(GC Root Object)。
GC Root Object可以从Java堆的外部访问,也就是不受GC的自动回收管制。可以理解为有免死金牌的Java对象。GC这套法律体系约束不了它们。
3、GC Roots类型
那么有哪些类似可以作为GC Roots类型呢?我们来看一下下面的类型列表:

类型 说明
System Class 类型 由引导程序/系统类加载器加载的类型。例如,rt.jar中的所有内容(如java.util。*)。
JNI Local 类型 本机原生代码中的局部变量,例如用户定义的JNI代码或JVM内部代码。
JNI Global 类型 本机原生代码中的全局变量,例如用户定义的JNI代码或JVM内部代码。
Thread Block 类型 从当前活动的线程块引用的对象。
Thread 类型 已经启动运行的线程 thread.
Busy Monitor 类型 忙碌的监视器代码,调用了wait()或notify()或已同步的所有代码。
Java Local 类型 局部变量。例如,输入参数或仍在线程堆栈中的方法的局部创建对象。
Native Stack 类型 本机原生代码中的输入或输出参数,例如用户定义的JNI代码或JVM内部代码。
Finalizable 类型 可终结对象,队列中等待其终结器运行的对象.
Unfinalized 类型 未终结对象,具有finalize方法但尚未完成且尚未在终结器队列中的对象.
Unreachable 类型 不可达对象,无法从任何其他根访问的对象,MAT使用.
Java Stack Frame 类型 Java栈框架,持有局部变量。解析Dump时使用.
Unknown 类型 根类型未知对象。MAT分析Dump文件时的特殊类型,归类不可知类型.

像系统类型、JNI代码、运行的线程、同步区的对象等还是比较好理解的,基本是不受管控。Finalizable、Unfinalized和Unreachable都是GC回收中比较特殊的对象。剩下的Unknown可以理解为MAT分析过程中其他不可知对象准备的Root类型。
参考资料:
1、https://help.eclipse.org/2020-03/index.jsp?topic=%2Forg.eclipse.mat.ui.help%2Fconcepts%2Fgcroots.html&cp=37_2_3
2、https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

目录
相关文章
|
1天前
|
存储 算法 安全
Java对象创建和访问
Java对象创建过程包括类加载检查、内存分配(指针碰撞或空闲列表)、内存初始化、对象头设置及初始化方法执行。访问方式有句柄和直接指针两种,前者稳定但需额外定位,后者速度快。对象创建涉及并发安全、垃圾回收等机制。
Java对象创建和访问
|
27天前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
103 14
|
1月前
|
安全 Java 程序员
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
57 13
|
1月前
|
存储 Java
Java中判断一个对象是否是空内容
在 Java 中,不同类型的对象其“空内容”的定义和判断方式各异。对于基本数据类型的包装类,空指对象引用为 null;字符串的空包括 null、长度为 0 或仅含空白字符,可通过 length() 和 trim() 判断;集合类通过 isEmpty() 方法检查是否无元素;数组的空则指引用为 null 或长度为 0。
|
2月前
|
Java
Java快速入门之类、对象、方法
本文简要介绍了Java快速入门中的类、对象和方法。首先,解释了类和对象的概念,类是对象的抽象,对象是类的具体实例。接着,阐述了类的定义和组成,包括属性和行为,并展示了如何创建和使用对象。然后,讨论了成员变量与局部变量的区别,强调了封装的重要性,通过`private`关键字隐藏数据并提供`get/set`方法访问。最后,介绍了构造方法的定义和重载,以及标准类的制作规范,帮助初学者理解如何构建完整的Java类。
|
2月前
|
安全 Java
Object取值转java对象
通过本文的介绍,我们了解了几种将 `Object`类型转换为Java对象的方法,包括强制类型转换、使用 `instanceof`检查类型和泛型方法等。此外,还探讨了在集合、反射和序列化等常见场景中的应用。掌握这些方法和技巧,有助于编写更健壮和类型安全的Java代码。
54 17
|
2月前
|
算法 安全 Java
Java线程调度揭秘:从算法到策略,让你面试稳赢!
在社招面试中,关于线程调度和同步的相关问题常常让人感到棘手。今天,我们将深入解析Java中的线程调度算法、调度策略,探讨线程调度器、时间分片的工作原理,并带你了解常见的线程同步方法。让我们一起破解这些面试难题,提升你的Java并发编程技能!
100 16
|
2月前
|
Java 程序员 调度
Java 高级面试技巧:yield() 与 sleep() 方法的使用场景和区别
本文详细解析了 Java 中 `Thread` 类的 `yield()` 和 `sleep()` 方法,解释了它们的作用、区别及为什么是静态方法。`yield()` 让当前线程释放 CPU 时间片,给其他同等优先级线程运行机会,但不保证暂停;`sleep()` 则让线程进入休眠状态,指定时间后继续执行。两者都是静态方法,因为它们影响线程调度机制而非单一线程行为。这些知识点在面试中常被提及,掌握它们有助于更好地应对多线程编程问题。
87 9
|
6月前
|
存储 Java
Java编程中的对象和类
【8月更文挑战第55天】在Java的世界中,“对象”与“类”是构建一切的基础。就像乐高积木一样,类定义了形状和结构,而对象则是根据这些设计拼装出来的具体作品。本篇文章将通过一个简单的例子,展示如何从零开始创建一个类,并利用它来制作我们的第一个Java对象。准备好让你的编程之旅起飞了吗?让我们一起来探索这个神奇的过程!
47 10
|
6月前
|
存储 Java
Java的对象和类的相同之处和不同之处
在 Java 中,对象和类是面向对象编程的核心。
86 18

热门文章

最新文章