探秘JVM内部
在我们编写Java代码,点击运行后,会发生什么事呢?
首先,Java源代码会经过Java编译器将其编译成字节码,放在.class文件中
然后这些字节码文件就会被加载到jvm中,然后jvm会读取这些文件,调用相关解释器和编译器去执行字节码文件。
这是一个非常简略的过程,即使是简略的过程,我们也了解到了这个jvm的重要性。
接下来小编就会分享jvm相关知识。
比如jvm的内存区域划分、jvm的类加载过程、jvm的垃圾回收机制
那么首先来了解下,什么是jvm呢?
JVM(Java Virtual Machine)
意为Java虚拟机
那什么又是虚拟机呢?
虚拟机:是一种通过软件模拟,具有完整硬件系统功能的计算机系统,它允许在一个完全隔离的环境中。
对于虚拟机呢,它又分为两种
1.系统虚拟机
系统虚拟机 提供了一个完整的工作平台,使得多个操作系统示例可以在单个物理机器上运行。每个虚拟机实例都像一个独立的计算机一样工作,拥有自己的操作系统、CPU时间、内存空间资源等等
对于常见的系统虚拟机:
1.VMware Workstation
2.Oracle VirtualBox
3.Microsoft Hyper-v
这些虚拟机软件运行用户安装不同的类型的客户端操作系统。例如在Windows运行Linux或macOs环境,便于测试。
2.进程虚拟机
进程虚拟机则是更加专注于特定应用程序或编程语言代码环境。与系统虚拟机不同的是,它通常不模拟底层硬件环境,而是为特定的应用程序提供一个抽象层,使其能够在任何支持该虚拟机的平台上运行,最著名的例子就是Java虚拟机
除了这个还有像python的CP python解释器,Ruby的YARV虚拟机等。
所以总的来说,Java虚拟机就像是一个现实不存在的计算机。
那么接下来分享第一部分
JVM的内存区域划分
JVM在运行时会将内存划分为几个区域:
一:程序计数器
1.每个线程都有独立的程序计数器
2.作用就是记录当前线程执行到字节码哪个位置
3.如果线程正在执行的是Java方法,这个计数器记录的是正在执行的虚拟机字节码指令地址;
如果是执行的是本地方法(native方法),那么计数器就是为空
注意native方法是由c/c++语言写的
4.同时这个是Java虚拟机规范中,没有规定任何OutOfMemoryError情况的区域
二:JAVA虚拟机栈
1.同样的 ,每个线程也会私有一个栈
2.栈帧是用于支持虚拟机进行方法调用和执行的数据结构,每一个方法从被调用到执行完成的过程,就对应着一个栈帧在虚拟机中从入栈到出栈的过程.
调用方法即分配一个栈帧
栈帧中包含了局部变量 表、操作数栈、常量池引用和方法的返回地址
当方法体执行完毕,栈帧就会销毁
3.由于栈帧是一片连续的内存区域,因此栈的空间是有限的,过度的递归和调用可能会导致
“StackOverFlowError”
三:本地方法栈
1.本地方法栈是专门为执行本地方法而准备的栈。与虚拟机栈类似。
2.注意本地方法栈不是每个JVM都存在的
3.本地方法栈内容和虚拟机栈类似,但存储的是本地方法的参数、局部变量,返回值
4.本地方法栈也有大小,若溢出,也会抛出StackOverFlowError。
四:堆
1.是jvm中最大一块区域,用于存储Java程序中对象和数组,几乎所有的对象和数组都在堆中分配内存
2.堆是共享,所有线程可以访问堆中的对象
3.堆内存的管理由垃圾回收器负责,会定期清理不在使用的垃圾,释放内存
4.堆中也有几块区域,包括年轻代、老年代和持久代(jdk8之前j,dk8后是元数据区)。
年轻代:包含新创建的对象
老年代:包含生命周期较长的对象
五:方法区
这是一个JVM规范中通用概念。
方法区是用于存储类的结构信息,如类名、方法、字段、接口、常量等数据。这些数据在程序加载时由jvm加载。
1.方法区是各线程共享的
2.还存储常量池,静态变量等
对于常量池而言
它存储了类中常量。
比如字符串常量、数字常量等,这些常量在程序运行时是共享的。
值得注意的是,jdk8之前,HotSpot JVM使用永久代实现了方法区,jdk8后,使用了元数据区来实现这一方法区。
那么对于这个内存区域划分就分享到这,接下来分享下jvm的类加载过程
类加载
一:加载
在这个阶段中呢,jvm根据类权限定名(包名和类名)从字节码文件(.class文件)中,加载类的内容,形成一个class对象,此时,jvm将从字节码文件读入内存,并创建一个代表该类的class对象。
大概的过程如下
1.定位:jvm根据类名找到类的字节码文件,通常字节码文件在类路径中,jvm通过类加载器来定位和加载字节码
2.加载:类加载器将.class文件的字节流加载到内存中
3.返回:类加载器返回一个class对象,该对象用于表示类的结构。
而对于类加载这里,不得不提到一个模型:单亲委派模型
如图
这个单亲委派模型,有一个较为显著的作用就是
当你项目定义的一个类个原有JDK中的某个类,重合了,此时呢,执行单亲委派模型的时候,就会只会加载JDK中类,自己写的类,不会生效,从而不会对项目中造成负面破坏。
二:验证
验证从外部加载的类字节码是否合法,并符合JVM要求的,避免不安全的代码对程序的安全性和稳定性造成影响
大概过程如下
文件格式验证:检查.class文件的基本格式是否是符合Java字节码规范
元数据验证:检查类的元数据是否是合法的,如常量池、方法签名字段签名
字节码验证:确保字节码的指令符合JVM的执行要求,不包含非法指令和无效的跳转。
三:准备
在这个阶段,jvm为类的静态变量分配内存空间,并为其初始化为默认值
比如int 默认为0,Boolean 默认为false,引用类型的对象就是默认为null
四:解析
此时是将类中的符号引用转换为直接引用的过程。符号引用通常保存在常量池中,直接引用指向内存地址。
jvm会将类中的符号引用(比如方法名、字段名)解析为实际的内存地址或者对应的方法和字段
比如CLassName.methodName(),调用方法时,jvm会在解析过程把methodName()符号引用代替为实际的内存地址,确保可以找到方法并正确执行。
五:初始化
此时是类加载的最后一个阶段,类的静态变量和静态代码块会在此阶段被初始化。
大概过程如下
静态变量赋值,在这个准备阶段,类的静态变量被赋予默认值,在初始化阶段,类中的静态变量和
静态代码块会根据类中的声明进行初始化
静态代码块初始化,如若类有静态代码块,它会在类的初始化时执行。
父类初始化,在子类初始化之前,jvm会先对父类进行初始化先,只有当父类的初始化完成后,子类才能开始初始化。
那么对于类的加载,就分享到这里,接下来分享下垃圾回收机制
垃圾回收机制(Garbage Collection)
那么在jvm内存区域中,GC会对哪个地方进行“大动干戈”呢?
显然,堆是占用了一片连续的内存区域,存放的数据多,此时呢,GC主要回收的区域就是堆了。
那么对于垃圾回收而言,它是以对象为维度进行回收的
比如
那么好,既然讲到了回收,GC是如何回收的呢?
一:寻找垃圾
对于寻找垃圾而言,这里呢,分享下存在的几个方案
1.引用计数
即给每个对象分配一个计数器,
当指向这个对象的引用增加了,此时呢,计数器+1
指向这个对象的引用减少了,此时,计数器-1
当计数器减到0的时候,就可以认为当前对象,不使用了,可以进行回收。
如图:
但这个方案也是有坏处的,比如
循环引用,举个例子
所以,我们,还可以引入另一个方案
可达性分析
这个是一种核心算法,可以判断哪些对象是“存活”的,哪些对象是“垃圾”。
它通过构建一个从根节点(GCRoots)出发的引用链去追踪可以访问的所有对象,无法通过引用链 到达的对象就是认为不可达的,即是垃圾。
简单类比一下
就像是一棵树的根部视为起点,树枝和树叶则视为引用链,如若树叶无法通过树枝连接到根部,那么就可以视为垃圾。
对于GCRoots中,它可以包含很多类型
1.虚拟机栈中的局部变量表
2.本地方法栈的引用
3.方法区中的静态变量
4.活动线程
…………
对于可达性来说,它涉及到这几种状态
1.强可达
对象可以通过引用链从GCRoots直接访问
这些对象不会回收,比如日常必需品
2.软可达
对象通过软引用访问
内存不足的时候,进行回收,比如日常中有些不常用的东西,内存不足的时候被丢弃
3.弱可达
通过对象的弱引用访问
下一次垃圾回收的时候,就会被回收,比如有已经不需要的东西,随意可抛弃
4.虚可达
对象通过虚引用访问
用于追踪对象的回收状态,不能直接访问对象,就比如日常中,从头到尾不需要的东西,我们只关心它什么时候被清理
在JVM中,才有了第二种方案
但可达性分析也是有缺点的
进行可达性分析的时候,为了保证引用关系的一致性,通常需要用户暂停线程,可能会导致短暂的卡顿状态,这样的状态可以称为“Stop-The-World"
那么知道了哪些是垃圾,那么又该如何清理垃圾呢?
清理垃圾
这里也分享下,已有的方案
1.标记-清除
即对没有的使用的对象进行标记了,然后进行直接清除。
比如
但问题是,空闲的内存并没在次连接在一起,而此时直接清除对象,带有随机性的
所以会造成内存碎片的情况发生,最后导致我们下次去申请内存的时候,不能申请一块连续的内存。
2.复制算法
就是说,对一块申请到的内存而言,一分为二。
同一时刻,只会使用其中一半,当着一半中存在着垃圾,就会把它拷贝到另一半中,当全部对象都使用完了,那就整一块内存都进行释放。
优点就是解决了刚刚内存碎片问题
但是又引入了一个问题,即内存利用率不高,就是比较耗内存。
3.标记-整理
此时的这个方法呢,就是把要进行垃圾会受到时候,把所有正在使用的对象,挪到另一端,
然后直接清理端边界以外的内存。
当然此时呢,整块内存也用了,也没有一分为二使用内存了,但缺点还是有的
比如,当存活对象较多时,挪动的过程也是需要时间开销的。
所以,jvm中对以上的方案进行整合
使用了一种分代回收的方案
4.分代回收
它基于一个观察:大多数对象在创建后不久就会变得不可达,只有少数对象会存活较长时间。
它的大致流程是
1.先分配对象
默认情况下分配的对象,基本是放在了新生代中
但是对象内存占用较大的话,那么可能直接分配到老年代中
2.新生代垃圾回收
当伊甸区满了后,触发小范围的GC:
此时呢,就标记存活对象,
会从当前的伊甸区和S1中寻找存活对象
然后讲这些对象赋值到S2中,复制过程中,这些对象的年龄计数器+1
然后原来的伊甸区和S1中就会被清空,称为可使用状态
等到下一次伊甸区满了,进行GC的时候
那么就是轮换着来,比如,这次先使用S2作为标记区,S1作为存放区,然后进行复制
当这些存活对象中年龄计数器增加到一定程度的时候
那么此时,它们就会被移动到老年代。
当然除了这个计数器增长可以将对象上升到老年代
还有其它条件进行,判断,比如此时存活区中,所有对象大小超过一定比例,那么此时,不会等待某些对象进行年龄增长,而是让较大的年龄对象,直接晋升到老年代
还有一个情况,就是当某个对象,即使没有到达年龄上限,但此时,存活区容纳不下了,此时,也会将其对象晋升到老年代。
3.老年代垃圾回收
当老年代空间不足,或者堆中的元数据区空间不足,此时呢,就是进行对老年区垃圾回收
使用标记-清除 或者标记-整理的方式进行清理垃圾。
这个分代回收的垃圾回收机制而言
1.它使用了不同的类型的算法,针对不同区域清理垃圾,使得整体效率变得高效
2.减少停顿时间
因为在新生代中,不断快速清理短命的对象
现代的垃圾回收器中,也是支持了并发和并行的方式进行清理垃圾
3.降低了内存碎片的风险,毕竟是采用复制算法的方式。
那么到这里,小编对于JVM的某些知识,就分享到这。
相关文章:
探秘JVM内部
在我们编写Java代码,点击运行后,会发生什么事呢? 首先,Java源代码会经过Java编译器将其编译成字节码,放在.class文件中 然后这些字节码文件就会被加载到jvm中,然后jvm会读取这些文件,调用相关…...
c语言学习12天
c语言的宏定义:宏定义单纯的文本替换不会检查语法是否合法 #include #pragma 以及开头的#都属于预处理指令 预处理指令:在gcc编译套件中的cpp预处理器对程序进行编译之前所做的一些动作,如#include预处理指令就是在程序编译之前有预处理器…...
公司内网部署离线deepseek本地模型实战
企业内部可能有些数据比较敏感,不能连接互联网。deepseek来提高工作效率,这个时候你可以利用ollama在内网本地部署来实现。 本式样是先在自己电脑上用虚拟机部署好,再用U盘把虚拟机文件复制到内网去。 一、使用VMware新建WIN2022虚拟机 &a…...
rocketmq中的延迟队列使用详解
RocketMQ的延迟队列通过预设的延迟等级实现消息的定时投递,适用于订单超时、定时通知等高并发场景。以下是其核心原理、使用方式及优化策略的详细解析: 一、实现原理 延迟等级机制 RocketMQ默认提供18个固定延迟等级(1s、5s、10s、30s、1m、2…...
VB.NET Asp.Net Core模板WebAPI应用-宝塔面板Linux系统通过Docker部署
宝塔面板支持在Linux系统上部署Docker容器吗? 如何在宝塔面板上通过Docker部署VB.NET应用? Docker容器中的VB.NET Asp.Net Core WebAPI应用如何配置? 一,首先,创建一个ASP.NET Core测试项目 1.1 打开VS2019/2022,创建一个.NTE6 Core控制台应…...
4985 蜗牛
4985 蜗牛 ⭐️难度:中等 ⭐️考点:2023、省赛、动态规划 📖 📚 import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner sc new Sc…...
springboot多模块工程打包部署运行
1、问题概述? 基于实际项目打包过程,各种配置面面俱到,已配置的可跳过。 本文以打包jar包为模板进行操作,部署方便。 在实际的开发中,项目的模块可能较多,如果都放在一个项目的目录中,势必会造成项目包中的文件冗余,难以管理,这个时候就需要使用多模块管理项目。 …...
吴恩达深度学习复盘(8)神经网络中激活函数的建模
激活函数的建模原理 到目前为止,在隐藏层等一直使用激活函数,最初通过逻辑回归建立新网络,组合多个逻辑回归单元。这表明激活函数在神经网络构建中一直存在,且最初的网络构建方式与逻辑回归相关。实际上,激活函数的种类…...
1-linux的基础知识
一.linux的文件系统结构 windows文件系统 微软windows系统将硬盘上的几个分区,用A: B: C: D:等符号标识。存取文件时一定要清楚放在那个磁盘的那个目录下。 linux文件系统 linux文件系统的组织模式犹如一颗倒置的树,这与windows文件系统有很大的差别…...
docker 常用命令
文章目录 一、帮助启动类命令启动docker停止docker重启docker查看docker状态开机自启查看docker概要信息 二、镜像命令列出本地主机上的镜像搜索镜像拉取镜像查看镜像所占空间删除镜像 三、容器命令新建运行容器交互式启动容器守护进程式启动容器列出当前所有的容器进入容器之后…...
使用docker搭建redis镜像时云服务器无法访问到国外的docker官网时如何解决
下载redis镜像 docker redis:版本号 此时截图中无法访问到国外的docker官网 解决方案: 通过更换镜像源来正常下载redis镜像 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<EOF {"registry-mirrors": ["https://docker.1…...
基于Python的人脸识别校园考勤系统
【Python】基于Python的人脸识别校园考勤系统 (完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 🌟 该系统主要分为前端和后端两个部分,前端👀负责人脸采集、人…...
微信小程序学习实录11:startLocationUpdateBackground:fail auth deny
startLocationUpdateBackground:fail auth deny 表明小程序在尝试开启后台位置更新时,用户授权被拒绝。以下是可能的原因及解决方法: 原因分析 缺少必要的用户授权: 使用 wx.startLocationUpdateBackground 接口需要用户授予 scope.userLo…...
DAPP实战篇:规划下我们的开发线路
前言 在DApp实战篇:先用前端起个项目一文中我们起了一个前端项目,在后续开发中笔者将带领大家一步步完成这个DAPP,为了方便后续讲解,本篇将完整说明后续我们要进行的开发和思路。 主打前端 实际上一个完整的DAPP是由前端和智能…...
docker配置redis容器时配置文件docker-compose.yml示例
1.配置数据节点(主从节点) version: 3.7 services:master:image: redis:5.0.9container_name: redis-masterrestart: alwayscommand: redis-server --appendonly yesports:- 6379:6379slave1:image: redis:5.0.9container_name: redis-slave1restart: a…...
清晰易懂的 Jenkins 安装与核心使用教程
Jenkins 是业界领先的开源自动化服务器,用于实现持续集成与持续交付(CI/CD)。本教程将覆盖 安装部署、核心功能配置、避坑指南,助你快速掌握企业级自动化流水线搭建! 一、Jenkins 安装(全平台指南ÿ…...
anomalib—2—输入图像大小调整
三个地方 第一:在定义model时,要在pre_processor里面去定义一个前处理,前处理就一个功能,定义图像的大小 pre_processor0 Patchcore.configure_pre_processor( image_size (128, 128)) model Patchcore( backbone"wide_r…...
小型园区组网图
1. 在小型园区中,S5735-L-V2通常部署在网络的接入层,S8700-4通常部署在网络的核心,出口路由器一般选用AR系列路由器。 2. 接入交换机与核心交换机通过Eth-Trunk组网保证可靠性。 3. 每个部门业务划分到一个VLAN中,部门间的业务在C…...
编程哲学——TCP可靠传输
TCP TCP可靠传输 TCP的可靠传输表现在 (1)建立连接时三次握手,四次挥手 有点像是这样对话: ”我们开始对话吧“ ”收到“ ”好的,我收到你收到了“ (2)数据传输时ACK应答和超时重传 ”我们去吃…...
2024华为OD机试真题-任务最优调度(C++/Java/Python)-E卷-200分
2024华为OD机试最新E卷题库-(D卷+E卷)-(JAVA、Python、C++) 目录 题目描述 输入描述 输出描述 用例1 考点 题目解析 代码 c++ java python 题目描述 给定一个正整数数组表示待系统执行的任务列表,数组的每一个元素代表一个任务,元素的值表示该任务的类型。请计算执…...
蓝桥杯 2023省B 飞机降落 dfs
传送门 P9241 [蓝桥杯 2023 省 B] 飞机降落 - 洛谷 n<10,考虑dfs,只有当 当前飞机的到达时刻盘旋时间 < 上一个飞机降落的时刻 时,当前飞机才能降落 const int N 1e3 10;int n; struct Node {LL t,d,l; }a[N];bool st[N];bool dfs(in…...
Mybatis--动态SQL
动态SQL是MyBatis的重要特征之一,能够完成不同条件下的SQL拼接,参考文档:动态 SQL_MyBatis中文网 一、<if>标签 该标签主要适用的情况为实现必填字段和非必填字段: 例如下面的例子就是将用户表中的性别设置成了非必填字段…...
计算机视觉中的基于网格的卷绕算法全解析
大家好呀~今天给大家带来一个超级实用且有趣的计算机视觉技巧:基于网格的卷绕算法(Grid Warp Algorithm)!如果你对图像变形、动画制作感兴趣,那一定不要错过这篇文章哦!话不多说,直接…...
xv6 文件系统
Buffer Cache buffer Cache 结构体 bcache 存放了 NBUF 个 buf 框,每个框对应 disk 上某一个 block。从初始化函数 binit中可以看出,bcache 是一个循环双向链表。通过双链表组织这些 buf,以近似 LRU 的策略管理,大概如下图。 st…...
Python Cookbook-5.5 根据内嵌的数字将字符串排序
任务 你想将一个字符串列表进行排序,这些字符串都含有数字的子串(比如一系列邮寄地址)。举个例子,“foo2.txt”应该出现在“foo10.txt”之前。然而,Python 默认的字符串比较是基于字母顺序的,所以默认情况下,“foo10.…...
EMC内参二(1-45页)学习【技术进阶】
EMC设计介入产品设计时间越早,成本越低。 微带线和带状线的区别: 微带线是PCB外层的走线,带状线是结余两个完整参考平面(电源层和地层)之间的走线。 天线效应: PCB上面任何悬空的金属都会积累电荷&…...
Ansible(7)——管理机密
目录 一、Ansible Vault : 二、ansible-vault 命令行工具: 1、创建加密文件: 2、查看加密文件: 3、编辑现有加密文件: 4、加密现有文件: 5、解密现有文件: 6、更改加密文件的密码&#…...
通俗地讲述DDD的设计
通俗地讲述DDD的设计 前言为什么要使用DDDDDD架构分层重构实践关键问题解决方案通过领域事件机制解耦服务依赖:防止逻辑下沉 领域划分电商场景下的领域划分 结语完结撒花,如有需要收藏的看官,顺便也用发财的小手点点赞哈,…...
【学Rust写CAD】34 精确 Alpha 混合函数(argb.rs补充方法)
源码 #[inline]pub fn over_exact(self, dst: Argb) -> Argb {let a 255 - self.alpha32();let t dst.rb() * a 0x80_00_80;let mut rb (t ((t >> 8) & Argb::MASK)) >> 8;rb & Argb::MASK;rb self.rb();// saturaterb | 0x1000100 - ((rb >&…...
10种电阻综合对比——《器件手册--电阻》
二、电阻 前言 10种电阻对比数据表 电阻类型 原理 特点 应用 贴片电阻 贴片电阻是表面贴装元件,通过将电阻体直接贴在电路板上实现电路连接 体积小、重量轻,适合高密度电路板;精度高、稳定性好,便于自动化生产 广泛应用于…...
SpringCloud入门及创建分布式项目
1、了解微服务 1.1 什么是微服务 微服务是一种架构风格一个应用拆分为一组小型服务每个服务运行在自己的进程内,也就是可独立部署和升级服务之间使用轻量级HTTP交互服务围绕业务功能拆分可以由全自动部署机制独立部署去中心化,服务自治。服务可以使用不同…...
xv6启动过程
entry,S -> start.c -> main.c -> proc.c中的 userinit 函数 -> initcode.S -> init.c entry.S // entry.S# qemu -kernel loads the kernel at 0x80000000# and causes each CPU to jump there.# kernel.ld causes the following code to# be placed at 0x800…...
【秣厉科技】LabVIEW工具包——OpenCV 教程(18):highgui 模块
文章目录 前言highgui 模块总结 前言 需要下载安装OpenCV工具包的朋友,请前往 此处 ;系统要求:Windows系统,LabVIEW>2018,兼容32位和64位。 highgui 模块 尽量别用,要不我删了吧? LabVIEW…...
基于OPENCV的图像透视矫正
这段代码的主要功能是对输入的图像进行透视矫正。它会读取一张图像,检测图像中最大的四边形轮廓,然后对该四边形区域进行透视变换,将其矫正为正视图,最后保存矫正后的图像。 模块导入说明 python import cv2 import numpy as n…...
数据结构----------顺序查找,折半查找和分块查找(java实现)
import java.util.Arrays;//顺序查找法 public class Main {public static void main(String[] args) {//查找表int[] arr {4, 3, 5, 1, 2};System.out.print("5在数组中的索引:");System.out.println(SearchSeq(arr, 5));Arrays.sort(arr);System.out.print("…...
整数编码 - 华为OD统一考试(A卷、JavaScript)
题目描述 实现一种整数编码方法,使得待编码的数字越小,编码后所占用的字节数越小。 编码规则如下: 编码时7位一组,每个字节的低7位用于存储待编码数字的补码。字节的最高位表示后续是否还有字节,置1表示后面还有更多的字节&…...
CompletableFuture:整合、超时、完成事件与批量处理
引言 在异步编程实践中,我们不仅需要处理单个任务的执行流程,更需要应对多个异步任务之间的复杂交互。本文将通过实际案例解析以下核心功能: 双任务整合:合并两个独立任务的结果高效超时控制:防止异步操作无限等待完…...
【LeetCode 热题100】45:跳跃游戏 II(详细解析)(Go语言版)
🚀 力扣 45:跳跃游戏 II(全解法详解) 📌 题目描述 给你一个非负整数数组 nums,表示你最初位于数组的第一个位置。 数组中的每个元素表示你在该位置可以跳跃的最大长度。 你的目标是使用 最少的跳跃次数 到…...
【C/C++】滑动谜题(leetcode T773)
核心考点:广度优先搜索 (BFS)、哈希表、字符串、状态转移 题目描述: 在一个 2 x 3 的板上(board)有 5 块砖瓦,用数字 1~5 来表示, 以及一块空缺用 0 来表示。一次 移动 定义为选择 0 与一个相邻的数字(上…...
python用x08覆盖上一次输出来模拟控制台等待效果,pycharm运行sys.stdout.write在控制台无打印的解决方法
一个多进程程序,主进程阻塞,子进程不断打印等待效果直到主进程结束,原理是\x08在ascii中表示退格键,理解为打印完后立马删掉打印下一个内容。 import sys, time import multiprocessing DELAY 0.1 DISPLAY [ |, /, -, \\ …...
【嵌入式开发】使用Linux系统调用编程练习
一、进程和线程的概念及基础用法 在Linux系统中,进程(Process)和线程(Thread)是操作系统进行任务调度的基本单位,它们既有联系又有区别。 1.1 进程和线程介绍 1.1.1 进程(Process)…...
React框架的Concurrent Mode
以下是关于 Concurrent Mode 的系统梳理: 一、Concurrent Mode 的诞生背景 传统渲染的局限性 同步阻塞:React 15 的 Stack Reconciler 无法中断渲染流程优先级缺失:用户交互与后台任务同等对待资源竞争:网络请求与渲染任务无法智能调度核心设计目标 可中断渲染:允许高优先…...
ER-图,详情和画法
一、E-R图的核心元素 1.实体 表示现实中对象或概念,用矩形表示 示例:用户、老师、学生 2.属性 描述实体的特征,用椭圆表示。 分为主键(用户id) 和非主键(用户昵称) 3.关系 表示实体间的…...
深度学习图像分类数据集—十种西红柿病态叶识别分类
该数据集为图像分类数据集,适用于ResNet、VGG等卷积神经网络,SENet、CBAM等注意力机制相关算法,Vision Transformer等Transformer相关算法。 数据集信息介绍:10种西红柿病态叶识别分类:Bacterial_spot,Earl…...
【Flask开发】嘿马文学web完整flask项目第3篇:2.用户认证,2.用户认证【附代码文档】
教程总体简介:2. 目标 1.1产品与开发 1.2环境配置 1.3 运行方式 1.4目录说明 1.5数据库设计 2.用户认证 Json Web Token(JWT) 3.书架 4.1分类列表 5.搜索 5.3搜索-精准&高匹配&推荐 6.小说 6.4推荐-同类热门推荐 7.浏览记录 8.1配置-阅读偏好 8.配置 9.1项目…...
基于Pyhon的京东笔记本电脑数据可视化分析系统
【Python】基于Pyhon的京东笔记本电脑数据可视化分析系统 (完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 本项目基于Python语言开发,通过Flask框架与Bootstrap的结合,实…...
『不废话』之Llama 4实测小报
2025年4月5日Llama 4一开源,随后OpenRouter等平台就提供免费调用。对于中文社区来,官方的测评结果其实意义不大(原因先按下不表),就看知乎、微博、B站、twitter上的真实感受,最重要的是自己的真实案例测评。…...
llama.cpp 和 vLLM 的详细对比分析
llama.cpp 和 vLLM 的详细对比分析,基于最新技术动态(2025年4月)整理: 1. 核心定位 维度llama.cppvLLM设计目标轻量化边缘计算,突破硬件限制(如手机/树莓派)企业级高性能推理,优化G…...
Windows 操作系统使用vscode 配置GTK4
本篇教程,主要介绍在vscode中如何配置使用GTK4,并运行一个简易的入门案例。 一、程序代码 1、demo.cpp #include <gtk/gtk.h>// 定义一个回调函数,用于处理按钮点击事件 static void on_button_clicked(GtkButton *button...
swift-汇编分析多态原理、init
一、结构体和类的本质区别 结构体 编译完就知道调用谁 类 (类似c 的虚函数表) 12 直接将对象将来要调用的函数内存地址提前放进类型信息里面,这些类型信息编译完就确定你将来要调用谁,运行过程过程中就去那块内存里面找 方法的存…...