java面试题-GC垃圾回收

news2024/10/1 23:43:04

1.如何判断一个对象是否可以回收?

Java虚拟机使用可达性分析算法来判断对象是否可以被回收。

可达性分析算法的基本思路是从一组称为“GC Roots”的根对象开始遍历所有对象,只有从GC Roots开始的对象可以被访问到,其他的对象都被判定为无用对象,可以被垃圾回收器回收。在Java虚拟机中,GC Roots包括:

1.虚拟机栈中引用的对象。

2.方法区中类静态属性引用的对象。

3.方法区中常量引用的对象。

4.本地方法栈中JNI(Java Native Interface)引用的对象。

通过可达性分析算法,垃圾回收器可以确定哪些对象是“存活的”,哪些对象可以被回收。在一次垃圾回收过程中,所有的“存活对象”都会被复制或移动到另一个区域,而所有的“垃圾对象”则被清理出堆内存,以便后续的对象分配。

需要注意的是,Java虚拟机中的垃圾回收算法并不是100%准确的,因为有一些特殊情况下,对象可能仍然被引用但已经不再被使用,从而被误判为“无用对象”,被垃圾回收器回收。这种情况称为“内存泄漏”,需要开发人员在程序设计中避免这种情况的发生。

2.对象有哪些引用类型?

1.强引用(Strong Reference):强引用是最普通的对象引用,它通过直接将对象的引用赋值给一个变量来创建。例如:

Object obj = new Object();

这里的 obj 就是一个强引用,只要强引用存在,垃圾回收器就不会回收该对象。即使内存不足,系统也会抛出 OutOfMemoryError 异常,而不是回收对象。

2.软引用(Soft Reference):软引用可以让对象存活更长的时间,当系统内存不足时,垃圾回收器会回收软引用指向的对象。可以通过 SoftReference 类来创建软引用。例如:

Object obj = new Object();
SoftReference<Object> ref = new SoftReference<>(obj);
obj = null;

这里的 ref 就是一个软引用,当内存不足时,垃圾回收器会回收 obj 对象,并且会在回收之前将 ref 设置为 null,以便我们在程序中判断是否已经回收了该对象。

3.弱引用(Weak Reference):弱引用的生命周期更短,当系统进行垃圾回收时,无论内存是否充足,都会回收弱引用指向的对象。可以通过 WeakReference 类来创建弱引用。例如:

Object obj = new Object();
WeakReference<Object> ref = new WeakReference<>(obj);
obj = null;

这里的 ref 就是一个弱引用,当垃圾回收器回收 obj 对象时,会回收 ref 引用。弱引用通常用于实现缓存、对象池等功能。

4.虚引用(Phantom Reference):虚引用也称为幽灵引用,它的作用是在对象被回收时收到一个系统通知。可以通过 PhantomReference 类来创建虚引用。例如:

Object obj = new Object();
ReferenceQueue<Object> queue = new ReferenceQueue<>();
PhantomReference<Object> ref = new PhantomReference<>(obj, queue);
obj = null;

这里的 ref 就是一个虚引用,当 obj 对象被垃圾回收器回收时,会将 ref 加入到 queue 队列中,程序可以通过队列来获取通知。虚引用通常用于管理直接内存等资源,需要手动释放。

3.有哪些基本的垃圾回收算法?

  1. 标记-清除算法(Mark-Sweep Algorithm):该算法分为标记和清除两个阶段。首先,垃圾回收器标记所有还存活的对象,然后清除所有未标记的对象。该算法的缺点是会产生内存碎片,导致空间不足。

优点:

  • 实现简单,易于理解。

缺点:

  • 会产生内存碎片,可能会导致频繁的垃圾回收和性能下降。

  • 因为回收后会产生内存碎片,所以需要采取其他措施来避免内存碎片。

  1. 复制算法(Copying Algorithm):该算法将可用的内存空间分为两部分,每次只使用其中一部分。当该部分空间满时,将存活的对象复制到另一部分空间,然后清空原空间。该算法不会产生内存碎片,但是需要两倍的空间。

优点:

  • 不会产生内存碎片,可以有效地避免频繁的垃圾回收和性能下降。

  • 实现简单,复制过程也很快。

缺点:

  • 需要两倍的内存空间,对于大对象的复制会影响性能。

  • 需要在复制过程中维护对象的引用关系,会增加一定的开销。

  1. 标记-整理算法(Mark-Compact Algorithm):该算法分为标记和整理两个阶段。首先,垃圾回收器标记所有还存活的对象,然后将存活的对象移动到一端,然后清除边界以外的对象。该算法不会产生内存碎片,但是需要移动存活对象,可能会影响性能。

优点:

  • 不会产生内存碎片,可以有效地避免频繁的垃圾回收和性能下降。

  • 对于存活对象比较多的场景,标记-整理算法比标记-清除算法更适合。

