【Java面试】JVM垃圾回收相关知识点

news2024/11/26 4:46:30

文章目录

    • 1. Java中对象有哪些引用类型?
    • 2. 有哪些基本的垃圾回收算法?
    • 3. 什么是分区收集算法?和分代收集什么区别?
    • 4. 什么是Minor GC、Major GC、Full GC?
    • 5. 什么情况下会触发Full GC?

1. Java中对象有哪些引用类型?

对象有以下几种引用类型:

  • 强引用:这是最常见的引用类型。当我们使用关键字new创建一个对象时,会生成一个强引用。只要存在强引用指向一个对象,垃圾收集器就不会回收该对象。
	// 创建一个强引用
	MyObject obj = new MyObject();
	// obj 引用仍然存在,对象不会被垃圾收集器回收
  • 软引用:软引用用于描述一些还有用但非必需的对象。当系统内存不足时,垃圾收集器会回收软引用对象。可以通过SoftReference类来创建软引用。
	// 创建一个软引用
	SoftReference<MyObject> softRef = new SoftReference<>(new MyObject());
	// 在内存不足时,垃圾收集器可能会回收软引用对象
	MyObject obj = softRef.get();
	if (obj == null) {
	    // 重新创建对象或从其他地方获取对象
	}
  • 弱引用:弱引用用于描述非必需的对象。如果只存在弱引用指向一个对象,那么垃圾收集器会在下一次运行时回收该对象。可以通过WeakReference类来创建弱引用。
	// 创建一个弱引用
	WeakReference<MyObject> weakRef = new WeakReference<>(new MyObject());
	// 在下一次垃圾收集时,垃圾收集器可能会回收弱引用对象
	MyObject obj = weakRef.get();
	if (obj == null) {
	    // 对象已被回收,需要重新创建对象或从其他地方获取对象
	}
  • 虚引用:虚引用是最弱的引用类型。它的存在主要用于跟踪对象被垃圾收集器回收的活动。虚引用与其他引用类型不同,无法通过虚引用来获取对象,而是通过ReferenceQueue来获取通知。可以通过PhantomReference类来创建虚引用。
	// 创建一个虚引用
	ReferenceQueue<MyObject> queue = new ReferenceQueue<>();
	PhantomReference<MyObject> phantomRef = new PhantomReference<>(new MyObject(), queue);
	// 通过 ReferenceQueue 获取通知,并执行相应的操作
	Reference<? extends MyObject> ref = queue.poll();
	if (ref != null) {
	    // 执行清理操作或其他逻辑
	}

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

  • 标记-清除算法(Mark and Sweep):这是最基本的垃圾回收算法。它的过程分为两个阶段:标记阶段和清除阶段。首先,垃圾收集器会从根对象(如栈、静态变量等)开始,通过可达性分析标记出所有活动对象。然后,在清除阶段,垃圾收集器会遍历堆中的所有对象,清除未标记的对象并回收它们所占用的内存。
    在这里插入图片描述

  • 复制算法(Copying):这种算法将堆内存划分为两个大小相等的区域,通常称为"From"区和"To"区。首先,垃圾收集器从根对象开始,将所有活动对象复制到"To"区,同时按顺序紧凑排列,没有被复制的对象就是垃圾。最后,将"From"区和"To"区进行交换,完成垃圾回收。这种算法的优点是简单高效,但内存利用率相对较低。
    在这里插入图片描述

  • 标记-整理算法(Mark and Compact):这种算法结合了标记-清除和复制算法的思想。它首先通过标记阶段标记出所有活动对象,然后将它们向一端移动,紧凑排列,最后清除不可达的对象。相比于复制算法,标记-整理算法避免了内存浪费,但需要额外的移动对象的过程。
    在这里插入图片描述

  • 分代收集算法(Generational Collection):这种算法基于一个观察:大部分对象在短时间内会变得不可达。根据这个观察,分代收集算法将堆内存分为多个代,通常是新生代(Young Generation)和老年代(Old Generation)。新生代中的对象通常存活时间较短,使用复制算法进行回收;老年代中的对象存活时间较长,使用标记-清除标记-整理算法进行回收。这种算法充分利用了对象存活时间的特点,提高了垃圾回收的效率。

3. 什么是分区收集算法?和分代收集什么区别?

分区收集算法(Partition Collection)是将堆内存划分为不同的区域(partition),每个区域都有自己的垃圾回收方式。常见的分区包括伊甸园区(Eden),幸存者区(Survivor),以及老年代区。

