【进阶】JVM篇
为什么学习jvm
1、面试的需要
学过java的程序员对jvm应该不陌生,程序员为什么要学习jvm呢?其实不懂jvm也可以照样写出优质的代码,但是不懂jvm会被大厂的面试官虐的体无完肤。
2、高级程序员需要了解
jvm作用
jvm负责把编译后的字节码转换为机器码
jvm内部构造
1.类加载部分:负责把硬盘上字节码加载到内存中(运行时数据区)
2.运行时数据区:负责存储运行时产生的各种数据 类信息,对象信息,方法信息……
3.执行引擎:负责将字节码转为机器码
4.本地方法接口:调用本地方法, Object类中的 hashCode()--拿对象的内存地址
public native int hashCode();
private native int read0() throw IOEception;
垃圾回收部分
jvm类加载系统
1.类加载子系统概述
类加载器子系统负责从文件系统或者网络中加载class文件,类加载系统只负责class文件的加载,至于它是否可以运行,则由执行引擎决定。
加载的类信息存放于一块称为方法区的内存空间
类加载系统,负责将硬盘上的字节码文件加载到jvm中,生成类的Class对象,存储在方法区。
类就是一个模板
2、类加载过程
1.加载
以二进制字符流进行读取
在内存中为类生成Class对象
2.链接
·验证:检验被加载的类是否有正确的内部结构,并和其他类协调一致;
·准备 为类的静态属性进行初始化的赋值
准备阶段 先赋值为默认0 在初始化阶段赋值为‘123’
·解析 把字节码的符号引用 替换成 内存中的直接引用地址
3.初始化
初始化阶段主要是为类中的静态成员进行赋值
因为类加载执行完初始化阶段,才说明类加载完成了。
类在哪些情况下会被加载
调用类中静态成员(变量,方法)
new关键字调用
执行该类的main()
反射加载类 Class class.forName("地址");
子类被加载
类在以下两种情况下,是不会被加载的
1.类作为数组类型 Demo[] demo = new Demo[10]; //new的数组对象 不是Demo对象 2.只是访问类中的静态的常量 System.out.println(Demo.P);// 优化 不加载整个类了,只获取到用到的静态常量
类加载器
类加载器就是实际负责读取类的功能
类加载器分类:
站在jvm的角度上,分为
引导类加载器(不是用java写的,是用c/c++),负责读取加载java中底层系统库
java写的类加载器(用来读取我们写的应用程序)
在细分类加载器
1.启动类加载器
C/C++语言实现,负载加载java核心类库(系统库 java.lang)
2.扩展类类加载器
用java语言实现的,继承ClassLoader类,加载jre下面扩展类的 jre/lib/ext 子目录
3.应用程序类加载器
用java语言实现的,继承ClassLoader类,用于加载用户自己定义的类(开发的应用程序).
双亲委派机制
当加载一个类时,总是先让他的父级类加载器去加载,确保把系统中类优先加载,直到父类加载器找不到类时,再逐级向下,让子类加载器加载,
如果子级也找不到,最终抛出类找不到异常
为什么这样做?
防止我们自己写的类替换了系统中的类
如何打破双亲委派机制
自定义类加载器
MyClassLoader extends ClassLoader //重写findClass()
运行时数据区
存储运行时产生的各种数据
程序计数器
程序计数器用来记录每一个线程执行的指令位置,
速度是最快的,是线程私有的(每一个线程都会有一个程序计数器)
此区域不会出现内存溢出,也不会垃圾回收
虚拟机栈
栈是运行的,解决程序方法执行,在虚拟机栈中,运行我们java自己写的方法
调用方法,方法入栈,运行结束出栈(先进后出 栈顶的方法,称为当前栈帧)
一个方法就是一个栈帧,在栈帧中存储局部变量,运行结果……
虚拟机栈也是线程私有的,线程之间互相隔离
栈区域不存在垃圾回收,但是会存在内存溢出问题
栈帧中存储什么内容?
局部变量表 int a=10;
操作数栈(计算过程) int c = a+b;
方法返回地址
本地方法栈
本地方法栈是用来执行调用的本地方法的.
是线程私有的,不会存在垃圾回收,
会出现内存溢出问题
堆
堆概述
堆的作用是用来存储java语言产生的对象的.
是运行时数据区中最大的一块内存空间,空间大小可以设置
堆空间是所有线程共享的.
对空间是垃圾回收的重点区域,堆中没有被使用到的垃圾对象,会被垃圾回收器回收调用
堆空间区域划分
堆分为
新生区(新生代 年轻代)
伊甸园区
幸存者0区
幸存者1区
老年区(老年代)
为什么分区(代)?
可以将不同生命周期的对象存储在不同的区域,针对不同的区域采用不同的垃圾回收算法,使得垃圾回收策略更加优化.
对象创建存储过程
新创建的对象都存储在伊甸园区
当垃圾回收时,将还被使用的对象,转移至某一个幸存者区,将伊甸园区进行清除,
当下一次垃圾回收时,将伊甸园区存储的对象与当前正在使用的幸存者区存活的对象,转移至另一个幸存者区(每一次会空闲一个幸存者区)
当一个对象经历过15次垃圾回收后,仍然存活的话,那么就把该对象移动到老年代,
老年代就比较少的进行垃圾回收,在老年代空间不足时,对老年代会进行垃圾回收,
当回收后,内存仍然不足时,会触发FULL GC(整堆收集 应尽量避免)
当整堆收集后仍然不够使用,那么就会出现内存溢出错误 --OOM
jvm调优
可以根据程序具体的使用场景,对运行时数据区的各种空间大小调整 例如堆,方法区
对垃圾回收器进行选择(根据使用的场景选择单线程的或者是多线程的)
方法区
方法区主要用来存储加载的类 信息
方法区的大小也是可以设置的
方法区也会进行垃圾回收,方法区也可能会出现内存溢出的问题
方法区的垃圾回收
方法区的垃圾回收,是对类信息进行回收的
类信息如果不再被使用,类信息也可以被卸载
卸载条件
该类所产生的对象都不存在了
该类的Class对象,也不再被使用了
加载该类的类加载器也被回收了.
本地方法接口
是虚拟机中专门用来调用本地方法的接口
什么是本地方法
在java中被native关键字修饰的方法,没有方法体,不是用java语言实现的方法,用C/C++在操作系统底层实现的方法
Object hashCode() 获取对象内存地址 涉及到读取内存
IO中读文件(输入文件 操作硬盘) read0();
启动线程 native void start0(); 启动线程 就是把这个线程注册到操作系统
java中为什么要调用本地方法
因为java属于应用层语言,有时候,需要对硬件系统资源进行调用
此时就不方便,再一个系统资源不允许应用层程序直接调用
那么就需要通过本地方法 调用操作硬件资源
执行引擎
1.执行引擎是java虚拟机核心的组成部分之一
主要作用是将加载到虚拟机中的字节码,再次转换为机器码(字节码并不是系统能够直接执行的机器码)
执行引擎可以通过解释/编译两种方式 实现将字节码转为机器码
java程序执行过程中涉及两次编译
第一次 .java(源代码 通过jdk javac 调用编译器) -->.class文件 称为前端编译
第二次 通过执行引擎 将字节码 编译为 机器码 称为后端编译
将字节码转为机器码有两种方式:
解释器(解释执行):对字节码逐行进行解释翻译,重复性的代码,也是每次都要解释执行,效率低
编译器(编译执行):对某一段字节码进行整体编译,然后存储起来,以后使用时不再需要编译了,效率高。
编译器会针对执行过程中的热点代码进行编译,并缓存起来
为什么要使用解释执行和编译执行并存这样的设计?
程序开始运行时,解释器可以立即发挥作用,投入使用
而编译器虽然执行效果高,但是前期需要对热点代码进行跟踪和编译,需要消耗时间
垃圾回收
什么是垃圾对象?
垃圾是指在运行程序中没有任何引用指向的对象
就是一个对象 不再被任何的引用所指向。
没有任何引用所指向的对象
垃圾对象如果不清理,新的对象可能没有足够的空间,可能会导致内存的溢出问题。
垃圾回收发展
早期c/c++这类语言,内存管理都是手动的,使用时申请,使用完后手动释放
优点:对内存管理更加精确,效率高
缺点:增加程序员的负担,控制不好,容易出事(忘了释放,误操作内存空间)
后来发展为自动回收:
java,,C#…都采用自动垃圾回收
优点:解放了程序员
缺点:会占用一些内存空间(垃圾不是出现后立即回收的),降低了程序员管理内存的能力
哪些区域会出现垃圾回收?
堆 对象 频繁回收年轻代 较少回收老年代
方法区 类信息卸载 整堆收集时,会进行回收 FULL GC
内存溢出与内存泄漏
内存溢出:内存不够用了
内存泄漏:系统中那些用不到的,但是又不能回收的对象
案例:单例对象
数据库连接对象,IO流,socket 这些提供close()类
用完之后,如果没有关闭, 垃圾回收器是不能主动回收这些对象的.
内存泄漏,虽然不能直接触发内存溢出,但是长期有对象不能被回收,也是导致内存泄漏的原因之一.
Stop the world
垃圾回收时。会经历两个阶段:一是标记阶段 二是回收阶段。
在标记和回收时,需要我们的用户线程暂停,不暂停的话 在标记和回收时可能会出现错标和漏标
垃圾回收阶段算法
1.垃圾标记阶段
将虚拟机中不再被任何引用指向的对象标记出来,在垃圾回收阶段,就会将标记出来对象进行回收
垃圾标记阶段相关算法
引用计数算法(存在缺陷的,没有被虚拟机所使用的)
设计思想: 在对象中维护一个整数计数器变量 当有引用指向对象时,计数器就加一,相反就减一(引用断开)
优点: 设计实现简单,容易分辨对象是否是垃圾对象
缺点:需要维护一个变量存储引用数量,频繁修改引用计数器变量,占空间,还耗时
最重要的是,无法解决循环引用问题
可达性分析算法(根搜索法)
设计思想:从一些可以被称为GCRoots的对象开始向下查找,只要某一个对象与GCRoots对象有联系的,就可以判定对象是被使用的,与跟对象引用链没有任何关系的对象,可以视为垃圾对象
哪些对象可以作为GCRoots(根对象)?
1.虚拟机栈中(被调用的方法)所使用的对象
2.类中的静态属性
3.虚拟机中使用的系统类对象
4.所有被同步锁synchronized持有的对象
对象中的finalize机制
Object类中有一个finalize()这个方法是在对象被回收之前,由虚拟机自动调用的,
在对象被回收前,需要执行的一些操作,就可以在此方法中编写
finalize()方法可以在子类中重写
finalize()方法指挥被调用一次(第一次被判定为垃圾,要对其回收,调用finalize(),对象有可能又被引用了,对象就不能被回收,当下一次被判定为垃圾对象时,就不会调用finalize())
由于finalize()方法存在,被标记为垃圾的对象,也不是非死不可的。
可以将对象分为三种状态:
可触及:被GCRoots引用的, 不是垃圾对象
可复活的:被判定为垃圾的,但是finalize()方法还没有被调用过的
不可触及的(必死无疑的):被判定为垃圾,且执行过finalize()方法
2.垃圾回收阶段
1.标记-复制算法
将内存可以分为多个较小的块,当发生垃圾回收时,将一个区域中存活的对象复制到另一个区域,
在另一个区域从头开始排列,清除当前垃圾回收的区域
优点:清理之后,内存没有碎片
不足:回收时,需要移动对象,所以适合小内存块,而且存活对象少的情况
适合用于新生代
2.标记-清除算法
将被标记为垃圾的对象地址进行记录。后面如果分配新对象,判断垃圾对象空间能否存储下新的对象,
如果能存储下,用新对象直接覆盖垃圾对象即可
存活对象是不发生移动的.
优点:不会移动对象
不足:回收后,内存空间碎片化
3.标记-压缩(整理)算法
将存活的对象会移动到内存区域的一端,按顺序排列(压缩),清理边界以外的空间,在标记清除的基础上进行一次内存整理.
优点:回收后没有内存碎片
标记-清除和标记压缩对比
标记-清除:不移动存活对象
标记-压缩:会移动存活对象
两者都适合用于老年代对象回收
先使用标记-清除,当老年代 空间不足时,或者不能存储一个比较大的对象时,在使用标记-压缩算法
垃圾回收时,根据不同的分区采用不同的回收算法
新生代 : 标记-复制
老年代 : 标记-清除 标记-压缩
垃圾回收器
什么是垃圾回收器
垃圾回收器,是对垃圾回收过程实践者(落地)
不同的虚拟机中,垃圾回收器种类也是很多的
有哪些垃圾回收器 特点
垃圾回收器分类:
从线程数量上分:
单线程 垃圾回收线程只有一个
多线程 有多个垃圾回收线程
从工作模式上分:
独占式:垃圾回收线程执行时,其他用户线程需要暂停(stop the world)
并发式: 垃圾回收线程和用户线程可以做到并发执行
从分区角度上分:
新生代
老年代
垃圾收集器性能指标:
吞吐量
用户线程暂停时间(重点)
回收时内存开销
Serial 单线程 新生代
Serial Old, 单线程 老年代
ParNew、Parallel Scavenge, 多线程 新生代收集器
Parallel Old, 多线程老年代收集器
CMS, 多线程老年代收集器 (开创了垃圾收集线程与用户线程并发执行的先例)
并发标记清除 收集器
初始标记 --独占执行
并发标记 --并发执行
重新标记 --独占执行
并发清除 --并发执行
G1
G1垃圾回收器,继承了CMS中,垃圾收集线程和用户线程并行执行的特点,减少了用户线程暂停的时间
同时,将新生代和老年代的各个区域,又划分成更小的区域,对每个区域进行跟踪,
优先回收价值高的区域(垃圾多的区域,例如可以把伊甸园区可以分成好几个小的区域)
提升回收效率,提高了吞吐量,不再区分年轻代和老年代,可以做到对整个堆进行回收。
非常适合服务器端程序,大型项目
设置垃圾回收器
相关文章:
【进阶】JVM篇
为什么学习jvm 1、面试的需要 学过java的程序员对jvm应该不陌生,程序员为什么要学习jvm呢?其实不懂jvm也可以照样写出优质的代码,但是不懂jvm会被大厂的面试官虐的体无完肤。 2、高级程序员需要了解 jvm作用 jvm负责把编译后的字节码转换…...
【安全靶场】信息收集靶场
靶场:https://app.hackinghub.io/hubs/prison-hack 信息收集 子域名收集 1.subfinder files.jabprisons.com staging.jabprisons.com cobrowse.jabprisons.com a1.top.jabprisons.com cf1.jabprisons.com va.cobrowse.jabprisons.com vs.jabprisons.com c…...
新数据结构(4)——Java继承
基本概念 继承的本质:重复使用已经定义好的方法和域,实现代码的重复利用。 使用继承之后,创建的子类可以方便地调用父类中已经定义的方法。 一个继承的例子: 重载和重写 重载 重载:发生在同一个类里,指…...
大数据学习之SparkStreaming、PB级百战出行网约车项目一
一.SparkStreaming 163.SparkStreaming概述 Spark Streaming is an extension of the core Spark API that enables scalable, high-throughput, fault-tolerant stream processing of live data streams. Spark Streaming 是核心 Spark API 的扩展,支持实时数据…...
介绍两个个电池充电管理芯片(TP4057、ME4069)
第一个是TP4057。 输入电压是4~6.5V TP4056,它们之间最大的区别就是TP4056最高是1A的充电电流,而TP4057是500ma,适用于更小一点的电池。 TP4057停机模式的静态电流也更小(上图列的是待机模式,但查看后面的表格发现实际…...
Debezium日常分享系列之:解码逻辑解码消息内容
Debezium日常分享系列之:解码逻辑解码消息内容 示例配置选项 DecodeLogicalDecodingMessageContent SMT将PostgreSQL逻辑解码消息的二进制内容转换为结构化形式。当Debezium PostgreSQL连接器捕获逻辑解码消息时,它会将消息事件记录发送到Kafka。默认情况…...
【Linux】smp_mb__after_atomic
文章目录 背景知识smp_mb__after_atomic 的作用具体应用场景为什么需要 smp_mb__after_atomic相关宏总结 背景知识 在现代多核处理器和并发编程中,编译器优化和CPU乱序执行可能导致程序指令的实际执行顺序与源代码中的顺序不一致。这种现象可能会破坏多线程或进程间…...
关于conda换镜像源,pip换源
目录 1. 查看当前下载源2. 添加镜像源2.1清华大学开源软件镜像站2.2上海交通大学开源镜像站2.3中国科学技术大学 3.删除镜像源4.删除所有镜像源,恢复默认5.什么是conda-forge6.pip换源 1. 查看当前下载源 conda config --show channels 如果发现多个 可以只保留1个…...
【JavaEE进阶】依赖注入 DI详解
目录 🌴什么是依赖注入 🎄依赖注入的三种方法 🚩属性注⼊(Field Injection) 🚩Setter注入 🚩构造方法注入 🚩三种注⼊的优缺点 🌳Autowired存在的问题 🌲解决Autowired存在的…...
鸿蒙HarmonyOS NEXT开发:横竖屏切换开发实践
文章目录 一、概述二、窗口旋转说明1、配置module.json5的orientation字段2、调用窗口的setPreferredOrientation方法 四、性能优化1、使用自定义组件冻结2、对图片使用autoResize3、排查一些耗时操作 四、常见场景示例1、视频类应用横竖屏开发2、游戏类应用横屏开发 五、其他常…...
自己部署 DeepSeek 助力 Vue 开发:打造丝滑的折叠面板(Accordion)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 自己…...
程序员升级进阶之路
熟悉业务、项目代码、工作流程,积极吸取技术资料接需求,画流程图,(伪代码),详细设计明确职业发展方向【很重要】求精:写代码前的技术方案设计 写代码并不难,关键是要明确为什么要写…...
C/C++后端开发面经
字节跳动 客户端开发 实习 一面(50min) 自我介绍是否愿意转语言,是否只愿意搞后端选一个项目来详细谈谈HTTP和HTTPS有什么区别?谈一下HTTPS加密的具体过程: 非对称加密 对称加密 证书认证的方式 非对称加密是为了保证对称密钥的安全性。 对称…...
【C++】策略模式
使用场景 主要目的是定义一系列可互换的算法或行为,并使它们在运行时可以根据不同的情况动态地替换。它侧重于算法的封装和替换,让客户端可以灵活地选择不同的策略来完成特定的任务。 例如,在一个游戏角色的行为系统中,角色的攻击…...
Baklib剖析企业内容管理与内容中台的主要区别解析
内容概要 在当今数字化转型的浪潮中,企业内容管理和内容中台这两种系统日益受到关注。两者虽均旨在提升企业的内容管理效率与协同能力,但却存在明显差异。企业内容管理(ECM)主要聚焦于文档的创建、存储、检索和管理,旨…...
深入了解 MySQL:从基础到高级特性
引言 在当今数字化时代,数据的存储和管理至关重要。MySQL 作为一款广泛使用的开源关系型数据库管理系统(RDBMS),凭借其高性能、可靠性和易用性,成为众多开发者和企业的首选。本文将详细介绍 MySQL 的基础概念、安装启…...
从零到一:基于Rook构建云原生Ceph存储的全面指南(上)
文章目录 一.Rook简介二.Rook与Ceph架构2.1 Rook结构体系2.2 Rook包含组件1)Rook Operator2)Rook Discover3)Rook Agent 2.3 Rook与kubernetes结合的架构图如下2.4 ceph特点2.5 ceph架构2.6 ceph组件 三.Rook部署Ceph集群3.1 部署条件3.3 获取…...
嵌入式经常用到串口,如何判断串口数据接收完成?
说起通信,首先想到的肯定是串口,日常中232和485的使用比比皆是,数据的发送、接收是串口通信最基础的内容。这篇文章主要讨论串口接收数据的断帧操作。 空闲中断断帧 一些mcu(如:stm32f103)在出厂时就已经在…...
OpenGL-基础知识(更新中)
本文基于The Cherno在Youtube上的OpenGL系列视频总结出的笔记,等这个系列视频学习完后,将更加系统详细的学习《计算机图形学编程(使用OpenGL和C 第二版)》这本书。个人认为看cherno的视频上手速度更快,而且他对基本概念…...
【多模态大模型】系列2:Transformer Encoder-Decoder——BLIP、CoCa、BEITv3
目录 1 BLIP2 CoCa3 BEITv3 1 BLIP BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation BLIP是 ALBEF 原班人马做的,基本可以看做吸收了 VLMo 思想的 ALBEF。训练的 loss 和技巧都与 ALBEF一致ÿ…...
基于CanMV IDE 开发软件对K210图像识别模块的开发
简介 CanMV IDE 是一款专为 K210 芯片设计的图形识别 Python 软件,它提供了强大的功能,帮助开发者轻松实现基于 K210 芯片的图形识别应用。无论你是初学者还是经验丰富的开发者,CanMV IDE 都能为你提供便捷的开发环境和丰富的资源。 硬件资…...
如何准备软考高级系统分析师考试
以下是针对软考高级系统分析师考试的详细备考方案,结合学习周期、阶段任务、习题选择和通过概率分析,帮助考生高效备考。 一、备考周期建议(4-6个月) 建议分为 基础阶段(2个月)→ 强化阶段(2个…...
解析RK3588无线边缘盒子为工业自动化边缘推理带来的 AI 突破
在工业自动化领域,边缘推理的高效性和准确性对于提升生产效率和质量至关重要。RK3588 凭借强大的 AI 算力,为工业自动化边缘推理带来了显著的赋能效果。 RK3588 拥有出色的多核架构和高性能的 GPU ,能够快速处理大量的数据。在工业生产线上&…...
初一说明文:我的护眼灯
本文转自:AI范文助手网 原文链接:https://www.aazhushou.com/czzw/5023.html 自爱迪生发明了灯以来,各种各样的灯相继问世了,给人一种新景象,其中护眼灯也问世了。 我有一盏台灯叫麦迪格护眼灯。那天我和母亲去商场&…...
归并排序(C# C++)
目录 1 归并排序的基本概念 2 算法步骤 2-1 分解阶段 2-2 合并阶段 3 代码实现 3-1 C#代码示例(该代码在unity环境下) 3-2 C代码示例 1 归并排序的基本概念 归并排序(Merge Sort)是一种经典的分治算法,由约翰…...
【Linux】Ubuntu Linux 系统 ——PHP开发环境
ℹ️大家好,我是练小杰,元宵节到了,在此祝大家元宵节快乐😆 新的一年里,愿你步步高升,事事如意,心想事成!! 本文是关于Linux 操作系统中部署PHP开发环境这部分基础内容,后…...
TDengine 性能测试工具 taosBenchmark
简介工具获取运行 无参数模式命令行模式配置文件模式 命令行参数配置文件参数 通用配置参数写入配置参数 数据库相关超级表相关标签列与数据列写入行为相关 查询配置参数 执行指定查询语句查询超级表 订阅配置参数数据类型对照表 配置文件示例 写入 JSON 示例查询 JSON 示例订阅…...
校园网绕过认证上网很简单
校园网绕过认证就是不用通过校园WiFi的WEB页面登录,这个WEB登录页面就是认证页面. 所谓绕过认证,就是不通过校园WiFi WEB登录页面直接上网,校园WiFi没有密码,直接就能连接上,我们连上这个WiFi的时候,它会给…...
C++ Primer 迭代语句
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
World of Warcraft [CLASSIC][Grandel] FOR THE HORDE
《World of Warcraft [CLASSIC][80猎人][Grandel]维克尼拉斯大型纪录片2025年元宵节击杀联盟主城4BOSS[为了部落!]》 World of Warcraft [CLASSIC][80猎人][Grandel]维克尼拉斯大型纪录片2025年元宵节击杀联盟主城4BOSS[为了部落!]_魔兽...
【ESP32指向鼠标】——icm20948与esp32通信
【ESP32指向鼠标】——icm20948与esp32通信 ICM-20948介绍 ICM-20948 是一款由 InvenSense(现为 TDK 的一部分)生产的 9 轴传感器集成电路。它结合了 陀螺仪、加速度计和磁力计。 内置了 DMP(Digital Motion Processor)即负责执…...
随手记:小程序setData 数据传输长度为 XXXKB,存在有性能问题!小程序长列表性能优化,uni.createIntersectionObserver
在一些小程序列表的页面,总是会看到小程序控制台的黄色警告: 这是由于data 数据过大,导致的问题 方法: 1.避免setData的数据过大,小于1024kb。 2.避免调用频繁,保证数据实时性。 3.避免未绑定在WXML的…...
双ESP8266-01S通讯UDP配置
第一台ESP8266(发送命令需要勾---发送新行) ATCWMODE3 ATCWSAP_DEF"CAR_wifi_Master","12345678",5,3 //设置本地wifi名称以及密码 ATCIPSTA_DEF"192.168.4.1" //设置本地IP ATCIFSR …...
记忆模块概述
文章目录 记忆模块概述记忆组件的定义记忆组件、链组件和Agent组件的关系设置第一个记忆组件内置记忆组件自定义记忆组件 本文将LangChain框架内所有与记忆功能有关的组件统一称为“记忆模块”。简而言之,记忆模块是一个集合体,由多个不同的记忆组件构成…...
计算机网络结课设计:通过思科Cisco进行中小型校园网搭建
上学期计算机网络课程的结课设计是使用思科模拟器搭建一个中小型校园网,当时花了几天时间查阅相关博客总算是做出来了,在验收后一直没管,在寒假想起来了简单分享一下,希望可以给有需求的小伙伴一些帮助 目录 一、设计要求 二、…...
算法之 数论
文章目录 质数判断质数3115.质数的最大距离 质数筛选204.计数质数2761.和等于目标值的质数对 2521.数组乘积中的不同质因数数目 质数 质数的定义:除了本身和1,不能被其他小于它的数整除,最小的质数是 2 求解质数的几种方法 法1,根…...
【论文阅读】Revisiting the Assumption of Latent Separability for Backdoor Defenses
https://github.com/Unispac/Circumventing-Backdoor-Defenses 摘要和介绍 在各种后门毒化攻击中,来自目标类别的毒化样本和干净样本通常在潜在空间中形成两个分离的簇。 这种潜在的分离性非常普遍,甚至在防御研究中成为了一种默认假设,我…...
【深入探讨 ResNet:解决深度神经网络训练问题的革命性架构】
深入探讨 ResNet:解决深度神经网络训练问题的革命性架构 随着深度学习的快速发展,卷积神经网络(CNN)已经成为图像识别、目标检测等计算机视觉任务的主力军。然而,随着网络层数的增加,训练深层网络变得愈加…...
【C】链表算法题7 -- 环形链表||
leetcode链接https://leetcode.cn/problems/linked-list-cycle-ii/description/ 问题描述 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到…...
设备智能化无线通信,ESP32-C2物联网方案,小尺寸芯片实现大功能
在科技飞速发展的当下,我们的生活正被各类智能设备悄然改变,它们如同一位位无声的助手,渗透到我们生活的每一个角落,让生活变得更加便捷和丰富多彩。 智能插座、智能照明和简单家电设备在家居领域的应用,为我们的生活…...
【嵌入式Linux应用开发基础】read函数与write函数
目录 一、read 函数 1.1. 函数原型 1.2. 参数说明 1.3. 返回值 1.4. 示例代码 二、write 函数 2.1. 函数原型 2.2. 参数说明 2.3. 返回值 2.4. 示例代码 三、关键注意事项 3.1 部分读写 3.2 错误处理 3.3 阻塞与非阻塞模式 3.4 数据持久化 3.5 线程安全 四、嵌…...
从 X86 到 ARM :工控机迁移中的核心问题剖析
在工业控制领域,技术的不断演进促使着工控机从 X86 架构向 ARM 架构迁移。然而,这一过程并非一帆风顺,面临着诸多关键挑战。 首先,软件兼容性是一个重要问题。许多基于 X86 架构开发的工业控制软件可能无法直接在 ARM 架构上运行…...
【数据结构】(7) 栈和队列
一、栈 Stack 1、什么是栈 栈是一种特殊的线性表,它只能在固定的一端(栈顶)进行出栈、压栈操作,具有后进先出的特点。 2、栈概念的例题 答案为 C,以C为例进行讲解: 第一个出栈的是3,那么 1、…...
android设置添加设备QR码信息
摘要:客户衍生需求,通过扫QR码快速获取设备基础信息,并且基于POS SDK进行打印。 1. 定位至device info的xml添加相关perference Index: vendor/mediatek/proprietary/packages/apps/MtkSettings/res/xml/my_device_info.xml--- vendor/medi…...
进程状态
目录 1.进程排队 硬件的队列 进程排队 2.进程的三大状态 什么是状态 运行状态 阻塞状态 挂起状态 3.Linux系统中的进程状态 4.僵尸状态 5.孤儿进程 1.进程排队 硬件的队列 计算机是由很多硬件组成的,操作系统为了管理这些硬件,通常需要为这…...
【linux学习指南】模拟线程封装与智能指针shared_ptr
文章目录 📝线程封装🌉 Thread.hpp🌉 Makefile 🌠线程封装第一版🌉 Makefile:🌉Main.cc🌉 Thread.hpp: 🌠线程封装第二版🌉 Thread.hpp:🌉 Main.cc …...
智慧物流新引擎:ARM架构工控机在自动化生产线中的应用
工业自动化程度的不断提升,对高性能、低功耗和高可靠性的计算设备需求日益增长。ARM架构工控机因其独特的优势,在多个工业领域得到了广泛应用。本文将深入探讨ARM架构工控机的特点及其在具体工业场景中的应用。 ARM架构工控机的主要优势 高效能与低功耗…...
OpenGL的基础光照知识
光照模型 常见的光照模型:ADS模型 A:环境光反射(ambient reflection):模拟低级光照,影响场景中的所有物体。D:漫反射(diffuse reflection):根据光线的入射角…...
centos 10 离线安装dnf 和 设置dnf镜像源
离线安装dnf可用kimi搜索, centos 使用curl 下载dnf 的rpm包 mkdir ~/dnf_packages cd ~/dnf_packages# CentOS 7 示例 curl -O http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/dnf-0.6.4-2.sdl7.noarch.rpm curl -O http://springdale.math.ias.edu/data/pu…...
redis 缓存击穿问题与解决方案
前言1. 什么是缓存击穿?2. 如何解决缓存击穿?怎么做?方案1: 定时刷新方案2: 自动续期方案3: 定时续期 如何选? 前言 当我们使用redis做缓存的时候,查询流程一般是先查询redis,如果redis未命中,再查询MySQL,将MySQL查询的数据同步到redis(回源),最后返回数据 流程图 为什…...