JAVA面试_进阶部分_Java JVM:垃圾回收(GC 在什么时候,对什么东西,做了什么事情)

在什么时候:

首先需要知道,GC又分为minor GC 和 Full GC(major GC)。Java堆内存分为新生代和老年代,新生代

中又分为1个eden区和两个Survior区域。

一般情况下,新创建的对象都会被分配到eden区,这些对象经过一个minor gc后仍然存活将会被移动到

Survior区域中,对象在Survior中没熬过一个Minor GC,年龄就会增加一岁,当他的年龄到达一定程度时,

就会被移动到老年代中。

当eden区满时,还存活的对象将被复制到survior区,当一个survior区满时,此区域的存活对象将被复制到另外一个

survior区,当另外一个也满了的时候,从前一个Survior区复制过来的并且此时还存活的对象,将可能被复制到老年代

因为年轻代中的对象基本都是朝生夕死(80%以上),所以年轻代的垃圾回收算法使用的是复制算法,

复制算法的基本思想是将内存分为两块,每次只有其中一块,当这一块内存使用完,就将还活着的对象复制到

另一块上面。复制算法不会产生内存碎片。

在GC开始的时候,对象只会存在于eden区,和名为“From”的Survior区,Survior区“to”是空的。紧接着GC

eden区中所有存活的对象都会被复制到“To”,而在from区中,仍存活的对象会根据他们的年龄值来决定去向,

年龄到达一定只的对象会被复制到老年代,没有到达的对象会被复制到to survior中,经过这次gc后,eden区和from

survior区已经被清空。这个时候,from和to会交换他们的角色,也就是新的to就是上次GC前的from

Minor GC:从年轻代回收内存

当jvm无法为一个新的对象分配空间时会触发Minor GC,比如当Eden区满了。

当内存池被填满的时候,其中的内容全部会被复制,指针会从0开始跟踪空闲内存。Eden和Survior区不存在内存碎片

写指针总是停留在所使用内存池的顶部。执行minor操作时不会影响到永久代,从永久带到年轻代的引用被当成

GC roots,从年轻代到永久代的引用在标记阶段被直接忽略掉(永久代用来存放java的类信息)。如果eden区域中大部分

对象被认为是垃圾,永远也不会复制到Survior区域或者老年代空间。如果正好相反,eden区域大部分新生对象不符合GC

条件,Minor GC执行时暂停的线程时间将会长很多。Minor may call “stop the world”;

Full GC:是清理整个堆空间包括年轻代和老年代。

那么对于Minor GC的触发条件:大多数情况下,直接在eden区中进行分配。如果eden区域没有足够的空间,

那么就会发起一次Minor GC;对于FullGC的触发条件:如果老年代没有足够的空间,那么就会进行一次FullGC

在发生MinorGC之前,虚拟机会先检查老年代最大可利用的连续空间是否大于新生代所有对象的总空间。

如果大于则进行Minor GC,如果小于则看HandlePromotionFailure设置是否是允许担保失败(不允许则直接FullGC)

如果允许,那么会继续检查老年代最大可利用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于

则尝试minor gc (如果尝试失败也会触发Full GC),如果小于则进行Full GC。

但是,具体什么时候执行,这个是由系统来进行决定的,是无法预测的。

对什么东西:

主要根据可达性分析算法,如果一个对象不可达,那么就是可以回收的,如果一个对象可达,那么这个对象就不可以回收,

对于可达性分析算法,它是通过一系列称为“GC Roots”的对象最为起始点,当一个对象GC Roots没有任何引用链相接的时候,

那么这个对象就是不可达,就可以被回收。

做了什么事情:

主要做了清理对象,整理内存的工作。Java堆分为新生代和老年代,采用了不同的回收方式。

例如新生代采用了复制算法,老年代采用了标记整理法。在新生代中,分为一个ede区域和两个Survior

区域,真正使用的是一个eden区域,和一个Survior区域,GC的时候,会把存活的对象放入到另一个Survior区域中,

然后再把这个eden区域和Survior区域清除。那么对于老年代,采用的是标记整理发,首先标记出存活对象,

然后在移动到一段。这样有利于减少内存碎片。

标记:标记的过程其实就是,遍历所有gc root 然后将所有gc root 可达的对象标记为存活对象

清除:清除的过程中将遍历堆中所有的对象,将没有标记的对象全部清除掉

主要缺点:标记和清除过程效率不高,标记清除之后会产生大量不连续的内存碎片

但是,老年代中因为对象存活率高,没有额外空间对他进行分配担保,就必须使用标记整理算法

标记整理算法 标记操作和“标记-清除”算法一致,后续操作不只是直接清理对象,而是在清理

无用对象完成后让所有存活的对象都向一段移动,并更新其引用对象的指针

主要缺点:在标记清除的基础上还需要进行对象的移动,成本相对比较高,成本相对较高,好处是不会产生内存碎片。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot(十六):使用 Jenkins 部署 Spring Boot

Jenkins 是 Devops 神器,本篇文章介绍如何安装和使用 Jenkins 部署 Spring Boot 项目 Jenkins 搭建、部署分为四个步骤; 第一步,Jenkins 安装 第二步,插件安装和配置 第三步,Push SSH 第四步,部署项目 第…

【Linux 指北】常用 Linux 指令汇总

第一章、常用基本指令 # 注意: # #表示管理员 # $表示普通用户 [rootlocalhost Practice]# 说明此处表示管理员01. ls 指令 语法: ls [选项][目录或文件] 功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件&#xf…

解决Windows版Redis无法远程连接的问题

