JVM之内存管理(一)
部分内容来源:JavaGuide+二哥Java
图解JVM内存结构
内存管理快速复习
栈帧:局部变量表,动态链接(符号引用转为真实引用),操作数栈(存储中间结算结果),方法返回地址
运行时常量池:常量池表,符号引用,字面量
对象创建过程:类加载检查(类没有加载就进行类加载)+分配内存+初始化零值+设置对象头+执行对象初始化方法
类加载过程:
- 加载:通过类的全限定名获取该类的二进制字节流,存到类常量池,内存中生成Class类对象
- 连接:
-
- 验证:验证Class二进制字节流合规(例如验证魔数和版本号)
- 准备:为类对象分配内存
- 解析:符号引用转为直接引用
- 初始化:执行初始化方法
内存分配:指针碰撞(CAS重试)+空闲列表
内存分配失败:CAS配上重试机制+TLAB为每个线程预先在Eden区分配一块内存
对象:对象头(运行时数据+类型指针,GC年龄,Hash码)+实例数据
对象访问定位:使用句柄(间接访问)+直接指针访问
JVM堆内存分区:新生代(Eden+S1+S2)+老年代
对象什么时候会进入老年代:长期存活的对象,大对象,动态年龄判断,分配担保机制
逃逸分析:在栈内为对象分配内存
Stop The World :停止所有用户线程
Oop Map:记录了对象内部所有引用字段(指针)的位置
安全点:可以暂停所有线程执行特定操作的位置
常量池包括:
类常量池
运行时常量池
字符串常量池
JDK1.6:常量池在永久代
JDK1.7:运行时常量池+类常量池在永久代,字符串常量池在堆
JDK1.8:运行时常量池+类常量池在元空间,字符串常量池在堆
引用类型有哪些?有什么区别?
强引用指的就是代码中普遍存在的赋值方式,比如 A a = new A () 这种。强引用关联的对象,永远不会被 GC 回收
软引用可以用 SoftReference 来描述,指的是那些有用但是不是必须要的对象
系统在发生内存溢出前会对这类引用的对象进行回收
弱引用可以用 WeakReference 来描述,他的强度比软引用更低一点
弱引用的对象下一次 GC 的时候一定会被回收,而不管内存是否足够
虚引用也被称作幻影引用,是最弱的引用关系,可以用 PhantomReference 来描述,他必须和 ReferenceQueue 一起使用,同样的当发生 GC 的时候,虚引用也会被回收
可以用虚引用来管理堆外内存
说一下弱引用?举例子在哪里可以引用?
Java 中的弱引用是一种引用类型,它不会阻止一个对象被垃圾回收
在 Java 中,弱引用是通过 Java.lang.ref.WeakReference 类实现的
弱引用的一个主要用途是创建非强制性的对象引用,这些引用可以在内存压力大时被垃圾回收器清理,从而避免内存泄露
弱引用的使用场景:
- 缓存系统:弱引用常用于实现缓存,特别是当希望缓存项能够在内存压力下自动释放时。如果缓存的大小不受控制,可能会导致内存溢出。使用弱引用来维护缓存,可以让 JVM 在需要更多内存时自动清理这些缓存对象。
- 对象池:在对象池中,弱引用可以用来管理那些暂时不使用的对象。当对象不再被强引用时,它们可以被垃圾回收,释放内存。
- 避免内存泄露:当一个对象不应该被长期引用时,使用弱引用可以防止该对象被意外地保留,从而避免潜在的内存泄露
说一下你对内存泄露和内存溢出的了解
什么是内存泄露:
内存泄漏是指程序在运行过程中不再使用的对象仍然被引用,而无法被垃圾收集器回收,从而导致可用内存逐渐减少
虽然在 Java 中,垃圾回收机制会自动回收不再使用的对象,但如果有对象仍被不再使用的引用持有,垃圾收集器无法回收这些内存,最终可能导致程序的内存使用不断增加
内存泄露常见原因:
- 静态集合:使用静态数据结构(如 HashMap 或 ArrayList)存储对象,且未清理。
- 事件监听:未取消对事件源的监听,导致对象持续被引用。
- 线程没被回收:未停止的线程可能持有对象引用,无法被回收。
内存溢出:
内存溢出是指 Java 虚拟机(JVM)在申请内存时,无法找到足够的内存,最终引发 OutOfMemoryError 。这通常发生在堆内存不足以存放新创建的对象时
内存溢出常见原因:
- 大量对象创建:程序中不断创建大量对象,超出 JVM 堆的限制。
- 持久引用:大型数据结构(如缓存、集合等)长时间持有对象引用,导致内存累积。
- 递归调用:深度递归导致栈溢出
JVM的内存泄露有几种溢出情况?
堆内存溢出:当出现 Java.lang.OutOfMemoryError:Java heap space 异常时,就是堆内存溢出了。原因是代码中可能存在大对象分配,或者发生了内存泄露,导致在多次 GC 之后,还是无法找到一块足够大的内存容纳当前对象
栈溢出:如果我们写一段程序不断的进行递归调用,而且没有退出条件,就会导致不断地进行压栈。类似这种情况,JVM 实际会抛出 StackOverFlowError;当然,如果 JVM 试图去扩展栈空间的时候失败,则会抛出 OutOfMemoryError
元空间溢出:元空间的溢出,系统会抛出 Java.lang.OutOfMemoryError: Metaspace。出现这个异常的问题的原因是系统的代码非常多或引用的第三方包非常多或者通过动态代码生成类加载等方法,导致元空间的内存占用很大
直接内存内存溢出:在使用 ByteBuffer 中的 allocateDirect () 的时候会用到,很多 JavaNIO (像 netty) 的框架中被封装为其他的方法,出现该问题时会抛出 Java.lang.OutOfMemoryError: Direct buffer memory 异常
栈中存的是指针还是对象?
在 JVM 内存模型中,栈(Stack)主要用于管理线程的局部变量和方法调用的上下文
而堆(Heap)则是用于存储所有类的实例和数组
当我们在栈中讨论 “存储” 时,实际上指的是存储基本类型的数据(如 int, double 等)和对象的引用,而不是对象本身。
这里的关键点是,栈中存储的不是对象,而是对象的引用
也就是说,当你在方法中声明一个对象,比如 MyObject obj = new MyObject ();,
这里的 obj 实际上是一个存储在栈上的引用,指向堆中实际的对象实例
这个引用是一个固定大小的数据(例如在 64 位系统上是 8 字节),它指向堆中分配给对象的内存区域
说一下程序计数器的作用?为什么程序计数器是私有的?
Java 程序是支持多线程一起运行的,多个线程一起运行的时候 cpu 会有一个调动器组件给它们分配时间片,比如说会给线程 1 分给一个时间片,它在时间片内如果它的代码没有执行完,它就会把线程 1 的状态执行一个暂存,切换到线程 2 去,执行线程 2 的代码,等线程 2 的代码执行到了一定程度,线程 2 的时间片用完了,再切换回来,再继续执行线程 1 剩余部分的代码
我们考虑一下,如果在线程切换的过程中,下一条指令执行到哪里了,是不是还是会用到我们的程序计数器啊。
没个线程都有自己的程序计数器,因为它们各自执行的代码的指令地址是不一样的呀,所以每个线程都应该有自己的程序计数器
说一下方法区中方法的执行过程
当程序中通过对象或类直接调用某个方法时,主要包括以下几个步骤:
解析方法调用:JVM 会根据方法的符号引用找到实际的方法地址(如果之前没有解析过的话)
栈帧创建:在调用一个方法前,JVM 会在当前线程的 Java 虚拟机栈中为该方法分配一个新的栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息
执行方法:执行方法内的字节码指令,涉及的操作可能包括局部变量的读写、操作数栈的操作、跳转控制、对象创建、方法调用等。
返回处理:方法执行完毕后,可能会返回一个结果给调用者,并清理当前栈帧,恢复调用者的执行环境
JVM内存中的栈和堆有什么区别?
用途
栈主要用于存储局部变量、方法调用的参数、方法返回地址以及一些临时数据。每当一个方法被调用,一个栈帧(stack frame)就会在栈中创建,用于存储该方法的信息,当方法执行完毕,栈帧也会被移除
堆用于存储对象的实例(包括类的实例和数组)。当你使用 new 关键字创建一个对象时,对象的实例就会在堆上分配空间
生命周期
栈中的数据具有确定的生命周期,当一个方法调用结束时,其对应的栈帧就会被销毁,栈中存储的局部变量也会随之消失
堆中的对象生命周期不确定,对象会在垃圾回收机制(Garbage Collection, GC)检测到对象不再被引用时才被回收
存取速度
栈的存取速度通常比堆快,因为栈遵循先进后出(LIFO, Last In First Out)的原则,操作简单快速
堆的存取速度相对较慢,因为对象在堆上的分配和回收需要更多的时间,而且垃圾回收机制的运行也会影响性能
存储空间
栈的空间相对较小,且固定,由操作系统管理
当栈溢出时,通常是因为递归过深或局部变量过大
堆的空间较大,动态扩展,由 JVM 管理
堆溢出通常是由于创建了太多的大对象或未能及时回收不再使用的对象
可见性
栈中的数据对线程是私有的,每个线程有自己的栈空间。堆中的数据对线程是共享的,所有线程都可以访问堆上的对象
static修饰的类型
未被static
修饰的基本类型:基本类型的变量(局部变量)存放在栈中,而不是堆中。例如int num = 10;
,变量num
是在方法执行时在栈中开辟空间存储的。基本类型的成员变量存放在堆中(当所属对象在堆中时) 。
被static
修饰的基本类型:被static
修饰的基本类型(静态变量)存放在方法区(在 JDK 8 及之后,方法区的实现是元空间),而不是栈中。静态变量属于类,在类加载时就会分配空间并初始化,存储在方法区供类的所有对象共享。
包装类型:包装类型属于对象类型,其对象实例确实几乎都存在堆中,但包装类型的对象在某些场景下会有缓存机制。例如Integer
在-128
到127
之间的值会被缓存,当创建这个范围内的Integer
对象时,不会在堆中重新创建,而是直接引用缓存中的对象
此外,部分包装类(如Integer
、Short
、Byte
、Character
、Long
)存在对象缓存机制。以Integer
为例,在创建-128
到127
之间的Integer
对象时,不会在堆中重新创建,而是直接引用方法区中缓存的对象;超出这个范围才会在堆中创建新对象
线程的内部有什么?
程序计数器
本机方法栈
Java虚拟机栈
说一下JVM栈的内部组成
JVM栈的内部组成
Java虚拟机栈是线程私有的
它的生命周期和线程相同
除了Native方法是调用本地方法栈实现,其他的所有方法的调用都是通过Java虚拟机栈来实现的
Java虚拟机栈的内部是由栈帧组成
方法调用的数据需要通过栈进行传递,每一次方法调用都会有一个对应的栈帧被压入栈中,每一个方法调用结束后,都会有一个栈帧被弹出
Java虚拟机栈的内部是由一个又一个的栈帧组成
栈帧内部:局部变量表、操作数栈、动态链接、方法返回地址
说一下栈帧的内部
局部变量表
存放了数据类型,对象引用
操作数栈
主要作为方法调用的中转站使用,用于存放方法执行过程中产生的中间计算结果
另外,计算过程中产生的临时变量也会放在操作数栈中
动态链接
场景:主要服务一个方法需要调用其他方法的场景
Class 文件的常量池里保存有大量的符号引用比如方法引用的符号引用。
当一个方法要调用其他方法,需要将常量池中指向方法的符号引用转化为其在内存地址中的直接引用。动态链接的作用就是为了将符号引用转换为调用方法的直接引用
方法返回地址
就是我们方法结束后的返回地址
说一下栈帧内部有啥?
局部变量表
操作数栈
动态链接
方法返回地址
说一下JVM栈会出现的问题
tackOverFlowError错误:栈帧过多爆了
函数循环调用过多
我们这个线程递归调用的时候,我们会往栈里面压入栈帧,如果压入的栈帧过多,就会爆出
Java方法的两种返回方式
一:Returen正常返回
二:抛出异常
OutOfMemoryError:内存空间不够爆了
虚拟机动态扩展栈时,无法申请到足够的内存空间
什么是本地方法栈
为本地方法服务
(也就是和我们的操作系统有关,我们的操作系统的方法)
说一下JVM的内存区域
JVM 内存区域最粗略的划分可以分为 堆 和 栈 ,
当然,按照虚拟机规范,可以划分为以下⼏个区域:
JVM 内存分为线程私有区和线程共享区,
线程共享区:方法区和堆
线程隔离的数据区: 虚拟机栈 、本地方法栈 和 程序计数器
1)程序计数器
程序计数器(Program Counter Register)也被称为 PC 寄存器,是⼀块较⼩的内存空间。
它可以看作是当前线程所执⾏的字节码的⾏号指示器。
2)Java 虚拟机栈
Java 虚拟机栈(Java Virtual Machine Stack)也是线程私有的,它的⽣命周期与线程相同。
Java 虚拟机栈描述的是 Java ⽅法执⾏的线程内存模型:⽅法执⾏时,JVM 会同步创建⼀个栈帧,⽤来存储局部变量表、操作数栈、动态连接等。
3)本地方法栈
本地⽅法栈(Native Method Stacks)与虚拟机栈所发挥的作⽤是⾮常相似的,其区别只是虚拟机栈为虚拟机执⾏
Java ⽅法(也就是字节码)服务,⽽本地⽅法栈则是为虚拟机使⽤到的本地(Native)⽅法服务。
Java 虚拟机规范允许本地⽅法栈被实现成固定⼤⼩的或者是根据计算动态扩展和收缩的。
4)Java 堆
对于 Java 应⽤程序来说,Java 堆(Java Heap)是虚拟机所管理的内存中最⼤的⼀块。Java 堆是被所有线程共享
的⼀块内存区域,在虚拟机启动时创建。此内存区域的唯⼀⽬的就是存放对象实例,Java ⾥“几乎”所有的对象实例
都在这⾥分配内存。Java 堆是垃圾收集器管理的内存区域,因此⼀些资料中它也被称作“GC 堆”(Garbage Collected Heap,)。从回
收内存的⻆度看,由于现代垃圾收集器⼤部分都是基于分代收集理论设计的,所以 Java 堆中经常会出现 新⽣代 、⽼年代 、 Eden空间 、 From Survivor空间 、 To Survivor空间 等名词,需要注意的是这种划分只是根据垃圾回收机制来进⾏的划分,不是 Java 虚拟机规范本身制定的。
5)方法区
⽅法区是⽐较特别的⼀块区域,和堆类似,它也是各个线程共享的内存区域,⽤于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。
它特别在 Java 虚拟机规范对它的约束⾮常宽松,所以⽅法区的具体实现历经了许多变迁,例如 jdk1.7 之前使⽤永久代作为⽅法区的实现
JVM的堆是用来干嘛的
Java 虚拟机所管理的内存中最大的一块
Java 堆是所有线程共享的一块内存区域,在虚拟机启动时创建
此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存
什么是逃逸分析
jdk1.7之后,已经默认开启逃逸分析
也就是某些方法中的对象引用没有被返回或者未被外面使用,那么就可以直接在栈上分配内存
也就是我们不用在堆给这个对象分配内存,我们在栈上给这个对象分内存就可以了
相关文章:
JVM之内存管理(一)
部分内容来源:JavaGuide二哥Java 图解JVM内存结构 内存管理快速复习 栈帧:局部变量表,动态链接(符号引用转为真实引用),操作数栈(存储中间结算结果),方法返回地址 运行时…...
【AI入门】CherryStudio入门7:引入魔搭中的MCP服务
前言 来吧,继续CherryStudio的实践,前边给Cherry Studio添加知识库,对接思源笔记,以及obsidian笔记,设置了mcp-auto-install 自动安装包服务,本节让我们把魔搭中的MCP服务同步过来😄Ƕ…...
高性能Python Web 框架--FastAPI 学习「基础 → 进阶 → 生产级」
以下是针对 FastAPI 的保姆级教程,包含核心概念、完整案例和关键注意事项,采用「基础 → 进阶 → 生产级」的三阶段教学法: 一、FastAPI介绍 FastAPI 是一个现代化的、高性能的 Python Web 框架,专门用于构建 APIs(应…...
python小区物业管理系统-小区物业报修系统
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中…...
YOLO数据集标注工具LabelImg(打包Exe版本及使用)
前言: 在计算机视觉领域,YOLO(You Only Look Once)系列算法因其出色的实时目标检测性能而广受欢迎。然而,要训练一个精准的YOLO模型,高质量的数据标注(labling)是不可或缺的基础工作。 LabelImage 是一个开源的图像标注工具&…...
【NCCL】DBT算法(double binary tree,双二叉树)
目录 前言 ring 不足,需要 tree 朴素二叉tree只利用了一半带宽,需要 双二叉 tree 双二叉树的构造 ringvs 双二叉树 测试 ring和tree的选择 nccl tree tree搜索 基本概念解释 最大化局部性构建二叉树的方式 这种构建方式的好处 示例说明 前言…...
Java大师成长计划之第16天:高级并发工具类
📢 友情提示: 本文由银河易创AI(https://ai.eaigx.com)平台gpt-4o-mini模型辅助创作完成,旨在提供灵感参考与技术分享,文中关键数据、代码与结论建议通过官方渠道验证。 在现代Java应用中,处理并…...
【C/C++】C语⾔内存函数
C语言内存函数 1. memcpy使用和模拟实现 memcpy可以代替strcpy void * memcpy ( void * destination, const void * source, size_t num );//void*来接受任意指针,size_t 单位是字节 //memcpy的头文件为<string.h> mem是memory的缩写 是内存的意思功能: …...
SQL JOIN 关联条件和 where 条件的异同
Inner join 对于 inner join,条件写到 on 和 where 部分是一样的。 select count(1) from web_site join web_page on web_site_skwp_web_page_id where web_cityPleasant Hill and wp_access_date_sk1;输出 0select count(1)from web_site join web_page on web…...
kotlin 数据类
一 kotlin数据类与java普通类区别 Kotlin 的 data class 与 Java 中的普通类(POJO)相比,确实大大减少了样板代码(boilerplate),但它的优势不止于自动生成 getter/setter、copy()、equals()、toString()&am…...
云效 MCP Server:AI 驱动的研发协作新范式
作者:黄博文、李晔彬 云效 MCP Server 是什么? 云效 MCP(Model Context Protocol)是阿里云云效平台推出的模型上下文协议标准化接口系统,作为连接 AI 助手与 DevOps 平台的核心桥梁,通过模型上下文协议将…...
复合机器人案例启示:富唯智能如何以模块化创新引领工业自动化新标杆
在国产工业机器人加速突围的浪潮中,富唯智能复合机器人案例凭借其高精度焊接与智能控制技术,成为行业标杆。然而,随着制造业对柔性化、全场景协作需求的升级,复合机器人正从单一功能向多模态协同进化。作为这一领域的创新者&#…...
信息系统项目管理师-软考高级(软考高项)2025最新(十三)(1)
个人笔记整理---仅供参考 信息系统项目理师-软考高级(软考高项)2025最新(十三)(1)第十三章项目资源管理 13.0资源管理概述 13.1管理基础 团队发展阶段背下来 13.2项目资源管理过程 13.3规划资源管...
archlinux 详解系统层面
Arch Linux 深度解析:从设计哲学到系统架构 一、Arch Linux 概述:滚动发行的极客之选 Arch Linux 是一款以 滚动更新(Rolling Release) 为核心特性的 Linux 发行版,强调 轻量、灵活、高度可定制,旨在让用…...
⭐️⭐️⭐️【课时1:大模型是什么?】学习总结 ⭐️⭐️⭐️ for《大模型Clouder认证:基于百炼平台构建智能体应用》认证
一、学习目标 概要 通过学习《课时1:大模型是什么?》,全面了解大模型的基础概念、核心特点、发展脉络及阿里云在大模型领域的布局,为后续基于百炼平台构建智能体应用的实践操作打下坚实的理论基础。 具体目标列表 理解人工智能到大模型的演变逻辑,明确大模型在AI发展历…...
qxl显卡与spice模块笔记
1、qxl虚拟显卡设备创建QemuConsole,并保存在全局变量consoles链表中。 static void qxl_realize_primary(PCIDevice *dev, Error **errp) {PCIQXLDevice *qxl PCI_QXL(dev);VGACommonState *vga &qxl->vga;Error *local_err NULL;qxl_init_ramsize(qxl)…...
Rust 官方文档:人话版翻译指南
鉴于大部分翻译文档都不太会说人话,本专栏主要内容为 rust 程序设计语言、rust 参考手册、std 库 等官方文档的中译中。...
切比雪夫不等式专题习题解析
切比雪夫不等式专题习题解析 前言 本文为概率论习题集专栏的切比雪夫不等式专题习题解析,针对习题篇中的10道题目提供详细解答。希望通过这些解析帮助大家深入理解切比雪夫不等式的应用和意义。 一、基础概念题解析 习题1解析: 错误。切比雪夫不等式适用于任何具有有限方…...
LearnOpenGL01:创建项目
基于LearnOpenGL 相关链接: 工程搭建 hello window 环境 UBUNTU GLFW3.3:负责创建窗口处理输入 GLAD:根据不同操作系统加载不同的OPENGL函数实现 安装GLFW以及编译项 sudo apt update sudo apt install cmake build-essential libglfw3-…...
基于论文《大规模电动汽车充换电设施可调能力聚合评估与预测》开发者说明文档
real_data_model.m 开发者说明文档 脚本概述 本MATLAB脚本实现了基于论文《大规模电动汽车充换电设施可调能力聚合评估与预测》(鲍志远,胡泽春)中提出的预测模型和评估方法。脚本使用真实的充电数据、天气数据和分时电价数据,实现了LSTM与线性模型混合…...
优雅草星云智控系统产品发布会前瞻:SNMP协议全设备开启指南-优雅草卓伊凡
优雅草星云智控系统产品发布会前瞻:SNMP协议全设备开启指南-优雅草卓伊凡 一、发布会重磅预告 1.1 星云智控系统发布会详情 优雅草科技将于2024年5月15日在成都市双流区天府国际生物城会议中心举办”星云智控系统产品发布会“。作为优雅草科技CTO,卓伊…...
【Python】Pycharm中安装库可靠的方法
博主需要在pycharm中安装Python需要的库,发现可以通过两个方法,一个是在terminal中安装,如下图: 另一个,是通过软件包安装。 博主发现,保险起见,还是通过软件包安装会比较稳妥。博主遇见一个库&…...
探索Stream流:高效数据处理的秘密武器
不可变集合 stream流 Stream流的使用步骤: 先得到一条Stream流(流水线),并把数据放上去 使用中间方法对流水线上的数据进行操作 使用终结方法对流水线上的数据进行操作 Stream流的中间方法 注意1:中间方法࿰…...
Debezium RelationalSnapshotChangeEventSource详解
Debezium RelationalSnapshotChangeEventSource详解 1. 类的作用与功能 1.1 核心功能 RelationalSnapshotChangeEventSource是Debezium中用于关系型数据库快照的核心抽象类,主要负责: 数据快照:对数据库表进行全量数据快照模式捕获:捕获数据库表结构事务管理:确保快照过…...
Open CASCADE学习|实现裁剪操作
1. 引言 Open CASCADE (简称OCC) 是一个功能强大的开源几何建模内核,广泛应用于CAD/CAM/CAE领域。裁剪操作作为几何建模中的基础功能,在模型编辑、布尔运算、几何分析等方面有着重要作用。本文将全面探讨Open CASCADE中的裁剪操作实现原理、应用场景及具…...
Microsoft Azure DevOps针对Angular项目创建build版本的yaml
Azure DevOps针对Angular项目创建build版本的yaml,并通过变量控制相应job的执行与否。 注意事项:代码前面的空格是通过Tab控制的而不是通过Space控制的。 yaml文件中包含一下内容: 1. 自动触发build 通过指定code branch使提交到此代码库的…...
Navicat 17最新保姆级安装教程(附安装包+永久使用方法)
前言 Navicat Premium 是一套可创建多个连接的数据库开发工具,让你从单一应用程序中同时连接 MySQL、MariaDB、MongoDB、SQL Server、Oracle、PostgreSQL 和 SQLite 。它与 OceanBase 数据库及 Amazon RDS、Amazon Aurora、Amazon Redshift、Microsoft Azure、Orac…...
在 Kotlin 中什么是委托属性,简要说说其使用场景和原理
在 Kotlin 中,属性委托和类委托是两种通过 by 关键字实现的强大特性,它们通过“委托”机制将行为或实现逻辑委托给其他对象,从而实现代码的复用和解耦。 1 属性委托 定义: 允许把属性的 get 和 set 方法的具体实现委托给另一个对…...
[Windows] 东芝存储诊断工具1.30.8920(20170601)
[Windows] 东芝存储诊断工具 链接:https://pan.xunlei.com/s/VOPpMjGdWZOLceIjxLNiIsIEA1?pwduute# 适用型号 东芝消费类存储产品: 外置硬盘:Canvio 系列 内置硬盘:HDW****(E300 / N300 / P300 / S300 / V300 / X30…...
按位段拼接十六进制
需求: 给一组位段及对应的值,拼接出该十六进制值。 如, [15] : 0x1 [31:16] : 0xfafa [14:1] : 0x1af0 [0:0] : 0x1 def parse_range(range_str):"""解析位段字符串,返回高位和低位"""parts…...
FPGA 41 ,ICMP 协议详细解析之构建网络诊断系统( ICMP 协议与 IP 协议理论详细解析 )
目录 前言 一、ICMP协议介绍 1.1 ICMP协议介绍 1.2 ICMP报文格式 1.3 ICMP地位流程 1.4 为何需要ICMP差错报文 1.5 协议关系 二、FPGA 与 ICMP 2.1 平台选择与环境搭建 2.2 模块化设计 2.3 ICMP 功能设计 (1)ICMP 报文解析 (2&am…...
每天批次导入 100 万对账数据到 MySQL 时出现死锁
一、死锁原因及优化策略 1.1 死锁原因分析 批量插入事务过大: Spring Batch 默认将整个 chunk(批量数据块)作为一个事务提交,100 万数据可能导致事务过长,增加锁竞争。 并发写入冲突: 多个线程或批处理作…...
滑动窗口-窗口中的最大/小值-单调队列
求窗口的最大值 #include <iostream> //滑动窗口最大值用单调队列q[],q存储候选最大值的下标 //队列头是最大值的下标 using namespace std; const int N100010; int nums[N],q[N]; int hh0,tt-1;// hh 是队头指针,tt 是队尾指针,初始…...
Docker Compose 部署 MeiliSearch 指南
Docker Compose 部署 MeiliSearch 指南 目录 环境准备创建 MeiliSearch 配置文件启动 MeiliSearch 服务验证服务状态访问 MeiliSearch安全及防火墙设置...
在 MyBatis 中实现控制台输出 SQL 参数
在 MyBatis 中实现控制台输出 SQL 参数,可通过以下方案实现: # 一、使用 MyBatis-Plus 的 SqlLogInterceptor(推荐) 适用场景:项目已集成 MyBatis-Plus(3.5.3版本) 配置步骤ÿ…...
【MySQL】数据库、数据表的基本操作
个人主页:Guiat 归属专栏:MySQL 文章目录 1. MySQL基础命令1.1 连接MySQL1.2 基本命令概览 2. 数据库操作2.1 创建数据库2.2 查看数据库2.3 选择数据库2.4 修改数据库2.5 删除数据库2.6 数据库备份与恢复 3. 表操作基础3.1 创建表3.2 查看表信息3.3 创建…...
Java中的内部类详解
目录 什么是内部类? 生活中的内部类例子 为什么需要内部类? 生活中的例子 内部类的存在意义 内部类的分类 1. 成员内部类 什么是成员内部类? 成员内部类的特点 如何使用成员内部类? 成员内部类访问外部类同名成员 2. …...
【LangChain全栈开发指南】从LLM集成到智能体系统构建
目录 🌟 前言🏗️ 技术背景与价值💢 当前技术痛点🛠️ 解决方案概述👥 目标读者说明 🔍 一、技术原理剖析📊 核心概念图解💡 核心作用讲解🧩 关键技术模块说明⚖️ 技术选…...
《内存单位:解锁数字世界的“度量衡”》
🚀个人主页:BabyZZの秘密日记 📖收入专栏:C语言 🌍文章目入 一、基础单位:字节(Byte)二、进阶单位:千字节(KB)、兆字节(MB)…...
Spring Boot + MyBatis-Plus 高并发读写分离实战
引言 在高并发场景下,单一数据库实例往往成为性能瓶颈。数据库读写分离通过将读操作和写操作分配到不同的数据库实例,有效缓解主库压力,提升系统吞吐量。MyBatis-Plus 作为一款强大的持久层框架,结合 Spring Boot 能够轻松实现读…...
STC32G12K128-旋转编码器-软件去抖
STC32G12K128-旋转编码器-软件去抖 简介代码 简介 EC11旋转编码器是一种可以连续旋转的器件A,B,C为旋转编码引脚,带按键的有D,E引脚。引脚功能: A:编码器A相;B:编码器B相;C:公共端-一般接到GN…...
第J7周:对于ResNeXt-50算法的思考
目录 思考 一、代码功能分析 1. 构建 shortcut 分支(残差连接的旁路) 2. 主路径的第一层卷积(11) 4. 主路径的第三层卷积(11) 5. 残差连接 激活函数 二、问题分析总结:残差结构中通道数不一致的…...
古方焕新潮!李良济盒马联名养生水,以创新赋能中式养生新潮流
今天下午,中华老字号李良济与新零售巨头盒马联名的“五汁饮&暑清元气水”新品发布会,在李良济隆重举行。 新品发布会上,盒马与多家媒体齐聚李良济,通过中医文化体验、新品品鉴、生产全链路探秘、媒体采访等环节,不…...
使用PyTorch训练马里奥强化学习代理的完整指南
以下是使用PyTorch训练马里奥强化学习代理的完整指南,涵盖依赖库配置、环境搭建、核心代码实现及输出结果分析,结合关键优化策略与实战经验。 一、依赖库配置 基础环境安装 # 使用Anaconda创建虚拟环境(推荐) conda create -n m…...
STM32F103RCT6 + MFC实现网口设备搜索、修改IP、固件升级等功能
资源下载链接:https://download.csdn.net/download/qq_35831134/90712875?spm=1001.2014.3001.5501 一.大概逻辑: // 网口搜索大概逻辑: // ************************************************************************** // 一.环境: // 上位机用MFC下位机用STM32F103R…...
ch09 课堂参考代码
ch09 拓扑排序与基环树 拓扑排序 在一些场景中,需要完成一系列事情,这些事情之间有顺序关系或者依赖关系,在做一件事情之前必须先做另一件事,例如课程学习的先后顺序,这类问题可以抽象为图论中的拓扑排序问题。 拓扑…...
Day 15 训练
Day 15 对鸢尾花数据集进行处理,特征可视化,贝叶斯优化随机森林,Shap解释1. 导入必要的库2. 设置中文字体3. 加载数据集4. 查看数据5. 数据准备6. 贝叶斯优化随机森林7. 评估结果8. 绘制箱形图9. 绘制特征相关性热力图10. SHAP模型解释总结 对…...
Path to Integer_ABC402分析与解答
考虑怎么降低复杂度,使用分治策略降低搜索的复杂度。 对于a_i,j,其一定在最后结果数的第(2n-i-j)位(如果将最低位看成第0位),故将a_i,j看成a_i,j * 10^(2n-i-j),这样每次加上a_i,j就可以了。 从(1,1)到(n…...
嵌入式学习笔记 - 关于结构体成员地址对齐问题
一 在没有#pragma pack()这个宏声明的情况下 C语言中结构体成员分配内存大小时需要满足2个条件,这也是内存对齐的原则: ①每个成员变量的起始地址必须为其数据类型所占空间大小的整数倍 ②结构体所占空间总大小为其最大数据类…...
JAVA实战开源项目:健身房管理系统 (Vue+SpringBoot) 附源码
本文项目编号 T 180 ,文末自助获取源码 \color{red}{T180,文末自助获取源码} T180,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...