分区收集算法可以根据应用程序的特点和需求,为不同的区域选择最合适的垃圾回收算法。例如,伊甸园区通常使用复制算法,幸存者区可以使用复制算法或标记-整理算法,而老年代区可能使用标记-清除或标记-整理算法。

  • 分代收集算法主要关注对象的存活时间,根据存活时间的不同采用不同的回收策略;
  • 分区收集算法主要关注堆内存的划分和不同区域的回收方式,每个区域可以选择最适合的垃圾回收算法。

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

  • Minor GC(小型垃圾收集):也称为Young GC(新生代垃圾收集),主要针对新生代(Young Generation)进行的垃圾回收过程。新生代通常使用复制算法进行回收。在Minor GC中,垃圾收集器会清理新生代中不再被引用的对象,并将存活的对象复制到另一个区域。Minor GC通常发生频繁,但回收的对象数量较少,所需时间较短。
  • Major GC(大型垃圾收集):也称为Old GC(老年代垃圾收集),主要针对老年代(Old Generation)进行的垃圾回收过程。老年代中的对象通常存活时间较长,Major GC会清理老年代中不再被引用的对象。Major GC的触发条件通常包括老年代的空间不足、长时间存活的对象进入老年代等。Major GC通常比Minor GC耗时更长。
  • Full GC(完全垃圾收集):也称为Mixed GC(混合垃圾收集),是对整个Java堆(包括新生代和老年代)进行的完整垃圾回收过程。Full GC会清理整个堆内存中的无效对象,包括新生代和老年代中不再被引用的对象。Full GC通常是由特定的条件触发,如堆内存的占用达到阈值、调用System.gc()方法等。Full GC是最耗时的垃圾收集过程,会导致较长的停顿时间。

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

  • 显式调用System.gc()
  • 老年代空间不足,当老年代的空间不足以容纳新分配的对象时,垃圾收集器会执行Full GC来清理整个堆内存,以释放无效对象并进行内存整理
  • 永久代/元空间空间不足,如果永久代空间不足以容纳新的类定义、常量或字符串等,垃圾收集器可能会执行Full GC来释放空间
  • 某些分代收集器(如G1垃圾收集器)可能根据具体策略决定执行Full GC

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

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

相关文章

Linux 常用指令的使用

文章目录 1. 基础命令1&#xff09;ls2&#xff09;pwd3&#xff09;cd4&#xff09;touch5&#xff09;cat6&#xff09;mkdir7&#xff09;rm8&#xff09;cp9&#xff09;mv10&#xff09;more11&#xff09;less12&#xff09;head13&#xff09;tail14&#xff09;vim15&a…

《论文阅读》常识推理的生成知识提示

《论文阅读》常识推理的生成知识提示 前言简介相关知识模型构架Generated Knowledge PromptingKnowledge GenerationKnowledge Integration via Prompting推理阶段前言 你是否也对于理解论文存在困惑? 你是否也像我之前搜索论文解读,得到只是中文翻译的解读后感到失望? 小…

linux RVM安装使用

前言 RVM&#xff08;Ruby Version Manager&#xff09;是一个支持多版本Ruby的命令行程序&#xff0c;它有助于为开发和生产环境提供一致性可靠的Ruby版本。 它能够提供最新版本的Ruby&#xff0c;并管理多个版本&#xff0c;几乎在所有操作系统上都能安装和管理 Ruby。RVM 还…

RocketMQ之底层IndexFile存储协议

RocketMQ是一款高性能、高可靠、可伸缩的分布式消息中间件。在实现以上功能方面,RocketMQ采用了深度优化的存储设计方案。其中,底层IndexFile存储协议被认为是RocketMQ存储设计的关键,因此本篇文章将重点介绍RocketMQ底层IndexFile存储协议的实现机制及优缺点。 RocketMQ底…

LitCTF 2023 复现

文章目录 Hex&#xff1f;Hex&#xff01;梦想是红色的原来你也玩原神factordbP_Leake的学问Euler* Where is P?The same common divisormd5babyLCG* easy_math* Virginia* Is this only base?你是我的关键词(Keyworld)隐晦的聊天记录* baby_xor收获与体会 Hex&#xff1f;He…

VSCode中安装GPT插件详细教程

目录 安装插件 A.安装CodeGPT B.安装chatgpt 1.VSCode安装插件&#xff0c;使用本地下载vsix文件 2.获取 ChatGPT API 密钥 3.配置settings.json GPT-4主要有三大改进点 局限性 安装插件 AB功能一样&#xff0c;A安装的人最多&#xff0c;GPT具体功能可见标题链接 A.…

BLE解调

BLE解调前奏 如果不太了解IQ、FSK、GFSK的话&#xff0c;可以看上一篇&#xff0c;有一些关于这些内容的东西&#xff0c;写的应该还算好理解点吧&#xff0c;给出了自己学习时候的参考&#xff0c;具体的看他们写的。 调频与调相之间的关系 IQ调制中&#xff0c;调频是表现…

chatgpt赋能Python-anaconda降低python版本

Anaconda降低Python版本&#xff1a;为什么你需要做到这一点&#xff1f; 作为一个有10年Python编程经验的工程师&#xff0c;我经常会发现自己需要降低Pyhton的版本以便与我要使用的库兼容。为了解决这个问题&#xff0c;Anaconda是一个非常有用的工具&#xff0c;可以管理不…

