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

相关文章
|
3月前
|
缓存 Java 关系型数据库
2025 年最新华为 Java 面试题及答案,全方位打造面试宝典
Java面试高频考点与实践指南(150字摘要) 本文系统梳理了Java面试核心考点,包括Java基础(数据类型、面向对象特性、常用类使用)、并发编程(线程机制、锁原理、并发容器)、JVM(内存模型、GC算法、类加载机制)、Spring框架(IoC/AOP、Bean生命周期、事务管理)、数据库(MySQL引擎、事务隔离、索引优化)及分布式(CAP理论、ID生成、Redis缓存)。同时提供华为级实战代码,涵盖Spring Cloud Alibaba微服务、Sentinel限流、Seata分布式事务,以及完整的D
183 1
|
2月前
|
缓存 Java API
Java 面试实操指南与最新技术结合的实战攻略
本指南涵盖Java 17+新特性、Spring Boot 3微服务、响应式编程、容器化部署与数据缓存实操,结合代码案例解析高频面试技术点,助你掌握最新Java技术栈,提升实战能力,轻松应对Java中高级岗位面试。
328 0
|
3月前
|
算法 架构师 Java
Java 开发岗及 java 架构师百度校招历年经典面试题汇总
以下是百度校招Java岗位面试题精选摘要(150字): Java开发岗重点关注集合类、并发和系统设计。HashMap线程安全可通过Collections.synchronizedMap()或ConcurrentHashMap实现,后者采用分段锁提升并发性能。负载均衡算法包括轮询、加权轮询和最少连接数,一致性哈希可均匀分布请求。Redis持久化有RDB(快照恢复快)和AOF(日志更安全)两种方式。架构师岗涉及JMM内存模型、happens-before原则和无锁数据结构(基于CAS)。
103 5
|
3月前
|
Java API 微服务
2025 年 Java 校招面试全攻略:从面试心得看 Java 岗位求职技巧
《2025年Java校招最新技术要点与实操指南》 本文梳理了2025年Java校招的核心技术栈,并提供了可直接运行的代码实例。重点技术包括: Java 17+新特性(Record类、Sealed类等) Spring Boot 3+WebFlux响应式编程 微服务架构与Spring Cloud组件 Docker容器化部署 Redis缓存集成 OpenAI API调用 通过实际代码演示了如何应用这些技术,如Java 17的Record类简化POJO、WebFlux构建响应式API、Docker容器化部署。
130 5
|
3月前
|
安全 Java API
2025 年 Java 校招面试常见问题及详细答案汇总
本资料涵盖Java校招常见面试题,包括Java基础、并发编程、JVM、Spring框架、分布式与微服务等核心知识点,并提供详细解析与实操代码,助力2025校招备战。
173 1
|
3月前
|
算法 Java 微服务
2025 年 Java 面试宝典社招春招秋招实操全方位攻略
2025年Java面试宝典涵盖核心技术及最新趋势,分为四大板块:1. Java基础:深入数据类型、多态等特性,结合学生信息管理等实例;2. JVM核心:解析内存模型与GC算法,附多线程转账等场景应用;3. 高并发方案:详解synchronized与线程池配置,提供Web服务器优化案例;4. Spring生态:剖析IoC/AOP原理,演示微服务架构实现。特别新增Java 17+特性实操,包括Record类、密封接口等语法糖,整合Spring Boot 3、响应式编程及云原生技术,通过订单状态机、API网关配置。
236 1
|
3月前
|
缓存 算法 NoSQL
校招 Java 面试高频常见知识点深度解析与实战案例详细分享
《2025校招Java面试核心指南》总结了Java技术栈的最新考点,涵盖基础语法、并发编程和云原生技术三大维度: 现代Java特性:重点解析Java 17密封类、Record类型及响应式Stream API,通过电商案例演示函数式数据处理 并发革命:对比传统线程池与Java 21虚拟线程,详解Reactor模式在秒杀系统中的应用及背压机制 云原生实践:提供Spring Boot容器化部署方案,分析Spring WebFlux响应式编程和Redis Cluster缓存策略。
85 0
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
10月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
10月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!