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 可达的对象标记为存活对象
清除:清除的过程中将遍历堆中所有的对象,将没有标记的对象全部清除掉
主要缺点:标记和清除过程效率不高,标记清除之后会产生大量不连续的内存碎片
但是,老年代中因为对象存活率高,没有额外空间对他进行分配担保,就必须使用标记整理算法
标记整理算法 标记操作和“标记-清除”算法一致,后续操作不只是直接清理对象,而是在清理
无用对象完成后让所有存活的对象都向一段移动,并更新其引用对象的指针
主要缺点:在标记清除的基础上还需要进行对象的移动,成本相对比较高,成本相对较高,好处是不会产生内存碎片。
相关文章:
JAVA面试_进阶部分_Java JVM:垃圾回收(GC 在什么时候,对什么东西,做了什么事情)
在什么时候: 首先需要知道,GC又分为minor GC 和 Full GC(major GC)。Java堆内存分为新生代和老年代,新生代 中又分为1个eden区和两个Survior区域。 一般情况下,新创建的对象都会被分配到eden区ÿ…...
【探秘海洋伤痕】海洋环境污染损害的警世启示
在地球这个蓝色星球上,广袤无垠的海洋孕育了无数生命,支撑着地球的生态平衡与人类的生存发展。然而,随着工业化和现代化的加速,海洋环境遭受的伤害日益严重,海洋环境污染损害成为了我们必须直面的严峻问题。本文将带您…...
过滤器(Filter)与拦截器(Interceptor)
在Java Web开发中,**拦截器(Interceptor)和过滤器(Filter)**都用于在请求处理过程中拦截和处理HTTP请求或响应,但它们有不同的应用场景和工作原理。下面将详细解释它们的区别,并提供代码演示。 …...
智慧城市运行管理服务平台建设方案
随着城市化的快速发展,城市运行管理面临着前所未有的挑战。智慧城市的概念应运而生,旨在通过信息技术手段提升城市管理效率和居民生活质量。智慧城市运行管理服务平台作为智慧城市建设的核心组成部分,其建设方案的科学性和前瞻性至关重要。 …...
Java是怎么解决并发问题的?
Happens-Before规则(前言) Happens-Before规则 是 Java 内存模型(JMM)中用于定义线程间操作可见性和有序性的一种规范。它的核心目的是:确保一个线程的某些操作结果对其他线程是可见的,并且这些操作在时间上的顺序不会被重排序破…...
使用 Chrome Flags 设置(适用于 HTTP 站点开发)
使用 Chrome Flags 设置(适用于 HTTP 站点开发) 在 Chrome 地址栏输入:chrome://flags/在搜索框输入 “Insecure origins” 或 “Allow invalid certificates”。找到 “Insecure origins treated as secure” 选项(或者 #allow-…...
解锁 AI 开发的无限可能:邀请您加入 coze-sharp 开源项目
大家好!今天我要向大家介绍一个充满潜力的开源项目——coze-sharp!这是一个基于 C# 开发的 Coze 客户端,旨在帮助开发者轻松接入 Coze AI 平台,打造智能应用。项目地址在这里:https://github.com/zhulige/coze-sharp&a…...
【Swift】面向协议编程之HelloWorld
定义一个协议(protocol),swift 中可以对protocol 进行扩展(extension)通过协议的扩展可以对函数有默认的实现 protocol Sleepable {func sleep() } protocol Eatable {func eat() } extension Eatable {func eat() {print("eat food")} }在类(class)或结…...
图神经网络学习笔记—纯 PyTorch 中的多 GPU 训练(专题十二)
对于许多大规模的真实数据集,可能需要在多个 GPU 上进行扩展训练。本教程将介绍如何通过 torch.nn.parallel.DistributedDataParallel 在 PyG 和 PyTorch 中设置多 GPU 训练管道,而无需任何其他第三方库(如 PyTorch Lightning)。请注意,此方法基于数据并行。这意味着每个 …...
Linux云计算SRE-第二十周
完成ELK综合案例里面的实验,搭建完整的环境 一、 1、安装nginx和filebeat,配置node0(10.0.0.100),node1(10.0.0.110),node2(10.0.0.120),采用filebeat收集nignx日志。 #node0、node1、node2采用以下相同方式收集ngin…...
springcloud gateway搭建及动态获取nacos注册的服务信息信息
前言 Spring Cloud Gateway 通过集成 Nacos 服务发现,可以动态获取注册到 Nacos 的微服务实例信息,并根据服务名(Service Name)自动生成路由规则或手动配置路由规则,实现请求的动态路由和负载均衡。 一个最简单的网关就…...
SSM基础专项复习6——Spring框架AOP(3)
系列文章 1、SSM基础专项复习1——SSM项目整合-CSDN博客 2、SSM基础专项复习2——Spring 框架(1)-CSDN博客 3、SSM基础专项复习3——Spring框架(2)-CSDN博客 4、SSM基础专项复习4——Maven项目管理工具(1ÿ…...
【嵌入式linux】网口和USB热插拔检测
在Linux常常需要对网口和USB等外设接口进行插拔检测,从而执行部分初始化操作。下面简要介绍Linux的Netlink机制,并在C程序中使用Linux的Netlink机制完成网口和USB口插拔检测。 Netlink 是 Linux 内核与用户空间进程通信的一种机制,主要用于内…...
C++(13)—类和对象(中) ③拷贝构造函数
文章目录 一、拷贝构造函数的基本概念1.1 什么是拷贝构造函数?1.2 拷贝构造函数的调用场景 二、拷贝构造函数的核心特性2.1 拷贝构造函数的参数2.2 默认拷贝构造函数 三、深拷贝与浅拷贝3.1 浅拷贝的问题 四、拷贝构造函数的实际应用4.1 何时需要显式定义拷贝构造函…...
【GPT入门】第17课 RAG向量检索分类、原理与优化
【GPT入门】第16课 RAG向量检索分类、原理与优化 1.向量检索概念1.1 文本检索的两类方式1.2 向量的定义1.3 文本向量(Text Embeddings)1.4 文本向量如何得到1.5 向量间相似度计算1.6 向量数据库功能对比1.7 open ai发布的两个向量模型2.向量数据库1.8 向量检索的优化3.检索后…...
Operator <=> (spaceship operator)
operator <>动机 在C20以前定义比较运算符:其他比较运算符基于<和实现 struct Type {int value;// 相等运算符friend bool operator(const Type& a, const Type& b) {return a.value b.value;}// 不等运算符friend bool operator!(const Type&a…...
队列的简单例题
题目如下 模拟队列 首先你要明白队列的话 只有队尾才能进行新增,也就是入队 只有队首才能出队,也就是删除 队首队尾指针一开始默认都是0 相当于队列中一开始是有一个元素的就是 0的位置 队首指针head0 队尾指针tail0 1.入队也就是队尾要先赋值…...
Calibre-Web-Automated:打造你的私人图书馆
有没有小伙伴在工作、学习或生活中喜欢保存一些书籍或PDF文件,结果过一段时间想找的时候却怎么也找不到,最后只能无奈放弃?你是否已经厌倦了手动管理电子书的繁琐?是否梦想拥有一个私人图书馆,随时随地都能轻松访问自己…...
第27周JavaSpringboot 前后端联调
电商前后端联调课程笔记 一、项目启动与环境搭建 1.1 项目启动 在学习电商项目的前后端联调之前,需要先掌握如何启动项目。项目启动是整个开发流程的基础,只有成功启动项目,才能进行后续的开发与调试工作。 1.1.1 环境安装 环境安装是项…...
【实战ES】实战 Elasticsearch:快速上手与深度实践-8.2.1AWS OpenSearch无服务器方案
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 8.2.1AWS OpenSearch 无服务器方案深度解析与实践指南1. Serverless架构的核心价值与行业趋势1.1 传统Elasticsearch集群的运维挑战1.2 Serverless技术演进路线技术特性对比…...
鸿蒙开发者社区资源的重要性
鸿蒙系统,作为华为公司自主研发的操作系统,旨在为各类智能设备提供统一的平台。它不仅支持手机、平板电脑等移动设备,还涵盖了物联网(IoT)设备和其他智能家居产品。鸿蒙系统的开发环境和工具链对于开发者来说至关重要&…...
【QT】事件系统入门——QEvent 基础与示例
一、事件介绍 事件是 应用程序内部或者外部产生的事情或者动作的统称 在 Qt 中使用一个对象来表示一个事件。所有的 Qt 事件均继承于抽象类 QEvent。事件是由系统或者 Qt 平台本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候&…...
⚡️Jolt -- 通过JSON配置来处理复杂数据转换的工具
简介:一个能够通过JSON配置(特定的语法)来处理复杂数据转换的工具。 比如将API响应转换为内部系统所需的格式,或者处理来自不同来源的数据结构差异。例如,将嵌套的JSON结构扁平化,或者重命名字段࿰…...
2025-03-13 禅修-错误的做法
摘要: 2025-03-13 禅修-错误的做法 禅修-错误的做法 我们今天的课程是这个禅修防误。主要是有一些我们所明令禁止的。在整个禅修过程中,会对我们禅修出现一些弊端的这部分,我们会给大家介绍。第一,在禅修中要防止自由联想,防止幻…...
uni-app学习笔记——自定义模板
一、流程 1.这是一个硬性的流程,只要按照如此程序化就可以实现 二、步骤 1.第一步 2.第二步 3.第三步 4.每一次新建页面,都如第二步一样;可以选择自定义的模版(vue3Setup——这是我自己的模版),第二步的…...
【医院绩效管理专题】8.医院绩效数据的收集与整理方法:洞察现状,引领未来
医院成本核算、绩效管理、运营统计、内部控制、管理会计专题索引 一、引言 在当今医疗行业竞争日益激烈的背景下,医院绩效管理已成为提升医疗服务质量、优化运营效率、增强综合竞争力的关键因素。而绩效数据的收集与整理作为绩效管理的基础环节,其科学性、准确性和完整性直…...
麒麟系统如何安装Anaconda
在银河麒麟操作系统(Kylin OS)中安装 Anaconda 的步骤相对简单,以下是基于搜索结果整理的详细安装指南: 步骤 1:下载 Anaconda 安装脚本 打开浏览器,访问 Anaconda 官方下载页面。选择适合 Linux 系统的安…...
Linux网络套接字编程——UDP服务器
Linux网络套接字编程——创建并绑定-CSDN博客 前面已经介绍了网络套接字的创建和绑定,这篇文章会通过UDP套接字实现一个UDP服务器。 先介绍将使用的接口。 recvfrom ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr,…...
deepseek+kimi做ppt教程记录
1.首先注册deepseek和kimi deepseek官网:https://chat.deepseek.com/ kimi官网:https://kimi.moonshot.cn/ 以下以一篇工作总结报告为例 2.使用deepseek生成ppt大纲 让deepseek生成kimi生成ppt所需要的内容时,需要注意提示词内容,…...
Cursor 终极使用指南:从零开始走向AI编程
Cursor 终极使用指南:从零开始走向AI编程 问什么是cursor? mindmaproot(Cursor核心功能)智能编码代码生成自动补全错误修复项目管理多窗口布局版本控制终端集成个性设置主题定制快捷键配置插件扩展AI协作对话编程知识检索文档生成前些天发现了一个巨牛的人工智能学…...
TiDB 观测性解读(一)丨索引观测:快速识别无用索引与低效索
导读 可观测性已经成为分布式系统成功运行的关键组成部分。如何借助多样、全面的数据,让架构师更简单、高效地定位问题、分析问题、解决问题,已经成为业内的一个技术焦点。本系列文章将深入解读 TiDB 的关键参数,帮助大家更好地观测系统的状…...
批量将 Excel 文档中的图片提取到文件夹
前面我们介绍过如何批量删除 Excel 文档中的所有图片或者指定的图片,其中就需要用到批量提取 Excel 文档中图片的操作。我们如何才能够将 Excel 文档中的图片快速的提取出来呢?其实单个 Excel 文档中的图片提取到文件夹中是有多种方法可以完成的…...
postgresql 数据库使用
目录 索引 查看索引 创建 删除索引 修改数据库时区 索引 查看索引 select * from pg_indexes where tablenamet_table_data; 或者 select * from pg_statio_all_indexes where relnamet_table_data; 创建 CREATE INDEX ix_table_data_time ON t_table_data (id, crea…...
怎样进行相关论文的调研——How to conduct research on relevant papers?
怎样进行相关论文的调研 写在前面1.打开Web of Science2.检索同类表达3.构建“检索式”什么是“检索式” 参考内容 写在前面 偶然间刷到一篇知乎文章,顺着文章的推荐看了钟澄老师的科研论和在B站上的教学视频,深入了解后发现读文章还有这么多讲究&#…...
蓝桥杯备赛-基础练习 day1
1、闰年判断 问题描述 给定一个年份,判断这一年是不是闰年。 当以下情况之一满足时,这一年是闰年:1.年份是4的倍数而不是100的倍数 2.年份是400的倍数。 其他的年份都不是闰年。 输入格式 输入包含一个…...
本地算力部署大模型详细流程(一)
1、版本选择 本地部署就是自己部署deepseek模型,使用本地的算力。 主要瓶颈:内存显存的大小。特点:此方案不用联网。适合:有数据隐私方面担忧的或者保密单位根本就不能上网的。 2、部署过程 比较流行的是使用ollama:ht…...
便利店商品推荐数字大屏:基于python和streamlit
基于python和streamlit实现的便利店商品推荐大屏,针对选择困难症消费者。 import streamlit as st import pandas as pd import numpy as np import altair as alt from datetime import datetime, timedelta import time# 模拟数据生成 def generate_data():np.ra…...
机器视觉工程师红外相机的选择:红外长波工业相机和短波红外工业相机玄机大总结
红外长波(LWIR)和短波(SWIR)工业相机在原理、应用场景和技术特点上有显著差异。以下是它们的对比分析: 1. 波长范围与成像原理 2. 技术特点 3. 典型应用场景 4. 优缺点对比 LWIR优势: 无需光照,适用于完全黑暗环境。 直接反映物体温度分布。 对烟雾、灰尘穿透能力强。…...
AI重构SEO关键词布局
内容概要 在搜索引擎优化(SEO)领域,AI技术的深度应用正在颠覆传统关键词布局逻辑。通过机器学习算法与语义分析模型,智能系统能够实时解析海量搜索数据,构建动态词库并精准捕捉用户意图。相较于依赖人工经验的关键词筛…...
c语言经典基础编程题
c语言经典基础编程题 一、输出输出1.1温度输出1.2排齐数据1.3进制转换 二、选择分支2.1求最大值2.2成绩评定2.3分段函数求值2.4 利润计算2.5判断闰年2.6二次方程根 三、循环结构3.1倒数求和3.2最大数3.3判断素数3.4判断完全数3.5打印菱形🚀🚀Ὠ…...
【每日学点HarmonyOS Next知识】防截屏、作用域问题、观察器问题、对话框关闭、判断对象包含某个字段
1、HarmonyOS 防截屏功能如何实现? 防截屏功能如何实现 参考demo: aboutToDisappear(): void {let windowClass: window.Window | undefined undefined;window.getLastWindow(getContext(this)).then((win) > {this.window win }) window.getLas…...
linux操作系统实战
第一题 创建根目录结构中的所有的普通文件 [rootlocalhost ~]# cd /[rootlocalhost /]# mkdir /text[rootlocalhost /]# cd /text[rootlocalhost text]# mkdir /text/boot /text/root /text/home /text/bin /text/sbin /text/lib /text/lib64 /text/usr /text/opt /text/etc /…...
MKS HA-MFV:半导体制造中的高精度流量验证技术解析
引言 在半导体先进制程(如3nm节点)中,工艺气体流量的精准控制直接决定刻蚀、沉积等关键步骤的均匀性和良率。MKS Instruments推出的 HA-MFV(High Accuracy Mass Flow Verifier) 通过创新设计解决了传统流量验证技术的…...
图论part2|200. 岛屿数量、695. 岛屿的最大面积
200、岛屿数量 🔗:200. 岛屿数量 - 力扣(LeetCode)思路: 1. 深度优先算法 二叉树中dfs要素:1、访问左右相邻子节点 2、判断base case(终止条件)参考二叉树中的dfs看网格问题1. 网格…...
小白学Agent技术[5](Agent框架)
文章目录 Agent框架Single Agent框架BabyAGIAutoGPTHuggingGPTHuggingGPT工作原理说明GPT-EngineerAppAgentOS-Copilot Multi-Agent框架斯坦福虚拟小镇TaskWeaverMetaGPT微软UFOAgentScope现状 常见Agent项目比较概述技术规格和能力实际应用案例开发体验比较ChatChain模式 Agen…...
SpringBoot为什么流行以及能解决什么问题?
Spring Boot 之所以流行,主要是因为它极大地简化了 Spring 应用的开发,提供了一种开箱即用的体验,使开发者能够快速构建独立运行的、生产级的 Spring 应用。 Spring Boot 为什么流行? 简化配置 传统 Spring 需要大量 XML 或 Java…...
MySQL -- 数据类型
1、数据库的基础数据类型 TINYINT INT BIGINT FLOAT DECIMAL CHAR VARCHAR TEXT BLOB DATE DATETIME TIMESTAMP SET ENUM 2、不同数据类型区别以及作用 1、数值类型 1.1 整数类型 1.1.1 TINYINT 这里我们以TINYINT这个类型为例,解释一下在mysql中…...
TypeScript 中 interface 与 type的使用注意事项 及区别详细介绍
interfact 与 type 的区别及使用方法 一、 interfact 与 type主要区别 二、 interfact 与 type具体用法 1. 定义对象类型 interface 的典型用法: interface Person {name: string;age: number;greet(): void; }type 的等效定义: type Person {name…...
使用位运算如何找到数组中只出现一次的数?
题目链接:137. 只出现一次的数字 II - 力扣(LeetCode) 算法解析 位运算是用于二进制的运算符号。而对于多次出现的数字,其二进制都是一模一样的,这里是3次重复的出现是数字。由此我们可以想到,如果我们由低…...
复变函数摘记1
复变函数摘记1 1. 基本概念1.1 复数、复变函数1.2 复变函数的极限、连续性1.3 复变函数的导数、微分1.4 解析函数、柯西-黎曼方程 2. 复变函数的积分2.1 复变函数的曲线积分2.2 柯西-古萨基本定理、复合闭路定理2.3 复变函数的不定积分2.4 柯西积分公式、高阶导数 \quad 本文摘…...