基于fpga的图像处理之3x3_5x5算子模板设计

本文的思路框架&#xff1a; ①本文采用支持3x3算子模块和5x5算子模块的生成&#xff0c;用于后一级别的算法输入 ②本例程中采用的FPGA设计技巧&#xff0c;可用于借鉴&#xff0c;一是generate if参数定义&#xff1b;二是调用xilinx和altera的sync fifo和async fifo原语实现…

基于SpringBoot的招生管理系统的设计与实现

背景 本次设计任务是要设计一个招生管理系统&#xff0c;通过这个系统能够满足管理员和学生的招生公告管理功能。系统的主要功能包括首页、个人中心、学生管理、专业信息管理、专业报名管理、录取通知管理、系统管理等功能。 管理员可以根据系统给定的账号进行登录&#xff0…

做百度百科词条怎么写词条名,认证百度百科多少钱

很多人在做百度百科词条时不知道如何写百度百科词条名&#xff0c;总是因为词条不规范或者义项名不正确&#xff0c;而导致词条通过不了。认证申请百度百科到底多少钱能通过&#xff0c;实际上百度百科是免费的&#xff0c;需要费用的是请别人帮忙创建百度百科&#xff0c;下面…

SPI(Service Provider Interface)

ServiceLoad中的spi 1、简介 JDK1.6引入的特性&#xff0c;用来实现SPI&#xff08;Service Provider Interface&#xff09;&#xff0c;一种服务发现机制。 2、JDBC举例 2.1、引入mysql依赖jar <dependency><groupId>mysql</groupId><artifactId>…

[IntelliJ IDEA] 中Lombok插件的介绍和常见使用情景

文章目录 介绍使用Lombok 介绍 在编写项目时&#xff0c;尤其是在类进行类内部成员字段封装时&#xff0c;需要编写大量的get/set方法&#xff0c;不仅写的麻烦&#xff0c;如果字段名发生改变就要进行修改&#xff0c;因此非常麻烦&#xff1b;因此使用Lombok就能解决这样的问…

C++的vector使用

vector 1.vector的介绍2.vector的使用2.1. vector的定义&#xff08;构造函数&#xff09;2.2. vector iterator的使用2.3. vector空间增长问题2.4. vector的增删改查vector 迭代器失效问题&#xff08;重点&#xff09; 1.vector的介绍 vector是和数组类似的序列容器&#xf…

一文全览机器学习建模流程(Python代码)

注&#xff1a;本文基于之前的文章做了些修改&#xff0c;重复部分可以跳过看。示例的项目为基于LR模型对癌细胞分类的任务。 随着人工智能时代的到来&#xff0c;机器学习已成为解决问题的关键工具&#xff0c;如识别交易是否欺诈、预测降雨量、新闻分类、产品营销推荐。我们接…

深入浅出C语言——字符/字符串操作函数

文章目录 一、字符串操作函数1. strlen2. strcpy3. strcat4. strcmp5. strncpy6. strncat7. strncmp8. strstr9. strtok10. strerror二、字符操作函数 一、字符串操作函数 1. strlen size_t strlen ( const char * str );strlen 获取字符串长度。字符串已经 ‘\0’ 作为结束标…

Mybatis二级缓存详解

目录 二级缓存 MyBatis的缓存机制整体设计以及二级缓存的工作模式 二级缓存的划分 使用二级缓存&#xff0c;必须要具备的条件 一级缓存和二级缓存的使用顺序 二级缓存实现的选择 MyBatis自身提供的二级缓存的实现 二级缓存的作用 二级缓存的作用域 二级缓存应用场景…

Pruning 系列 (六)remove剪枝

环境 python 3.9numpy 1.24.1pytorch 2.0.0+cu117一、填0与remove剪枝的差异 直接填0的剪枝: 优点: 保留了原始网络结构,便于实现和微调。部分减少模型的计算量。缺点: 零权重仍然需要存储,因此不会减少内存使用。一些硬件和软件无法利用稀疏计算,从而无法提高计算效率…

Linux网络——shell编程之awk编辑器

Linux网络——shell编程之awk编辑器 一、awk编辑器1.概述2.工作流程3.常用选项 二、awk的基础用法1.输出文件中的某一列2.根据特定条件筛选数据3.按照分隔符进行切割4.在匹配到特定字符串时执行操作5.BEGIN打印模式6.awk的分隔符用法 三、示例演示1.获取本机上一次开机时间2.检…

Unity UI -- (1)概览

UI&#xff08;User Interface&#xff0c;用户接口&#xff09;&#xff0c;是让用户和计算机或计算机应用交互的接口系统。 在实时3D项目中&#xff0c;UI通常是由文本、按钮、复选框、滑动条和单选框等组合出来的界面。这些元素使用特定规则或通知和用户进行交互。 UI设计是…