🌟 解决Windows版Redis无法远程连接的问题 在Windows系统下使用Redis时,很多用户会遇到无法远程连接的问题。尤其是在配置了Redis并尝试通过工具如RedisDesktopManager连接时,可能会报错“Cannot connect to ‘redisconnection’”。今天&am…

大语言模型学习及复习笔记(1)语言模型的发展历程

1.大模型进入人们视野 ChatGPT 于2022年11月底上线 模型名称 发布时间 核心突破 GPT-3 2020年6月 首款千亿参数模型,少样本学习 GPT-3.5-Turbo 2022年11月 对话能力优化,用户级应用落地 GPT-4 2023年3月 多模态、强逻辑推理 GPT-4o / GPT-4…

MySQL中count(*)与count(字段区别)

核心规则 表达式 统计规则 COUNT(*) 统计所有行数(包括所有字段为NULL的行)。 COUNT(字段) 仅统计该字段不为NULL的行数(若字段为NULL则自动忽略该行)。 误区 A表连接B表,若A和B是一对多的关系时,会出现…

【Unity】在项目中使用VisualScripting

1. 在packagemanager添加插件 2. 在设置中进行初始化。 Edit > Project Settings > Visual Scripting Initialize Visual Scripting You must select Initialize Visual Scripting the first time you use Visual Scripting in a project. Initialize Visual Scripting …

vue 仿deepseek前端开发一个对话界面

后端:调用deepseek的api,所以返回数据格式和deepseek相同 {"model": "DeepSeek-R1-Distill-Qwen-1.5B", "choices": [{"index": 0, "delta": {"role": "assistant", "cont…

基于Spring Boot的小区疫情购物系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

【openwebui 搭建本地知识库(RAG搭建本地知识库)】

安装准备 openwebui 这个本地安装之前写过使用python安装。也可以直接用docker 命令 docker run --rm -d \-p 3080:8080 \-p 3081:8081 \-e WEBUI_AUTHtrue \-e DEFAULT_LOCALEcn \-e GLOBAL_LOG_LEVEL"INFO" \-e AIOHTTP_CLIENT_TIMEOUT100 \--privilegedtrue \-…

Linux 提权

文章目录 前言1. 内核漏洞提权脏牛(CVE-2016-5195) 2. 不安全的系统配置项2.1 SUID/SGID提权2.2 sudo提权2.3 定时任务提权2.4 capabilities提权 3. 第三方软件提权Tomcat managerNginx本地提权(CVE-2016-1247)Redis未授权 4. 参考…

谷粒商城:性能压测JVM堆区

目录 Kit Apache JMeter VisualVM 堆内存 jvm内存模型 垃圾回收(Garbage Collection, GC) 新对象分配内存 GC步骤 MinorGC 性能优化 影响因素 优化 nginx动静分离 优化三级分类获取 Jvm参数配置堆区 测试 Kit Apache JMeter 压力测试&…

TCP协议支持全双工原因TCP发送接收数据是生产者消费者模型

一、TCP支持全双工的原因 TCP协议支持全双工,即使用TCP协议进行通信时,服务端和客户端可以同时进行数据的发送和接收,互不干扰,实现同时双向传输数据。 这是因为使用TCP协议通信时,读写套接字的文件描述符既用来发送…

观成科技:​加密C2框架Platypus流量分析

一、工具介绍 Platypus 是一款支持多会话的交互式反向 Shell 管理器。在实际的渗透测试中,为了解决 Netcat/Socat 等工具在文件传输、多会话管理方面的不足,该工具在多会话管理的基础上增加了在渗透测试中能更好发挥作用的功能(如:交互式 Sh…

在 C# 中,is null 和 == null ‌不完全等价‌

最近遇到了一个看似奇怪的问题,判断一个对象是否为null,我使用了null来判断,结果他是null但是仍然进入了判断。 经过讨论和验证,发现使用is null 可以解决问题,于是查阅了资料。 在 C# 中,is null 和 nul…

go语言zero框架拉取内部平台开发的sdk报错的修复与实践

在开发过程中,我们可能会遇到由于认证问题无法拉取私有 SDK 的情况。这种情况常发生在使用 Go 语言以及 Zero 框架时,尤其是在连接到私有平台,如阿里云 Codeup 上托管的 Go SDK。如果你遇到这种错误,通常是因为 Go 没有适当的认证…

VBA+FreePic2Pdf 找出没有放入PDF组合的单个PDF工艺文件

设计部门针对某个项目做了一个工艺汇总报告,原先只要几十个工艺文件,组合成一个PDF,但后来要求要多放点PDF进去,但工艺文件都混在一起又不知道哪些是重复的,找上我让我帮忙处理一下,我开始建议让她重新再组…

Webservice如何调用

webservice调用方式: (1)http方式调用 请求头增加Content-type:text/xml 或application/soapxml SOAPAction:方法名 请求body以xml字符串传递,xml格式定义 返回以xml字符串返回,xml某个字段是一个json字符串。 入…

2025-03-10 吴恩达机器学习1——机器学习概述

文章目录 1 监督学习1.1 回归1.2 分类 2 无监督学习2.1 聚类2.2 异常检测2.3 降维 3 使用 Jupyter Notebook ​ 1959 年,Arthur Samuel 将机器学习定义如下: ​ Field of study that gives computers the ability to learn without being explicitly pro…

Python 进程与线程-分布式进程

目录 分布式进程 小结 分布式进程 在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。 Python的multiprocessing模块不但支…

使用 Excel 实现绩效看板的自动化

引言 在日常工作中,团队的绩效监控和管理是确保项目顺利进行的重要环节。然而,面临着以下问题: ​数据分散:系统中的数据难以汇总,缺乏一个宏观的团队执行情况视图。​看板缺失:系统本身可能无法提供合适…