【Java 面试 八股文】JVM 虚拟机篇
JVM 虚拟机篇
- 1. JVM组成
- 1.1 JVM由那些部分组成,运行流程是什么?
- 1.2 什么是程序计数器?
- 1.3 你能给我详细的介绍Java堆吗?
- 1.4 Java 虚拟机栈
- 1.4.1 Java Virtual machine Stacks (java 虚拟机栈)
- 1.4.2 栈和堆的区别
- 1.4.3 垃圾回收是否涉及栈内存?
- 1.4.4 栈内存分配越大越好吗?
- 1.4.5 方法内的局部变量是否线程安全?
- 1.4.6 栈内存溢出情况
- 1.5 能不能解释一下方法区?
- 1.5.1 概述
- 1.5.2 运行时常量池
- 1.5.3 方法区中的方法的执行过程?
- 1.6 你听过直接内存吗?
- 2. 类加载器
- 2.1 什么是类加载器
- 2.2 类加载器种类
- 2.3 什么是双亲委派模型?
- 2.4 JVM为什么采用双亲委派机制(作用)
- 2.5 说一下类装载的执行过程
- 3. 垃圾回收
- 3.1 对象什么时候可以被垃圾器回收
- 3.2 VM 垃圾回收算法有哪些?
- 3.2.1 标记清除算法
- 3.2.2 标记整理算法
- 3.2.3 复制算法
- 3.3 分代回收算法
- MinorGC、 Mixed GC 、 FullGC的区别是什么
- 3.4 说一下 JVM 有哪些垃圾回收器?
- 3.4.1 串行垃圾收集器
- 3.4.2 并行垃圾收集器
- 3.4.3 CMS(并发)垃圾收集器
- 3.4.4 G1垃圾回收器
- 3.5 强引用、软引用、弱引用、虚引用的区别?
- 4. JVM 实践
- 4.1 JVM 调优的参数都有哪些?
- 4.2 java内存泄露的排查思路?
- 4.3 服务器CPU持续飙高,你的排查方案与思路?
1. JVM组成
1.1 JVM由那些部分组成,运行流程是什么?
难易程度:☆☆☆
出现频率:☆☆☆☆
JVM是什么
Java Virtual Machine Java程序的运行环境(java二进制字节码的运行环境)
- 一次编写,到处运行
- 自动内存管理,垃圾回收机制
从图中可以看出 JVM 的主要组成部分
- ClassLoader(类加载器)
- Runtime Data Area(运行时数据区,内存分区)
- Execution Engine(执行引擎)
- Native Method Library(本地库接口)
运行流程:
- 类加载器(ClassLoader)把Java代码转换为字节码
- 运行时数据区(Runtime Data Area)把字节码加载到内存中,而字节码文件只是JVM的一套指令集规范,并不能直接交给底层系统去执行,而是有执行引擎运行
- 执行引擎(Execution Engine)将字节码翻译为底层系统指令,再交由CPU执行去执行,此时需要调用其他语言的本地库接口(Native Method Library)来实现整个程序的功能。
1.2 什么是程序计数器?
难易程度:☆☆☆
出现频率:☆☆☆☆
程序计数器(PC Register):线程私有的,内部保存的字节码的行号。用于记录正在执行的字节码指令的地址。
javap -verbose xx.class 打印堆栈大小,局部变量的数量和方法的参数。
1.3 你能给我详细的介绍Java堆吗?
难易程度:☆☆☆
出现频率:☆☆☆☆
线程共享的区域:Java堆 (Heap) 是Java虛拟机中内存管理的一个重要区域,主要用于存放对象实例和数组。当堆中没有内存空间可分配给实例,也无法再扩展时,则抛出OutOfMemoryError异常。
- 新生代(Young Generation):新生代分为Eden Space和Survivor Space。在Eden Space中,大多数新创建的对象首先存放在这里。Eden区相对较小,当Eden区满时,会触发一次 Minor GC(新生代垃圾回收)。在Survivor Spaces中,通常分为两个相等大小的区域,称为 S0(Survivor 0) 和 S1(Survivor1)。在每次Minor GC后,存活下来的对象会被移动到其中一个Sunvivor空间,以继续它们的生命周期。
- 老年代(Old Generation/Tenured Generation):存放过一次或多次Minor GC仍存活的对象会被移动到老年代。老年代中的对象生命周期较长,因此Major Gc(也称为Ful GC,涉及老年代的垃圾回收)发生的频率相对较低,但其执行时间通常比Minor Gc长。老年代的空间通常比新生代大,以存储更多的长期存活对象。
- 元空间保存的类信息、静态变量、常量、编译后的代码。
为了避免方法区出现OOM,所以在java8中将堆上的方法区【永久代】给移动到了本地内存上,重新开辟了一块空间,叫做元空间。那么现在就可以避免掉OOM的出现了。
1.4 Java 虚拟机栈
与程序计数器一样,Java 虚拟机栈(后文简称栈)也是线程私有的,它的生命周期和线程相同,随着线程的创建而创建,随着线程的死亡而死亡。
1.4.1 Java Virtual machine Stacks (java 虚拟机栈)
- 每个线程运行时所需要的内存,称为虚拟机栈,先进后出。
- 每个栈由多个栈帧(frame)组成,对应着每次方法调用时所占用的内存。每一次方法调用都会有一个对应的栈帧被压入栈中,每一个方法调用结束后,都会有一个栈帧被弹出。
- 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法
1.4.2 栈和堆的区别
- 在JVM内存模型中,栈(Stack)主要用于管理线程的局部变量和方法调用的上下文,而堆(Heap)则是
用于存储所有类的实例和数组。堆会GC垃圾回收,而栈不会。 - 栈内存是线程私有的,而堆内存是线程共有的。
- 两者异常错误不同,但如果栈内存或者堆内存不足都会抛出异常
- 栈空间不足: java.lang.StackOverFlowError。
- 堆空间不足: java.lang.OutOfMemoryError。
1.4.3 垃圾回收是否涉及栈内存?
垃圾回收主要指就是堆内存,当栈帧弹栈以后,内存就会释放。
1.4.4 栈内存分配越大越好吗?
未必,默认的栈内存通常为1024k。栈帧过大会导致线程数变少,例如,机器总内存为512m,目前能活动的线程数则为512个,如果把栈内存改为2048k,那么能活动的栈帧就会减半。
1.4.5 方法内的局部变量是否线程安全?
- 如果方法内局部变量没有逃离方法的作用范围,它是线程安全的
- 如果是局部变量引用了对象,并逃离方法的作用范围,需要考虑线程安全
1.4.6 栈内存溢出情况
- 栈帧过多导致栈内存溢出,典型问题:递归调用
- 栈帧过大导致栈内存溢出(不容易出现)
1.5 能不能解释一下方法区?
难易程度:☆☆☆
出现频率:☆☆☆
1.5.1 概述
- 方法区(Method Area)是各个线程共享的内存区域
- 主要存储类的信息、运行时常量池
- 虚拟机启动的时候创建,关闭虚拟机时释放
- 如果方法区域中的内存无法满足分配请求,则会抛出OutOfMemoryError: Metaspace
1.5.2 运行时常量池
- 常量池:可以看作是一张表,虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等信息
- 常量池是 *.class 文件中的,当该类被加载,它的常量池信息就会放入运行时常量池,并把里面的符号地址变为真实地址
1.5.3 方法区中的方法的执行过程?
当程序中通过对象或类直接调用某个方法时,主要包括以下几个步骤:
- 解析方法调用:JVM会根据方法的
符号引用找到实际的方法地址
- 栈帧创建:在调用一个方法前,JVM会在当前线程的
Java虚拟机栈中
为该方法分配一个新的栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
执行方法:执行方法内的字节码指令,涉及的操作可能包括局部变量的读写、操作数栈的操作、跳转控制、对象创建、方法调用等。
返回处理:方法执行完毕后,可能会返回一个结果给调用者,并清理当前栈帧
,恢复调用者的执行环境。
1.6 你听过直接内存吗?
难易程度:☆☆☆
出现频率:☆☆☆
- 并不属于JVM中的内存结构,不由JVM进行管理。是虚拟机的系统内存
- 常见于 NIO 操作时,用于数据缓冲区,分配回收成本较高,但读写性能高,不受 JVM 内存回收管理
2. 类加载器
难易程度:☆☆☆☆
出现频率:☆☆☆
2.1 什么是类加载器
JVM只会运行二进制文件,而类加载器(ClassLoader)的主要作用就是将字节码文件加载到JVM中,从而让Java程序能够启动起来。
2.2 类加载器种类
类加载器根据各自加载范围的不同,划分为四种类加载器:
启动类加载器(BootStrap ClassLoader)
:该类并不继承ClassLoader类,其是由C++编写实现。负责加载Java的核心库(如JAVA_HOME/jre/lib目录下的类库)。扩展类加载器(ExtClassLoader)
:该类是ClassLoader的子类,主要加载JAVA_HOME/jre/lib/ext目录中的类库。应用类加载器(AppClassLoader)
:该类是ClassLoader的子类,主要用于加载classPath下的类,也就是加载开发者自己编写的Java类。自定义类加载器
:开发者自定义类继承ClassLoader,实现自定义类加载规则。
2.3 什么是双亲委派模型?
难易程度:☆☆☆☆
出现频率:☆☆☆☆
如果一个类加载器在接到加载类的请求时,它首先不会自己尝试去加载这个类,而是把这个请求任务委托给父类加载器去完成,依次递归,如果父类加载器可以完成类加载任务,就返回成功;只有父类加载器无法完成此加载任务时,才由下一级去加载。
2.4 JVM为什么采用双亲委派机制(作用)
难易程度:☆☆☆
出现频率:☆☆☆
- 保证类的唯一性:通过双亲委派机制可以避免某一个类被重复加载,当父类已经加载后则无需重复加载,保证唯一性。
- 保证安全性:为了安全,保证类库API不会被修改。例如,恶意代码无法自定义一个Java.lang.System类并加载到IM中,因为这个请求会被委托给启动类加载器,而启动类加载器只会加载标准的Java库中的类。
2.5 说一下类装载的执行过程
- 加载:查找和导入class文件
- 通过类的全名,获取类的二进制数据流。
- 解析类的二进制数据流为方法区内的数据结构(Java类模型)
- 创建java.lang.Class类的实例,表示该类型。作为方法区这个类的各种数据的访问入口
- 验证:保证加载类的准确性
- 格式检查:文件格式是否错误、语法是否错误、字节码是否合规
- 文件格式验证
- 元数据验证
- 字节码验证
- 符号引用验证:Class文件在其常量池中通过字符串记录自己将要使用的其它类或者方法,检查它们是否存在
- 格式检查:文件格式是否错误、语法是否错误、字节码是否合规
- 准备:为类变量分配内存并设置类变量初始值
- static变量,分配空间在准备阶段完成(设置默认值),赋值在初始化阶段完成
- static变量是final的基本类型,以及字符串常量,值已确定,赋值在准备阶段完成
- static变量是final的引用类型,那么赋值也会在初始化阶段完成
- 解析:把类中的符号引用转换为直接引用
- 比如:方法中调用了其他方法,方法名可以理解为符号引用,而直接引用就是使用指针直接指向方法。
- 初始化:对类的静态变量,静态代码块执行初始化操作
- 如果初始化一个类的时候,其父类尚未初始化,则优先初始化其父类。
- 如果同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行。
- 使用:JVM 从入口方法开始执行用户的程序代码
- 调用静态类成员信息(比如:静态字段、静态方法)
- 使用new关键字为其创建对象实例
- 卸载:当用户程序代码执行完毕后,JVM 便开始销毁创建的 Class 对象
- 最后负责运行的 JVM 也退出内存
3. 垃圾回收
垃圾回收(Garbage Collection,Gc)是自动管理内存的一种机制,它负责自动释放不再被程序引用的对象所占用的内存,这种机制减少了内存泄漏和内存管理错误的可能性。
3.1 对象什么时候可以被垃圾器回收
如果一个或多个对象没有任何的引用指向它了,那么这个对象现在就是垃圾,如果定位了垃圾,则有可能会被垃圾回收器回收。
如果要定位什么是垃圾,有两种方式来确定,第一个是引用计数法,第二个是可达性分析算法。
- 引用计数
- 原理: 为每个对象分配一个引用计数器,每当有一个地方引用它时,计数器加1;当引用失效时,计数器减1。当计数器为0时,表示对象不再被任何变量引用,可以被回收。
- 缺点: 不能解决循环引用的问题,即两个对象相互引用,但不再被其他任何对象引用,这时引用计数器不会为0,导致对象无法被回收。
- 可达性分析算法
- 原理: 从一组称为GC Roots(垃圾收集根)的对象出发,向下追溯它们引用的对象,以及这些对象用的其他对象,以此类推。如果一个对象到GC Roots没有任何引用链相连(即从GC Roots到这个对不可达),那么这个对象就被认为是不可达的,可以被回收。
- GC Roots对象包括: 虚拟机栈(栈帧的本地变量表)中引用的对象、方法区中类静态属性引用的对象、本地方法栈中JNI (Java Native Interface)引用的对象、活跃线程的引用等。
3.2 VM 垃圾回收算法有哪些?
难易程度:☆☆☆
出现频率:☆☆☆☆
3.2.1 标记清除算法
标记清除算法,是将垃圾回收分为2个阶段,分别是标记和清除。
- 根据可达性分析算法得出的垃圾进行标记
- 对这些标记为可回收的内容进行垃圾回收
标记清除算法也是有缺点的:通过标记清除算法清理出来的内存,碎片化较为严重,因为被回收的对象可能存在于内存的各个角落,所以清理出来的内存是不连贯的。
3.2.2 标记整理算法
标记压缩算法是在标记清除算法的基础之上,做了优化改进的算法。和标记清除算法一样,也是从根节点开始,对对象的引用进行标记,在清理阶段,并不是简单的直接清理可回收对象,而是将存活对象都向内存另一端移动,然后清理边界以外的垃圾,从而解决了碎片化的问题。
优缺点同标记清除算法,解决了标记清除算法的碎片化的问题,同时,标记压缩算法多了一步,对象移动内存位置的步骤,其效率也有有一定的影响。
3.2.3 复制算法
将原有的内存空间一分为二,每次只用其中的一块,在垃圾回收时,将正在使用的对象复制到另一个内存空间中,然后将该内存空间清空,交换两个内存的角色,完成垃圾的回收。
如果内存中的垃圾对象较多,需要复制的对象就较少,这种情况下适合使用该方式并且效率比较高,反之,则不适合。 缺点:内存利用率不足。
3.3 分代回收算法
堆被分为了两份:新生代和老年代【1:2】
分代回收是将内存划分成了新生代和老年代。分配的依据是对象的生存周期,或者说经历过的 GC 次数。对象创建时,一般在新生代申请内存,当经历一次 GC之后如果对还存活,那么对象的年龄 +1。当年龄超过一定值(默认是 15)后,如果对象还存活,那么该对象会进入老年代。
MinorGC、 Mixed GC 、 FullGC的区别是什么
- MinorGC【young GC】
- 发生在新生代的垃圾回收
- 当 Eden 区空间不足时,JVM 触发依次Minor GC,将Eden区和一个Survivor区中的存活对象移动到另一个Survivor区或老年区。
- 频率高,暂停时间短(STW)
- Mixed GC
- 新生代 + 老年代部分区域的垃圾回收,G1 收集器特有
- FullGC
- 新生代 + 老年代完整垃圾回收
- 暂停时间长(STW),应尽力避免
STW(Stop-The-World)
:暂停所有应用程序线程,等待垃圾回收的完成
3.4 说一下 JVM 有哪些垃圾回收器?
难易程度:☆☆☆☆
出现频率:☆☆☆☆
在jvm中,实现了多种垃圾收集器,包括:
- 串行垃圾收集器
- 并行垃圾收集器
- CMS(并发)垃圾收集器
- G1垃圾收集器
3.4.1 串行垃圾收集器
Serial
和 Serial Old
串行垃圾收集器,是指使用单线程进行垃圾回收,堆内存较小,适合个人电脑
- Serial 作用于新生代,采用复制算法
- Serial Old 作用于老年代,采用标记-整理算法
- 垃圾回收时,只有一个线程在工作,并且java应用中的所有线程都要暂停(STW),等待垃圾回收的完成。
- 优点是简单高效
3.4.2 并行垃圾收集器
Parallel New
和 Parallel Old
是一个并行垃圾回收器,JDK8默认使用此垃圾回收器
- Parallel New作用于新生代,采用复制算法
- Parallel Old作用于老年代,采用标记-整理算法
- 垃圾回收时,多个线程在工作,并且java应用中的所有线程都要暂停(STW),等待垃圾回收的完成。
3.4.3 CMS(并发)垃圾收集器
CMS全称 Concurrent Mark Sweep
,是一款并发的、使用标记-清除算法的垃圾回收器,该回收器是针对老年代垃圾回收的,是一款以获取最短回收停顿时间为目标的收集器,停顿时间短,用户体验就好。其最大特点是在进行垃圾回收时,应用仍然能正常运行。
3.4.4 G1垃圾回收器
- 应用于新生代和老年代,在JDK9之后默认使用G1
- 划分成多个区域(弱化了分代的概念),每个区域都可以充当 eden,survivor,old, humongous,其中 humongous 专为大对象准备
- 采用复制算法
- 响应时间与吞吐量兼顾
- 分成三个阶段:新生代回收、并发标记、混合收集
- 如果并发失败(即回收速度赶不上创建新对象速度),会触发 Full GC
3.5 强引用、软引用、弱引用、虚引用的区别?
难易程度:☆☆☆☆
出现频率:☆☆☆
- 强引用: 只要所有 GC Roots 能找到,就不会被回收
- 软引用: 需要配合SoftReference使用,当垃圾多次回收,内存依然不够的时候会回收软引用对象
- 弱引用: 需要配合WeakReference使用,只要进行了垃圾回收,就会把弱引用对象回收
- 虚引用: 必须配合引用队列使用,被引用对象回收时,会将虚引用入队,由 Reference Handler 线程调用虚引用相关方法释放直接内存
4. JVM 实践
4.1 JVM 调优的参数都有哪些?
通常在linux系统下直接加参数启动springboot项目
nohup java -Xms512m -Xmx1024m -jar xxxx.jar --spring.profiles.active=prod &
nohup : 用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行
参数 & :让命令在后台执行,终端退出后命令仍旧执行。
1)设置堆的初始大小和最大大小,为了防止垃圾收集器在初始大小、最大大小之间收缩堆而产生额外的时间,通常把最大、初始大小设置为相同的值。
-Xms:设置堆的初始化大小
-Xmx:设置堆的最大大小
2)设置虚拟机栈的位置
3)年轻代中 Eden 区和两个 Survivor 区的大小比例
4)设置垃圾回收器
4.2 java内存泄露的排查思路?
第一,可以通过jmap指定打印他的内存快照 dump文件,不过有的情况打印不了,我们会设置vm参数让程序自动生成dump文件
第二,可以通过工具去分析 dump文件,jdk自带的VisualVM就可以分析
第三,通过查看堆信息的情况,可以大概定位内存溢出是哪行代码出了问题
第四,找到对应的代码,通过阅读上下文的情况,进行修复即可
4.3 服务器CPU持续飙高,你的排查方案与思路?
第一可以使用使用 top
命令查看占用cpu的情况
第二通过top命令查看后,可以查看是哪一个进程占用cpu较高,记录这个 进程id
第三可以通过ps 查看当前进程中的 线程信息
,看看哪个线程的cpu占用较高
第四可以jstack命令打印进行的id,找到这个线程,就可以进一步定位问题代码的行号
相关文章:
【Java 面试 八股文】JVM 虚拟机篇
JVM 虚拟机篇 1. JVM组成1.1 JVM由那些部分组成,运行流程是什么?1.2 什么是程序计数器?1.3 你能给我详细的介绍Java堆吗?1.4 Java 虚拟机栈1.4.1 Java Virtual machine Stacks (java 虚拟机栈)1.4.2 栈和堆的区别1.4.3 垃圾回收是否涉及栈内…...
达梦数据库学习笔记@1
目录 达梦数据库学习笔记一、表空间管理(一)默认表空间(二)相关数据字典(三)表空间操作(四)临时表空间管理 二、重做日志管理(一)系统视图(二&…...
条款23:宁以non-member、non-friend替换member函数
1.使用场景举例 网络浏览器类 当然这一功能也可以由一个non-menber函数(更好的封装,本条款的核心立意)提供: 面向对象守则要求数据应该尽可能的被封装,然而与直观相反地,member函数clearEverything带来的封…...
代码审计初探
学会了基础的代码审计后,就该提高一下了,学一下一些框架的php代码审计 先从一些小众的、已知存在漏洞的cms入手 phpems php的一款开源考试系统 源码下载 https://down.chinaz.com/soft/34597.htm 环境部署 windows审计,把相关文件放到phps…...
2025前端框架最新组件解析与实战技巧:Vue与React的革新之路
作者:飞天大河豚 引言 2025年的前端开发领域,Vue与React依然是开发者最青睐的框架。随着Vue 3的全面普及和React 18的持续优化,两大框架在组件化开发、性能优化、工程化支持等方面均有显著突破。本文将从最新组件特性、使用场景和编码技巧三…...
Eclipse自动排版快捷键“按了没有用”的解决办法
快捷键按了没有用,通常是因为该快捷键方式被其他软件占用了,即别的软件也设置了这个快捷键,导致你按了之后电脑不知道该响应哪个软件。 解决办法:1.将当前软件的这个快捷键改了;2.找到占用的那个软件,把那…...
小型字符级语言模型的改进方向和策略
小型字符级语言模型的改进方向和策略 一、回顾小型字符级语言模型的处理流程 前文我们已经从零开始构建了一个小型字符级语言模型,那么如何改进和完善我们的模型呢?有哪些改进的方向?我们先回顾一下模型的流程: 图1 小型字符级语言模型的处理流程 (1)核心模块交互过程:…...
请简述一下Prefab(预制体)的本质是什么?
在 Unity 中,Prefab(预制体)是一种非常重要的资产类型。 Prefab 本质上是一个可重复使用(开发者可以在场景中多次实例化同一个预制体)的游戏对象模板(预制体就像一个模板,对预制体本身的修改会…...
【开源项目】分布式文本多语言翻译存储平台
分布式文本多语言翻译存储平台 地址: Gitee:https://gitee.com/dreamPointer/zza-translation/blob/master/README.md 一、提供服务 分布式文本翻译服务,长文本翻译支持流式回调(todo)分布式文本多语言翻译结果存储服…...
使用GPU训练模型
1.说明 本地训练模型可以用CPU和GPU,但是GPU的性能比CPU要好得多,所以如果有独立显卡的,尽量还是用GPU来训练模型。 使用GPU需要安装Cuda和Cudnn 2.安装Cuda 安装cuda之前,首先看一下显卡支持的cuda版本,在命…...
DPVS-3: 双臂负载均衡测试
测试拓扑 双臂模式, 使用两个网卡,一个对外,一个对内。 Client host是物理机, RS host都是虚拟机。 LB host是物理机,两个CX5网卡分别在两个子网。 配置文件 用dpvs.conf.sample作为双臂配置文件,其中…...
Spring Security+JWT+Redis实现项目级前后端分离认证授权
1. 整体概述 权限管理包括用户身份认证和授权两部分,简称认证授权。对于需要访问控制到资源,用户首先经过身份认证,认证通过后用户具有该资源的访问权限方可访问。 1.1 认证概述 认证是确认用户身份的过程,确保用户是谁。 1.1.1 …...
马斯克宣布Grok语音模式正式上线:早期测试版本 可能有一些问题
快科技2月23日消息,据报道,马斯克旗下xAI团队近期动作频频,继2月18日直播发布Grok最新版本Grok3后,马斯克又在社交平台X上宣布,Grok语音模式早期测试版现已在Grok应用程序上线,并对其表现给予了高度评价。 …...
P9631 [ICPC 2020 Nanjing R] Just Another Game of Stones Solution
Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1,a2,⋯,an),有 m m m 个操作分两种: chmax ( l , r , k ) \operatorname{chmax}(l,r,k) chmax(l,r,k):对每个 i ∈ [ l , r ] i \in [l,r] i∈[l,…...
请求go构建缓存,go clean -cache
go clean -cache go 构建时会产生很多缓存, 一般是目录:/Users/xxx/Library/Caches/go-build 此目录README: This directory holds cached build artifacts from the Go build system. Run "go clean -cache" if the directory …...
安全面试4
文章目录 给的源码是ThinkPHP框架的话,审计起来和没有使用框架的有什么不同,从流程上或者从关注的点上有什么不同框架代码审计的流程无框架代码审计的流程 反序列的时候,unserialize()反序列一个字符串的时候,对象会有一些魔术方法…...
HTML之JavaScript DOM操作元素(1)
HTML之JavaScript DOM操作元素(1) 3.对元素进行操作1.操作元素的属性 元素名.属性名 ""2.操作元素的样式 元素.style.样式名 "" 样式名 "-" 要进行驼峰转换3.操作元素的文本 元素名.innerText 只识别文本元素名…...
SpringBoot+Vue+微信小程序的猫咖小程序平台(程序+论文+讲解+安装+调试+售后)
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统介绍 在当下这个高速发展的时代,网络科技正以令人惊叹的速度不断迭代更新。从 5G …...
【十一】Golang 指针
💢欢迎来到张胤尘的开源技术站 💥开源如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 指针指针定义指针初始化& 操作符new 函数初始…...
“conda”不是内部或外部命令,也不是可运行的程序或批处理文件
有的时候,我们发现在cmd黑框中输入conda时,cmd会显示“conda”不是内部或外部命令,也不是可运行的程序或批处理文件,那这时候该怎么解决呢? Step01:我们找到Anconda的安装目录。然后找到里面的bin文件夹&am…...
通过LM Studio本地私有化部署DeepSeek-R1模型,无网络也能用
打开LM Studio官网https://lmstudio.ai/ 选择适合自己的操作系统,下载LM Studio安装包 本地电脑安装成功后运行LM Studio,顶部文本框输入deepseek,点击搜索模型 在搜索结果中选择7B参数模型, 如上图右侧提示“No result found”说…...
GPU和FPGA的区别
GPU(Graphics Processing Unit,图形处理器)和 FPGA(Field-Programmable Gate Array,现场可编程门阵列)不是同一种硬件。 我的理解是,虽然都可以用于并行计算,但是GPU是纯计算的硬件…...
CMake管理依赖实战:多仓库的无缝集成
随着软件复杂度的增加,单个项目可能需要依赖多个外部库或模块。这些依赖项可能是来自不同的代码仓库,如ATest和BTest。为了实现高效的依赖管理,CMake提供了多种方式来处理这种多仓库的情况。下面我们将详细介绍几种常见的方法,并通…...
Windows系统第一次运行C语言程序,环境配置,软件安装等遇到的坑及解决方法
明确需要编辑器和编译器,并选择自己要用什么(我选的编辑器是VSCode:Visual Studio Code;编译器是gcc)下载VSCode并配置环境变量(这里没啥问题),安装C/C的拓展安装Cygwin,…...
2025最新版!Fiddler抓包实战:深度解析短视频评论采集技术
2025最新版!Fiddler抓包实战:深度解析短视频评论采集技术(脱敏) 声明: 本文仅供学习交流使用,请勿用于非法用途。 导语: 短视频数据采集又有新突破!你是否好奇如何安全、高效地获…...
Linux信号
目录 1. 信号的概念搞定(输出结论,支撑我们的理解) 补充知识 2.信号的产生 补充知识 3.信号的保存 4.阻塞信号 1. 信号其他相关常见概念 2. 在内核中的表示 3. sigset_t 4. 信号集操作函数 sigprocmask sigpending 5. 信号的…...
git,bash - 从一个远端git库只下载一个文件的方法
文章目录 git,bash - 从一个远端git库只下载一个文件的方法概述笔记写一个bash脚本来自动下载get_github_raw_file_from_url.shreanme_file.shfind_key_value.sh执行命令 END git,bash - 从一个远端git库只下载一个文件的方法 概述 github上有很多大佬上传了电子书库…...
深度学习(5)-卷积神经网络
我们将深入理解卷积神经网络的原理,以及它为什么在计算机视觉任务上如此成功。我们先来看一个简单的卷积神经网络示例,它用干对 MNIST数字进行分类。这个任务在第2章用密集连接网络做过,当时的测试精度约为 97.8%。虽然这个卷积神经网络很简单…...
flex布局自定义一行几栏,靠左对齐===grid布局
模板 <div class"content"><div class"item">1222</div><div class"item">1222</div><div class"item">1222</div><div class"item">1222</div><div class"…...
(五)趣学设计模式 之 建造者模式!
目录 一、 啥是建造者模式?二、 为什么要用建造者模式?三、 建造者模式怎么实现?四、 建造者模式的应用场景五、 建造者模式的优点和缺点六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方…...
【CentOS7】安装MinIO
下载rpm包 wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20230809233022.0.0.x86_64.rpm 安装 rpm -ivh minio-20230809233022.0.0.x86_64.rpm 运行 server 后面跟着的使minio 的数据目录;console-address 后面跟着的是minio 的管理…...
vLLM学习1
调用方式 一、vLLM 提供的两种调用方式 1. Offline Batched Inference(离线批处理) 调用特点:一次性传入一批(batch)的请求,等待所有请求都处理完毕后,一次性返回推理结果。对用户而言&#x…...
ABC 385
目录 C. Illuminate Buildings D. Santa Claus E. Snowflake Tree C. Illuminate Buildings dp[ i ][ j ]:选择的 i 个建筑,间隔为 j。这样只需要两层循环就可以了,o(n^2) 其实本质只是个一维 dp,但我还需…...
綫性與非綫性泛函分析與應用_1.例題(下)-半母本
第1章 實分析與函數論:快速回顧(下) 五、基數;有限集和無限集相關例題 例題1:集合基數的判斷 判斷集合和集合B=\{a,b,c,d,e\}的基數關係。 解析: 可以構造一個雙射,例如,,,,。 所以,兩個集合具有相同的基數。 例題2:可數集的證明 證明整數集是可數集。 解析: …...
49 set与map的模拟实现
目录 一、源码及框架分析 二、模拟实现map和set (一)复用红黑树的框架,并支持insert (二)支持迭代器的实现 (三)map支持 [ ] (四)整体代码实现 一、源码及框架分析…...
鸿蒙NEXT应用App测试-通用测试
注意:大家记得学完通用测试记得再学鸿蒙专项测试 https://blog.csdn.net/weixin_51166786/article/details/145768653 注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章…...
LangChain 技术入门指南:探索语言模型的无限可能
在当今的技术领域,LangChain 正逐渐崭露头角,成为开发语言模型应用的强大工具。如果你渴望深入了解并掌握这一技术,那么就跟随本文一起开启 LangChain 的入门之旅吧! (后续将持续输出关于LangChain的技术文章,有兴趣的同学可以关注…...
UE5销毁Actor,移动Actor,简单的空气墙的制作
1.销毁Actor 1.Actor中存在Destory()函数和Destoryed()函数 Destory()函数是成员函数,它会立即标记 Actor 为销毁状态,并且会从场景中移除该 Actor。它会触发生命周期中的销毁过程,调用 Destroy() 后,Actor 立即进入销毁过程。具体…...
STM32基础篇(二)------GPIO
GPIO简介 GPIO(General Purpose Input Output)通用输入输出口 可配置为8种输入输出模式 引脚电平:0V~3.3V,部分引脚可容忍5V 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等 输入…...
亲测Win11电脑可以安装LabVIEW的版本,及2015、2018、2020版本直接的区别
下面是我电脑的信息 设备名称 DESKTOP-04HHS8S 处理器 13th Gen Intel(R) Core(TM) i5-13500H 2.60 GHz 机带 RAM 16.0 GB (15.7 GB 可用) 设备 ID 82798104-C565-4167-A21E-5EB5DEFAA541 产品 ID 00331-20300-00000-AA678 系统类型 64 位操作系统, 基于 …...
Idea2024中搭建JavaFX开发环境并创建运行项目
Idea2024中搭建JavaFX开发环境并创建运行项目 本文以Java语言为例演示如何创建JavaFX开发项目和部署开发环境,读者可以根据个人实际灵活选择相关参数。 一、项目创建与环境搭建步骤 新建JavaFX项目,选择适合项目实际的语言、系统和JDK。 项目设置-设置…...
认知重构 | 自我分化 | 苏格拉底式提问
注:本文为 “认知重构 | 自我分化” 相关文章合辑。 心理学上有一个词叫:认知重构(改变 “非黑即白,一分为二” 的思维方式) 原创 心理师威叔 心理自救 2024 年 10 月 26 日 19:08 广东 你有没有过这样的时候&#x…...
MFC开发:如何创建第一个MFC应用程序
文章目录 一、概述二、MFC 的主要组件三、创建一个MFC窗口四、控件绑定消息函数 一、概述 MFC 是微软提供的一个 C 类库,用于简化 Windows 应用程序的开发。它封装了 Windows API,提供面向对象的接口,帮助开发者更高效地创建图形用户界面&am…...
nodejs:vue 3 + vite 作为前端,将 html 填入<iframe>,在线查询英汉词典
向 doubao.com/chat/ 提问: node.js js-mdict 作为后端,vue 3 vite 作为前端,编写在线查询英汉词典 后端部分(express js-mdict ) 详见上一篇:nodejs:express js-mdict 作为后端ÿ…...
基于 Python Django 的校园互助平台(附源码,文档)
博主介绍:✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不…...
玩转 Java 与 Python 交互,JEP 库来助力
文章目录 玩转 Java 与 Python 交互,JEP 库来助力一、背景介绍二、JEP 库是什么?三、如何安装 JEP 库?四、JEP 库的简单使用方法五、JEP 库的实际应用场景场景 1:数据处理场景 2:机器学习场景 3:科学计算场…...
【Linux】基于UDP/TCP服务器与客户端的实现
目录 一、UDP (一)Server.hpp (二)Server.cpp (三)Client.hpp (四)Client.cpp (五)User.hpp 二、TCP (一)多进程版本的服务器与…...
Unity for Python —— 强大的 Python 脚本支持提升 Unity 编辑器效率
内容将会持续更新,有错误的地方欢迎指正,谢谢! Unity for Python —— 强大的 Python 脚本支持提升 Unity 编辑器效率 TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 —— 不断努力,不断进步,不断探索 Tec…...
【Dubbo+Zookeeper】——SpringBoot+Dubbo+Zookeeper知识整合
🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL࿰…...
家用路由器的WAN口和LAN口有什么区别
今时今日,移动终端盛行的时代,WIFI可以说是家家户户都有使用到的网络接入方式。那么路由器当然也就是家家户户都不可或缺的设备了。而路由器上的两个实现网络连接的基础接口 ——WAN 口和 LAN 口,到底有什么区别?它们的功能和作用…...