缺点:

  • 需要移动存活对象,可能会影响性能。

  • 实现比较复杂,需要维护对象的引用关系和内存地址等信息。

  1. 分代算法(Generational Algorithm):该算法将堆内存分为多个代,一般分为新生代和老年代两个代。新生代中的对象通常存活时间很短,老年代中的对象通常存活时间较长。根据对象存活时间的不同,采用不同的垃圾回收算法。新生代通常采用复制算法,老年代通常采用标记-清除或标记-整理算法。

4.分代收集算法和分区收集算法区别?

分代收集算法是根据对象的生命周期划分不同的代,根据不同代采用适合的垃圾回收算法,如新生代使用复制算法,老年代使用标记-清除或标记-整理算法。

分区收集算法是将整个堆空间分为不同的区域,每个区域独立管理,可以针对某个区域进行垃圾回收,如G1垃圾回收器就是基于分区收集算法实现的。

5.什么是Minor GC、Major GC、Full GC?

Minor GC、Major GC、Full GC是垃圾回收的三个阶段,也称为新生代GC、老年代GC和全堆GC。

Minor GC:指的是对新生代进行垃圾回收的过程,通常采用复制算法,把存活的对象复制到另一个幸存区域,并清空当前区域。

Major GC:指的是对老年代进行垃圾回收的过程,因为老年代的对象较多,所以采用标记-清除或标记-整理算法,清理过程相对复杂,所以速度比Minor GC慢。

Full GC:指的是对整个堆空间进行垃圾回收的过程,包括新生代和老年代,通常在进行Full GC时,应用程序需要暂停,因为Full GC的时间比较长,影响系统的性能。

Minor GC和Major GC通常是并行的,而Full GC则通常是串行的,也可以并行执行。

6.JVM内存分配策略?

  1. 对象优先在Eden区分配。

新创建的对象会被分配到Eden区,如果Eden区没有足够的空间进行分配,则会触发一次Minor GC。经过Minor GC后仍然存活的对象将被移动到Survivor区。如果Survivor区没有足够的空间,则将对象转移到老年代中。

  1. 大对象直接进入老年代。

如果一个对象的大小超过了一个阈值,通常为Eden区和Survivor区的一半大小,那么它就会被直接分配到老年代中,避免在Eden区和Survivor区之间频繁移动。

  1. 长期存活的对象进入老年代。

如果一个对象经过多次Minor GC仍然存活,那么它将被移动到老年代中。

  1. 动态对象年龄判定。

Survivor区有两个,一个是From区,一个是To区,每次Minor GC后,存活下来的对象会从From区移到To区,年龄+1。当一个对象的年龄达到一定的阈值时,就会被移动到老年代中。

  1. 空间分配担保。

在发生一次Full GC之前,JVM会先检查老年代最大可用连续空间是否大于新生代所有对象的总空间,如果是,则执行Minor GC,否则会执行Full GC。如果老年代最大可用连续空间不足以容纳新生代对象,但是新生代的对象已经被转移到老年代中,那么JVM会执行一次Full GC来清理整个堆空间。

7.什么情况下会触发Full GC?

Full GC(Full Garbage Collection)是一种全堆垃圾回收,会清理整个堆空间,包括新生代和老年代。相比于Minor GC和Major GC,Full GC的代价更大,通常会导致应用程序的停顿。

下面是触发Full GC的常见情况:

  1. 老年代空间不足:当老年代中的空间不足以容纳新的对象时,会触发Full GC,以释放未被使用的对象并扩展老年代的空间。

  1. 显式调用System.gc():虽然调用System.gc()不能确保会立即执行Full GC,但是它会增加Full GC被执行的机会。通常情况下,JVM会忽略这个方法调用。

  1. 永久代(在JDK8及以前的版本中)或元空间(在JDK8及以后的版本中)空间不足:如果JVM中的元数据(如类定义、方法定义等)过多,会导致永久代或元空间不足,从而触发Full GC。

  1. 分配担保失败:在Minor GC时,如果老年代的连续可用空间不足以容纳新生代中所有的存活对象,那么就需要进行Full GC,以释放未被使用的对象并扩展老年代的空间。

需要注意的是,Full GC会导致应用程序停顿,因此在开发和部署应用程序时需要避免过于频繁的Full GC。

8.Hotspot中有哪些垃圾回收器?

Hotspot是JVM中最常用的实现之一,它包含了多个垃圾回收器,可以根据应用程序的需求选择不同的垃圾回收器来实现最优的性能。

