Java面试题、八股文学习之JVM篇
1.对象一定分配在堆中吗?有没有了解逃逸分析技术?
对象不一定总是分配在堆中。在Java等一些高级编程语言中,对象的分配位置可以通过编译器或运行时系统的优化来决定。其中,逃逸分析(Escape Analysis)是用于提高程序性能的一种技术,它可以帮助JVM(Java虚拟机)确定一个对象是否真的需要被分配到堆上。
逃逸分析的基本概念
逃逸分析是一种可以确定指针动态范围的技术。如果一个对象在一个方法内部创建,并且这个对象的引用不会逃逸出该方法(即该方法之外的代码无法访问这个对象),那么这个对象就可以被认为是“不逃逸”的。反之,如果一个对象的引用可以被其他线程访问或者存储到全局变量中,那么这个对象就是“逃逸”的。
逃逸分析的应用
-
栈上分配:对于不逃逸的对象,JVM可以选择不在堆上分配内存,而是在栈上分配。这样做可以减少垃圾回收的压力,因为栈上的对象会随着方法的结束而自动销毁。这种方法也被称为“栈分配”。
-
同步消除:如果一个对象只被一个线程访问,那么对该对象的同步操作(如锁)可能是不必要的。通过逃逸分析,JVM可以识别这些情况并移除多余的同步开销。
-
标量替换:当一个对象的所有字段都不会逃逸时,JVM可以直接将这些字段分配给调用者的方法栈帧,而不需要为整个对象分配空间。这进一步减少了内存的使用和垃圾回收的工作量。
实现细节
逃逸分析的具体实现依赖于具体的JVM版本和配置。例如,在HotSpot JVM中,默认情况下逃逸分析是开启的,但它的效果可能会受到其他因素的影响,比如JIT(Just-In-Time)编译器的选择和优化级别。
总的来说,逃逸分析是一个强大的工具,它可以显著提升应用程序的性能,尤其是在内存管理和多线程环境中。然而,它的效果并不是绝对的,有时候可能需要开发者通过代码设计来辅助优化。
2.虚拟机为什么使用元空间替换了永久代?
Java虚拟机(JVM)在Java 8及更高版本中,使用元空间(Metaspace)替换了永久代(PermGen),主要是为了改进内存管理的效率和灵活性。以下是几个关键原因:
- 无固定大小限制:永久代有一个固定的大小,当加载大量的类时可能会导致OutOfMemoryError。而元空间是动态扩展的,默认情况下不受JVM堆大小的限制,只受限于操作系统的可用内存。
- 性能优化:移除永久代后,类的元数据存储在本地内存区域,这有助于提高垃圾回收的效率。由于类的元数据不再与应用程序对象一起存储在堆中,因此可以更有效地进行清理和压缩。
- 简化内存管理:永久代的设计初衷是为了隔离类的元数据和其他应用程序数据,但它的实现较为复杂。相比之下,元空间通过直接使用本地内存来简化了内存管理过程。
- 更好的诊断工具支持:随着元空间的引入,相关的监控和调试工具得到了增强,能够更好地帮助开发者理解和解决与类加载相关的问题。
- 减少碎片化:永久代容易产生碎片化问题,尤其是在频繁加载和卸载类的情况下。元空间则避免了这种问题,因为它不依赖于堆内存分配策略。
这些改进使得元空间成为了一个更为高效、灵活和可靠的替代方案。
3.什么是Stop The World ? 什么是OopMap?什么是安全点?
在Java虚拟机(JVM)中,Stop-The-World (STW)、OopMap 和 安全点(Safepoint) 是与垃圾回收和其他并发操作密切相关的重要概念。下面我将详细解释每个概念及其作用。
Stop-The-World (STW)
Stop-The-World 指的是 JVM 在执行某些操作时需要暂停所有正在运行的 Java 线程。这些操作通常包括但不限于:
- Full GC(Full Garbage Collection):当年轻代和老年代都需要进行垃圾回收时。
- Heap Resize:调整堆内存大小。
- Class Unloading:卸载不再使用的类。
- Thread Dumping:生成线程转储信息。
- Debugging Operations:调试操作。
特点:
- 暂停时间:STW 会导致所有 Java 线程暂停,这段时间称为 STW 停顿。
- 影响性能:长时间的 STW 停顿会影响应用程序的响应时间和吞吐量。
- 优化目标:现代 JVM 实现通过各种技术(如 G1 垃圾收集器)尽量缩短 STW 时间。
OopMap
OopMap 是一种数据结构,用于记录某个时刻线程栈上对象引用的位置。它在垃圾回收过程中扮演着关键角色,特别是在处理并发垃圾回收算法时。
主要用途:
- 识别活动对象:在垃圾回收期间,GC 需要知道哪些对象仍然被程序引用,以决定是否可以回收它们。OopMap 提供了这些对象的精确位置信息。
- 支持增量式和并发垃圾回收:通过 OopMap,GC 可以准确地跟踪和更新对象引用,即使是在线程继续运行的情况下也能进行有效的垃圾回收。
安全点(Safepoint)
- 安全点是指程序执行过程中的特定位置,在这些位置,所有的线程都可以被暂停,并且此时的程序状态是“一致”的。换句话说,安全点是一个可以让 JVM 进行全局操作的时间点,比如垃圾回收。
关键特性:
- 一致的状态:在安全点处,所有的线程都处于一个可预测的状态,便于 JVM 执行全局操作。
- 自动插入:编译器会在字节码中自动插入安全点指令,通常在方法调用、循环控制等地方。
- 协作机制:线程在遇到安全点时会检查是否有全局操作请求,如果有,则进入等待状态,直到操作完成。
安全点与 OopMap 的关系
安全点和 OopMap 之间有着密切的关系:
- 同步信息:在安全点处,线程会提供其当前的 OopMap 给垃圾回收器,以便 GC 能够准确地追踪和更新对象引用。
- 协调操作:通过结合安全点和 OopMap,JVM 可以在不中断应用程序逻辑的前提下高效地执行垃圾回收和其他全局操作。
总结
- Stop-The-World:JVM 暂停所有线程以执行全局操作,常见于 Full GC。
- OopMap:记录线程栈上的对象引用位置,帮助垃圾回收器识别活动对象。
- 安全点:程序执行过程中的特定位置,允许 JVM 暂停所有线程并执行全局操作。
4.说一下JVM 的主要组成部分及其作用?
Java虚拟机(JVM)是Java平台的核心组件,负责执行编译后的Java字节码。JVM由多个主要组成部分构成,每个部分都有其特定的作用。以下是JVM的主要组成部分及其作用:
1. 类加载器子系统 (ClassLoader Subsystem)
作用:
- 加载类:从不同的来源(如文件系统、网络等)加载类文件。
- 链接类:包括验证、准备和解析三个阶段。
- 验证:确保加载的类符合JVM规范。
- 准备:为类的静态变量分配内存,并设置默认初始值。
- 解析:将常量池中的符号引用替换为直接引用。
- 初始化类:执行类构造器 () 方法,对静态变量进行显式初始化。
2. 运行时数据区 (Runtime Data Areas)
作用:
- 方法区 (Method Area):存储类的信息(如字段、方法)、常量池、静态变量等。在Java 8及更高版本中,方法区被元空间(Metaspace)取代。
- 堆 (Heap):所有线程共享的一块内存区域,用于存储对象实例和数组。
- Java栈 (Java Stack):每个线程拥有一个私有的Java栈,用于存储方法调用帧(Frame),每个帧包含局部变量表、操作数栈、动态链接信息等。
- 程序计数器 (Program Counter Register):每个线程有一个程序计数器,指向当前正在执行的指令。
- 本地方法栈 (Native Method Stack):用于支持本地方法(C/C++ 编写的代码)的执行。
3. 执行引擎 (Execution Engine)
作用:
- 解释器 (Interpreter):逐条解释字节码指令,适用于启动初期或方法调用次数较少的情况。
- 即时编译器 (Just-In-Time Compiler, JIT Compiler):将热点代码(频繁执行的方法)编译成机器码,提高执行效率。常见的JIT编译器有HotSpot VM中的Client Compiler和Server Compiler。
- 垃圾回收器 (Garbage Collector):自动管理内存,回收不再使用的对象,防止内存泄漏。
4. 系统接口 (System Interface)
作用:
- 本地接口 (Native Interface):提供与操作系统之间的通信机制,允许Java程序调用本地库函数。
- 输入输出接口 (Input/Output Interface):处理标准输入输出流,以及文件系统访问等。
5. 工具接口 (Tool Interface)
作用:
- 调试接口 (Debugging Interface):提供调试功能,允许开发者使用调试工具检查和控制程序运行状态。
- 性能监控接口 (Performance Monitoring Interface):提供性能监控功能,帮助开发者分析和优化程序性能。
6. 安全管理器 (Security Manager)
作用:
- 安全管理:控制程序的行为,防止恶意代码对系统造成损害。通过安全策略文件定义权限规则。
7. 内核类库 (Core Class Libraries)
作用:
- 提供丰富的API:包括集合框架、I/O处理、多线程支持、图形用户界面等,简化开发工作。
总结
JVM 的各个组成部分协同工作,共同实现了 Java 字节码到机器码的转换和执行过程,提供了高效的运行环境。了解这些组成部分及其作用有助于更好地理解和优化 Java 应用程序的性能和安全性。
5.什么是指针碰撞?
指针碰撞(Pointer Bumping) 是一种内存分配策略,主要用于堆内存管理。它通常与 分代垃圾回收(Generational Garbage Collection) 结合使用,特别是在年轻代的内存分配中。下面详细介绍指针碰撞的工作原理及其特点。
指针碰撞的基本概念
在分代垃圾回收机制中,堆内存被分为不同的区域,最常见的是 年轻代(Young Generation) 和 老年代(Old Generation)。年轻代进一步细分为 Eden 区 和两个 Survivor 区(通常是 S0 和 S1)。指针碰撞主要发生在 Eden 区和 Survivor 区的内存分配过程中。
工作原理
-
初始化:
- 当 JVM 启动时,年轻代会被划分为 Eden 区和两个 Survivor 区。
- 初始化时,top 指针指向 Eden 区的起始位置,end 指针指向 Eden 区的末尾。
-
对象分配:
- 当需要创建新对象时,JVM 会尝试将对象分配到 Eden 区。
- 分配过程非常简单且高效:只需移动 top 指针,使其向前移动对象所需的字节数。这个操作类似于“指针碰撞”。
-
检查空间:
- 在每次分配对象之前,JVM 会检查 Eden 区是否有足够的连续空间来容纳新对象。
- 如果有足够的空间,则直接进行指针碰撞;否则,触发 Young GC 或者重新分配 Survivor 区的空间。
-
Minor GC(Young GC):
- 当 Eden 区满载或即将满载时,发生 Minor GC。
- 尚存活的对象会被复制到其中一个 Survivor 区(例如 S0),而另一个 Survivor 区(S1)则清空。
- 生存下来的对象在下次 Minor GC 中可能会再次被复制到另一个 Survivor 区,或者如果达到一定的年龄阈值(通常是 15 次),则会被晋升到老年代。
-
指针重置:
- Minor GC 后,top 指针会重置回 Eden 区的起始位置,准备接收新的对象分配。
示例图解
假设有一个简单的年轻代结构如下:
+-------------------+
| Eden |
| |
| top | -> 指向下一个可用地址
| |
+-------------------+
| Survivor S0 |
+-------------------+
| Survivor S1 |
+-------------------+
初始状态:
+-------------------+
| Eden |
| |
| top | -> 初始位置
| |
+-------------------+
| Survivor S0 |
+-------------------+
| Survivor S1 |
+-------------------+
分配对象 A:
+-------------------+
| Eden |
| [A] |
| top | -> 移动后的 top
| |
+-------------------+
| Survivor S0 |
+-------------------+
| Survivor S1 |
+-------------------+
分配对象 B:
+-------------------+
| Eden |
| [A][B] |
| top | -> 再次移动后的 top
| |
+-------------------+
| Survivor S0 |
+-------------------+
| Survivor S1 |
+-------------------+
触发 Minor GC:
- 存活对象 [A] 被复制到 S0。
- Eden 和 S1 清空。
- top 指针重置到 Eden 的起始位置。
GC 后的状态:
+-------------------+
| Eden |
| |
| top | -> 初始位置
| |
+-------------------+
| Survivor S0 |
| [A] |
+-------------------+
| Survivor S1 |
+-------------------+
特点和优势
- 高效性:
- 指针碰撞只需要简单的指针移动操作,速度极快,适合频繁的对象分配场景。
- 低开销:
- 相比于其他复杂的内存分配算法,指针碰撞几乎没有额外的开销。
- 紧凑存储:
- 新分配的对象紧邻在一起,减少了内存碎片化的问题。
- 易于实现:
- 指针碰撞的逻辑相对简单,易于理解和实现。
注意事项
- 内存不足:
- 如果 Eden 区无法容纳新对象,需要触发 Minor GC 或者调整堆大小。
- 对象过大:
- 对于大对象(大于 Eden 区一半大小的对象),通常会直接分配到老年代,以避免频繁的 GC。
- 垃圾回收频率:
- 频繁的对象分配可能导致较高的 Minor GC 频率,影响性能。可以通过调整堆大小和垃圾收集器参数来优化。
总结
指针碰撞是一种高效的内存分配策略,广泛应用于现代 JVM 的年轻代内存管理中。通过简单的指针移动操作,它可以快速地为新对象分配内存,并结合分代垃圾回收机制有效地管理内存,确保应用程序的高性能和稳定性。
相关文章:
Java面试题、八股文学习之JVM篇
1.对象一定分配在堆中吗?有没有了解逃逸分析技术? 对象不一定总是分配在堆中。在Java等一些高级编程语言中,对象的分配位置可以通过编译器或运行时系统的优化来决定。其中,逃逸分析(Escape Analysis)是用于…...
Apache Maven Assembly 插件简介
Apache Maven Assembly 插件是一个强大的工具,允许您以多种格式(如 ZIP、TAR 和 JAR)创建项目的分发包。 该插件特别适用于将项目与其依赖项、配置文件和其他必要资源一起打包。 通过使用 Maven Assembly 插件,您可以将项目作为…...
3174、清除数字
3174、[简单] 清除数字 1、题目描述 给你一个字符串 s 。你的任务是重复以下操作删除 所有 数字字符: 删除 第一个数字字符 以及它左边 最近 的 非数字 字符。 请你返回删除所有数字字符以后剩下的字符串。 2、解题思路 遍历字符串: 我们需要逐个遍…...
【C#】C# resx方式实现多语言切换(静态切换)
1. 效果 中文界面 英文界面 2. 步骤 1. 添加resx文件 2. Form1.en-GB.resx内容 3. Form1.zh-CN.resx内容 4. Form1.cs修改(重点) using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using Syste…...
鸿蒙系统ubuntu开发环境搭建
在RISC-V等平台移植鸿蒙系统OpenHarmony,需要使用linux环境进行代码的编译,为兼顾日常办公需要,可采用WindowsUbuntu虚拟机的混合开发的环境,通过网络及文件夹共享,在主机和虚拟机之间共享文件数据。 工具准备&#x…...
TCP/IP协议攻击与防范
一、TCP/IP协议攻击介绍 1.1 Internet的结构 LAN:局域网 WAN:广域网 WLAN:无线局域网 私有IP地址与公有IP地址? 私有地址:A类:10.0.0.0~10.255.255.255 B类:172.16.0.0~172.31.255.255…...
1 ISP一键下载
BOOT0BOOT1启动模式说明0X用户Flash用户闪存存储器,也就是Flash启动10系统存储器系统存储器启动,串口下载11SRAM启动SRAM启动,用于在SRAM中调试代码 闪存存储器 是STM32 的内置FLASH,一般使用JTAG或者SWD模式下载程序时,就是下载…...
vue的理解
什么是vue vue是一套用于构建用户界面的渐进式框架,与其他框架不同的是,vue被设计为可以自底向上逐层应用,它也是创建单页面应用的web应用框架。vue的核心库只关注视图层,不仅易上手,还便于与第三方库或既有项目整合。…...
【Leetcode】3206.交替组1
题目描述: https://leetcode.cn/problems/alternating-groups-i/description/?envTypedaily-question&envId2024-11-26 题目示例: 解题思路 思路一: 1.如果color.size()小于等于2,则构不成环,直接返回结果…...
极狐GitLab 17.6 正式发布几十项与 DevSecOps 相关的功能【二】
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…...
oracle小技巧-解决特殊密码字符而导致的exp错误
在使用oracle数据库的时候,我们经常会利用exp工具对某些表进行导出。但有些时候,因我们用户密码为安全性设有特殊字符,导致exp导出时候报:“EXP-00056和ORA-12154”,今天我们就分享下如何通过设置符号隔离的小技巧解决…...
tomcat 文件上传 (CVE-2017-12615)
目录 1、漏洞描述 2、访问ip:port 3、漏洞利用 4、Exploit 5、修复建议 1、漏洞描述 Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。 攻击者将有可能可通过…...
每天五分钟深度学习框架pytorch:卷积神经网络的搭建
本文重点 从本文开始我们将开启卷积神经网络的搭建了,卷积神经网络网络是深度学习中基础的算法模型之一,但是这里我们从实战为主,我们并不会对卷积神经网络详细的介绍,如果不懂得可以看我得《每天五分钟计算机视觉》专栏。 卷积神经网络 卷积神经网络可以认为是多个卷积…...
Opencv+ROS实现颜色识别应用
目录 一、工具 二、原理 概念 本质 三、实践 添加发布话题 主要代码 四、成果 五、总结 一、工具 opencvros ubuntu18.04 摄像头 二、原理 概念 彩色图像:RGB(红,绿,蓝) HSV图像:H࿰…...
JVM详解:垃圾回收机制
java作为大型服务开发的主流语言,其运行会占用大量的内存空间,那么合理的使用有限的服务器资源至关重要。和大多数翻译性语言一样,java的运行环境jvm也内置垃圾回收机制,其通过一些合理的算法组合,定时来对堆中保存的不…...
【单片机的结构和组成】
目录 1、中央处理单元(CPU):2、存储器:3、输入/输出(I/O)接口:4、定时器/计数器:5、模拟-数字转换器(ADC):6、数字-模拟转换器(DAC&am…...
上下文信息、全局信息、局部信息
摘要 在计算机视觉中,上下文信息(contextual information)是一个核心概念,它指的是一个像素或一个小区域周围的环境或背景信息。这种信息对于模型理解图像中对象的相对位置、大小、形状,以及与其他对象的关系至关重要…...
Ansible--自动化运维工具
Ansible自动化运维工具介绍 1.Ansible介绍 Ansible是一款自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。…...
【每日一题】142.环形链表II
最近有点懈怠了,因为连续出差,身心俱疲,实在是没有空做题。 这道题的思路是快慢指针,需要对环形的链表进行数学公式的计算。 根据这个公式可以推断出一个数学结论,当快慢指针相遇的时候,快指针从起点再出发…...
YOLO系列论文综述(从YOLOv1到YOLOv11)【第1篇:概述物体检测算法发展史、YOLO应用领域、评价指标和NMS】
目录 1 前言2 YOLO在不同领域的应用3 物体检测指标和NMS3.1 mAP和IOU3.2 mAP计算流程3.2.1 VOC 数据集3.2.2 微软 COCO 数据集 3.3 NMS 1 前言 最近在做目标检测模型相关的优化,重新看了一些新的论文,发现了几篇写得比较好的YOLO系列论文综述࿰…...
TailwindCss 总结
目录 一、简介 二、盒子模型相关 三、将样式类写到一个类里面apply 四、一款TailWind CSS的UI库 一、简介 官方文档:Width - TailwindCSS中文文档 | TailwindCSS中文网 Tailwind CSS 的工作原理是扫描所有 HTML 文件、JavaScript 组件以及任何 模板中的 CSS 类…...
【开源项目】2024最新PHP在线客服系统源码/带预知消息/带搭建教程
简介 随着人工智能技术的飞速发展,AI驱动的在线客服系统已经成为企业提升客户服务质量和效率的重要工具。本文将探讨AI在线客服系统的理论基础,并展示如何使用PHP语言实现一个简单的AI客服系统。源码仓库地址:ym.fzapp.top 在线客服系统的…...
MySQL原理简介—11.优化案例介绍
大纲 1.禁止或改写SQL避免自动半连接优化 2.指定索引避免按聚簇索引全表扫描大表 3.按聚簇索引扫描小表减少回表次数 4.避免产生长事务长时间执行 1.禁止或改写SQL避免自动半连接优化 (1)业务场景介绍 (2)SQL性能问题分析 (3)SQL性能调优 (1)业务场景介绍 某互联网公司…...
Http 响应协议
HTTP的响应协议 响应数据格式 响应行 响应数据的第一行,包括协议、状态码、描述 响应头 从响应数据格式的第二行开始,也是以key:value的格式 响应体 和响应头之间有一个空行,是响应数据格式的最后一部分,用于存放响应的数据 常见响…...
实现 Browser 客户端下载 XML 文件功能
后端 使用 io.BytesIO 方法 创建一个字节缓冲区在不需要磁盘文件的情况下进行文件操作打包为 zip 压缩包(上图代码)in_memory_zip.seek(0) 数据写入ZIP后文件指针会停留在缓冲区的末尾将文件指针重置回开头make_response() 方法用于创建HTTP响应的函数.g…...
Matlab以一个图像分类例子总结分类学习的使用方法
目录 前言 导入数据 训练学习 导出训练模型 仿真测试 总结 前言 最近在尝试一些基于Simulink的边沿AI部署,通过这个案例总结Matlab 分类学习功能的使用。本案例通过输入3000张28*28的灰度图像,训练分类学习模型。并验证训练好的模型最后部署到MCU。 导入数据 如下图是…...
AI-agent矩阵营销:让品牌传播无处不在
矩阵营销是一种通过多平台联动构建品牌影响力的策略,而 AI-agent 技术让这一策略变得更加智能化。AI社媒引流王凭借其矩阵管理功能,帮助品牌在多个平台上实现深度覆盖与精准传播。 1. 矩阵营销的优势 品牌触达更广:多平台联动可以覆盖不同用…...
HDMI转VGA方案 LT8612UX(HDMI2.0) LT8612SX LT8511EX LT8522EX LT8612EX_e(HDMI1.4)
一、产品概述 LT8612UX是一款高性能的HDMI至HDMI&VGA转换器,由龙迅半导体公司推出。它能够将HDMI2.0数据流转换为HDMI2.0信号和模拟RGB信号,同时输出8通道I2S和SPDIF信号,实现高质量的7.1声道音频。该转换器采用最新的ClearEdge技术&…...
零基础3分钟快速掌握 ——Linux【终端操作】及【常用指令】Ubuntu
1.为啥使用Linux做嵌入式开发 能广泛支持硬件 内核比较高效稳定 原码开放、软件丰富 能够完善网络通信与文件管理机制 优秀的开发工具 2.什么是Ubuntu 是一个以桌面应用为主的Linux的操作系统, 内核是Linux操作系统, 具有Ubuntu特色的可视…...
腾讯云OCR车牌识别实践:从图片上传到车牌识别
在当今智能化和自动化的浪潮中,车牌识别(LPR)技术已经广泛应用于交通管理、智能停车、自动收费等多个场景。腾讯云OCR车牌识别服务凭借其高效、精准的识别能力,为开发者提供了强大的技术支持。本文将介绍如何利用腾讯云OCR车牌识别…...
第二十二课 Vue中的组件切换
Vue中的组件切换 :is 操作符可以用于组件的切换,配合component标签可以实现根据不同的组件名进行组件的切换效果 组件切换实例 1):is与component实现组件切换 <div id"app"><button click"checks()">点击切换组件&l…...
抖音短视频矩阵源代码部署搭建流程
抖音短视频矩阵源代码部署搭建流程 1. 硬件准备 需确保具备一台性能足够的服务器或云主机。这些硬件设施应当拥有充足的计算和存储能力,以便支持抖音短视频矩阵系统的稳定运行。 2. 操作系统安装 在选定的服务器或云主机上安装适合的操作系统是关键步骤之一。推…...
【Linux】线程同步与互斥
文章目录 1. 线程互斥1.1 进程线程间的互斥相关背景概念1.2 互斥量mutex1.3 相关操作1.4 互斥量实现原理1.5 互斥量的封装 2. 线程同步2.1 条件变量2.2 生产者消费者模型2.3 基于BlockingQueue的生产者消费者模型2.4 信号量2.5 基于环形队列的生产消费模型 3. 线程池3.1 日志3.…...
设计模式-原型模式
背景 克隆羊:有一只羊,有各种属性:姓名,年龄……,现在要克隆10只和这只羊一模一样的羊。 传统方法: 定义一个羊类,在客户端调取原型羊的信息,根据信息创建10个属性相同的羊。 问…...
异或操作解决一些问题
前提: 异或操作符合交换律,结合律(因为其根本上来抽象理解,就是查看所有项二进制数相同位是否有奇数个1,对运算结果二进制数而言,没有该位为0,有该位为1,与顺序无关)。 …...
Rust中Tracing 应用指南
欢迎来到这篇全面的Rust跟踪入门指南。Rust 的tracing是一个用于应用程序级别的诊断和调试的库。它提供了一种结构化的、异步感知的方式来记录日志和跟踪事件。与传统的日志记录相比,tracing能够更好地处理复杂的异步系统和分布式系统中的事件跟踪,帮助开…...
Java与C#
Java和C#(C Sharp)是两种流行的面向对象编程语言,它们在很多方面非常相似,因为它们都受到了类似的编程范式和语言设计理念的影响。然而,它们之间也存在一些重要的区别。 平台依赖性: Java:Java是…...
Docker 部署 MongoDB
🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🍃 vue-uniapp-template 🌺 仓库主页: GitCode💫 Gitee …...
【C语言】字符串左旋的三种解题方法详细分析
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 💯前言💯题目描述💯方法一:逐字符移动法💯方法二:使用辅助空间法💯方法三:三次反转法💯方法对…...
Android导出Excel
poi org.apache.poi:poi-ooxml:4.x: 不支持Android使用, 不支持原因:Android底层库不支持xml所需的bean类,使用即报错only supported starting with Android O (–min-api 26) org.apache.poi:poi-ooxml:5.2.0: 支持A…...
【学术讲座】视觉计算中的深度学习方法 AIGC图像视频生成模型的推理加速
视觉计算中的深度学习方法 发展历程 backbone 强化学习、LLM等:有监督 && 无监督的结合 目标检测 图像分割 网络结构搜索 搜索方法 1:强化学习 2:强化学习 3:梯度算法 结构选择的作用 1:开放环境感知网络…...
华为OD机试真题---智能驾驶
华为OD机试中的“智能驾驶”题目是一道涉及广度优先搜索(BFS)算法运用的题目。以下是对该题目的详细解析: 一、题目描述 有一辆汽车需要从m * n的地图的左上角(起点)开往地图的右下角(终点)&a…...
视频质量评价SimpleVQA
目录 一、研究意义例子 二、介绍三、文章解读3.1 论文动机3.2论文思路3.3方法3.3.1网络框架3.3.2公式解读3.3.3核心创新3.3.4理解 !!!作者对模型的改进本人算法框体视频抽帧美学特征提取网络:3.3.5实验细节: 四、代码复…...
浏览器插件基于nativeMessaging通信
上一篇文章介绍了基于nativeMessaging启动本地程序,使用官方demo是支持双向通信,demo启动的程序是python写的,现在基于Qt程序进行说明。 消息传递协议 Chrome 会在单独的进程中启动每个原生消息传递主机,并使用标准输入 (stdin)…...
解决 MySQL 8.x 身份验证问题的最佳实践20241126
MySQL 8.x 身份验证问题的深入解析与实践解决方案 🎯 引言 🖋️ MySQL 是全球最受欢迎的开源数据库之一,随着 MySQL 8.x 的发布,引入了更安全的身份验证插件 caching_sha2_password,显著提升了数据库的安全性和性能。…...
对于GC方面,在使用Elasticsearch时要注意什么?
大家好,我是锋哥。今天分享关于【对于GC方面,在使用Elasticsearch时要注意什么?】面试题。希望对大家有帮助; 对于GC方面,在使用Elasticsearch时要注意什么? 1000道 互联网大厂Java工程师 精选面试题-Java…...
各种排序算法
前置知识 排序: 按照递增或者递减的顺序把数据排列好 稳定性: 值相等的元素在排序之后前后顺序是否发生了改变 内部排序: 数据放在内存上 外部排序: 数据放在磁盘上 内部排序 基于比较的排序 几大排序算法 1. 堆排序 特点: 思想: 1. 创建大根堆,把所有元素放在大根堆里…...
前端-Git
一.基本概念 Git版本控制系统时一个分布式系统,是用来保存工程源代码历史状态的命令行工具 简单来说Git的作用就是版本管理工具。 Git的应用场景:多人开发管理代码;异地开发,版本管理,版本回滚。 Git 的三个区域&a…...
用nextjs开发时遇到的问题
这几天已经基本把node后端的接口全部写完了,在前端开发时考虑时博客视频类型,考虑了ssr,于是选用了nextJs,用的是nextUi,tailwincss,目前碰到两个比较难受的事情。 1.nextUI个别组件无法在服务器段渲染 目前简单的解决方法&…...
Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64
yum install 报错: Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64 CentOS7的SCL源在2024年6月30日停止维护了。 当scl源里面默认使用了centos官方的地址,无法连接,需要替换为阿里云。 cd /etc/yum.repos.d/ 找到 CentOS-SCLo-scl.repo 和…...