下面是Hotspot中常见的垃圾回收器:

  1. Serial收集器:是一种单线程的垃圾回收器,适用于小型应用程序或客户端应用程序。它在新生代使用复制算法,在老年代使用标记-整理算法。

  1. Parallel收集器:是一种多线程的垃圾回收器,适用于中型或大型应用程序。它在新生代使用复制算法,在老年代使用标记-整理算法。

  1. CMS收集器:是一种并发的垃圾回收器,适用于需要低停顿时间的应用程序。它在新生代使用复制算法,在老年代使用标记-清除算法。它不会等待所有的存活对象都被标记,而是在标记过程中就开始回收垃圾对象。

  1. G1收集器:是一种面向服务端应用程序的垃圾回收器,适用于大型堆空间和多核处理器。它将堆内存分为多个大小相等的区域,每个区域可以是Eden、Survivor或Old区。它使用复制算法来收集Eden和Survivor区,使用标记-整理算法来收集Old区。

  1. ZGC收集器:是一种低延迟的垃圾回收器,适用于需要大堆空间和短暂的停顿时间的应用程序。它采用了分代垃圾回收器的思想,但同时也支持全堆垃圾回收。它在收集垃圾时可以与应用程序并发执行,以减少停顿时间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/374522.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

13 Sentinel介绍

什么是Sentinel 分布式系统的流量防卫兵&#xff1a;随着微服务的普及&#xff0c;服务调用的稳定性变得越来越重要。Sentinel以“流量”为切入点&#xff0c;在流量控制、断路、负载保护等多个领域开展工作&#xff0c;保障服务可靠性。特点&#xff1a; 2. 丰富的应用场景&a…

Java 锁 高频 面试题回答

之前面了几个开发&#xff0c;问了关于锁的知识都是一问三不知 &#xff0c;也许是业务场景中出现的比较少&#xff0c;所以这些人只能回答出一些基础的线程方面的知识&#xff0c;之前也看了些书&#xff0c;做一些记录 &#xff0c;所以和大家分享一下 说一下乐观锁和悲观锁的…

Binder系统-C程序示例_框架分析

IPC&#xff1a;进程间的通信&#xff0c;远程调用&#xff0c;比如我们的A进程需要打开LED灯&#xff0c;调用led_open/led_ctl方法&#xff0c;但是他是没有权限去操作的&#xff0c;所以进程A通过&#xff1a;1.首先构造一些数据&#xff0c;2.通过IPC发送数据到进程B&#…

LPC4357JET256/LPC4337FET256/LPC4337JET256 32位MCU 204MHz 1MB

【详情】LPC4300系列微控制器(MCU)拥有全世界首款非对称双核数字信号控制器体系结构&#xff0c;配有ARM Cortex-M4和Cortex-M0处理器。这些NXP Cortex-M4 MCU配有Cortex-M0协处理器&#xff0c;优势在于&#xff0c;可在单一体系结构、开发环境中&#xff0c;开发数字信号处理…

画栋雕梁:定制投资体系2——规划开发能力圈

接上一篇&#xff0c;选择了适合自己“买”的方法&#xff0c;接下来就是要规划买的范围。这个范围一般受个人眼界、认知和理解的限制&#xff0c;也即是价值投资中的一个重要概念——能力圈。每个人的能力圈不可能一样&#xff0c;这和个人过往的学习、工作、成长经历相关。若…

PyQGIS开发 -- 基础学习笔记

1、自主学习QGIS开发虽然QGIS本身功能强大&#xff0c;但还是架不住我们要编写新的功能、新的业务流程、新的算法。前文中我们提到&#xff0c;扩展QGIS有2种方法&#xff0c;一是用Python、C来写QGIS的插件&#xff1b;另一种就是基于QGIS的C API开发独立应用程序。然而后者资…

前端食堂技术周刊第 72 期:Signals 是前端框架的未来、Chrome Headless、ts-reset、magic-regexp、Bun 新文档

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;草莓番茄 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 本期摘要 Signals 是前端框架的未来Chrome Headless 进化成完全体Next.js 13.2Deno…

纯x86汇编实现的多线程操作系统实践 - 第二章 BSP的启动

本章主要讲解BSP的初始化过程&#xff0c;对应的代码为mbr.asm。系统加电启动后&#xff0c;BIOS进行必要的初始化&#xff0c;并将硬盘的0扇区512字节的数据搬运到内存地址0x7c00处。之后&#xff0c;BSP的IP被置为0x7c00&#xff0c;开始运行。初始化代码mbr.asm将顺序执行以…

服务网格领域的百花齐放

服务网格是一种技术架构&#xff0c;它用于管理微服务系统中各个服务之间的通信&#xff0c;旨在处理微服务间的流量&#xff08;也称为东西向流量&#xff09;。 ​ 在云原生应用中&#xff0c;一个应用的背后可能存在着成百上千个服务&#xff0c;各个服务可能又有着若干个实…

机器学习——集成学习

引言 集成学习&#xff1a;让机器学习效果更好&#xff0c;单个不行&#xff0c;群殴走起。 分类 1. Bagging:训练多个分类器取平均&#xff08;m代表树的个数&#xff09;。 2.Boosting&#xff08;提升算法&#xff09;:从弱学习器开始加&#xff0c;通过加权来进行训练。…

这样在管理后台里实现 403 页面实在是太优雅了

前言403 页面通常表示无权限访问&#xff0c;与 404 页面代表着不同含义。而大部分管理后台框架仅提供了 404 页面的支持&#xff0c;但却忽略了对 403 页面的处理&#xff0c;有的框架虽然也有对 403 页面的处理&#xff0c;但处理效果却不尽人意。那怎么样的 403 页面才是即好…

异步交互的关键——Ajax

文章目录1,Ajax 概述1.1 作用1.2 同步和异步1.3 案例1.3.1 分析1.3.2 后端实现1.3.3 前端实现2&#xff0c;axios2.1 基本使用2.2 快速入门2.2.1 后端实现2.2.2 前端实现2.3 请求方法别名最后说一句1,Ajax 概述 AJAX (Asynchronous JavaScript And XML)&#xff1a;异步的 Jav…

【Fastdfs实战】在本地如何将文件上传到Linux虚拟机

作者&#xff1a;狮子也疯狂 专栏&#xff1a;《Fastdfs连续剧》 坚持做好每一步&#xff0c;幸运之神自然会驾凌在你的身上 目录一. &#x1f981; 前言二. &#x1f981; 上传原理Ⅰ. &#x1f407; 原理图解Ⅱ. &#x1f407; 传输原理三. &#x1f981; 实战演示Ⅰ. &…

TryHackMe-CVE-2021-41773/42013(Apache2.4.49/50)

CVE-2021-41773/42013 对 Apache 路径遍历错误的简短解释和不完整的修复 介绍 tryhackme: 在 Apache HTTP Server 2.4.49 中对路径规范化所做的更改中发现一个缺陷。攻击者可以使用路径遍历攻击将 URL 映射到预期文档根目录之外的文件。如果文档根目录之外的文件不受“要求全…

第三阶段-03MyBatis 中使用XML映射文件详解

MyBatis 中使用XML映射文件 什么是XML映射 使用注解的映射SQL的问题&#xff1a; 长SQL需要折行&#xff0c;不方便维护动态SQL查询拼接复杂源代码中的SQL&#xff0c;不方便与DBA协作 MyBatis建议使用XML文件映射SQL才能最大化发挥MySQL的功能 统一管理SQL&#xff0c; 方…

【工程实践】python 去除\xa0、\u3000、\n、\u2800、\t等字符

1.问题描述 在处理数据时&#xff0c;会遇到\xa0、\u3000、\u2800、\t等Unicode字符串。需要对其进行处理。 2.空格类型说明 空格可以分为两类&#xff0c;一类为普通文本空格&#xff0c;另一类为html实体空格。普通文本空格介绍普通半角空格和普通全角空格。html实体空格介绍…

【反序列化漏洞-01】为什么要序列化

为什么要序列化百度百科上关于序列化的定义是&#xff0c;将对象的状态信息转换为可以存储或传输的形式(字符串)的过程。在序列化期间&#xff0c;对象将其当前状态写入到临时或持久性存储区(非关系型键值对形式的数据库Redis&#xff0c;与数组类似)。以后&#xff0c;可以通过…

浅谈信安文章搜索引擎

一个搜索引擎的实现流程大概为&#xff1a;首先获取海量的数据&#xff0c;整理成统一的格式&#xff0c;然后交给索引程序建立索引&#xff0c;当索引建立好后&#xff0c;就可以进行搜索。简而言之就是&#xff1a;数据获取->数据检索->数据搜索 0x1数据获取 数据获取…

RK3399+FPGA+MIPI 方案细节之subLVDS to MIPI处理

#CROSSLINK系列 #CROSSLINK vs XO3L 总的来说XO3L的灵活性更强&#xff0c;更近似于一片通用的CPLD&#xff1b;CROSSLINK专用性更强。 针对subLVDS转换到MIPI的需求&#xff0c;CROSSLINK比较有优势&#xff0c;因为集成度更高&#xff0c;所以稳定性也更高。 #要点 #crossl…

死锁的总结

哲学家死锁造成的原因&#xff1a;我有你需要的&#xff0c;但你已经有了 饥饿与死锁的区别 死锁一旦发生一定又饥饿现象&#xff0c;但是饥饿现象产生不一定是死锁 历史上对于死锁的声音 死锁的方案 前面两个都是不允许死锁出现 前面都是概念性的东西 后面我们研究如何破坏…