当前位置: 首页 > news >正文

理解JVM

JVM简介

JVM Java Virtual Machine 的简称,意为 Java 虚拟机
虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统
常见的虚拟机: JVM VMwave Virtual Box
JVM 和其他两个虚拟机的区别:
1. VMwave VirtualBox 是通过软件模拟物理 CPU 的指令集,物理系统中会有很多的寄存器
2. JVM 则是通过软件模拟 Java 字节码的指令集, JVM 中只是主要保留了 PC寄存器,其他的寄存器都进行了裁剪
JVM 是一台被定制过的现实当中不存在的计算机

1)内存区域划分

执行流程

程序在执行之前先要把 java 代码转换成字节码( class 文件), JVM 首先需要把字节码通过一定的方式类加载器( ClassLoader 把文件加载到内存中 运行时数据区( Runtime Data Area ,而字节码文件是 JVM 的一套指令集规范,并不能直接交个底层操作系统去执行,因此需要特定的命令解析器 行引擎( Execution Engine 将字节码翻译成底层系统指令再交由 CPU去执行,而这个过程中需要调用其他语言的接口 本地库接口( Native Interface 来实现整个程序的功能,这就是这 4个主要组成部分的职责与功能
总结来看, JVM 主要通过分为以下 4 个部分,来执行 Java 程序的,它们分别是:
1. 类加载器( ClassLoader
2. 运行时数据区( Runtime Data Area
3. 执行引擎( Execution Engine
4. 本地库接口(Native Interface)

运行时数据区

一个运行起来的Java进程,就是一个JVM虚拟机,需要从内存中申请一块内存

JVM 运行时数据区域也叫内存布局,但需要注意的是它和 Java 内存模型( (Java Memory Model,简称JMM )完全不同,属于完全不同的两个概念,它由以下 5 大部分组成:

方法区(1.7及以前)/元数据区(1.8开始)

存储类对象(类信息、常量、静态变量,及、即编译器编译后的数据

.class文件加载到内存后

运行时常量池

运行时常量池是方法区的一部分,存放字面量与符号引用
字面量 : 字符串 (JDK 8 移动到堆中 ) final 常量、基本数据类型的值
符号引用 : 类和结构的完全限定名、字段的名称和描述符、方法的名称和描述
存储代码中 new 的对象(占据内存最大的区域)
存储代码执行过程中,方法之间的调用关系
每个元素,称为一个“栈帧”
每个栈帧,代表了一个方法调用
栈帧里包含了方法的入口,方法返回的位置,方法的形参,方法的返回值,局部变量...

程序计数器

一块比较小的空间,主要用来存放一个“地址”,表示下一条要执行的指令在内存中的哪个地方(方法区里,每个方法里面的指令,都是以二进制的形式保存到对应类对象里)

class Test{

     public void a(){}

     public void b(){}

}

方法a 和方法b会被编译成二进制指令,放到 .class 文件中

执行类加载的时候,就把 .class 文件里的内容,加载起来,放到类对象中

刚开始调用方法,程序计数器,记录的就是方法的入口的地址

随着一条一条的执行指令,每执行一条,程序计数器的值都会自动更新去指向下一条指令

如果当前线程正在执行的是一个 Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址; 如果正在执行的是一个 Native 方法,这个计数器值为空

本地方法栈

指的是使用 native 关键字修饰的方法

这个方法不用Java实现,而是在JVM内部通过C++代码实现的

JVM内部的C++代码的调用关系

总结:

1)虚拟机栈,程序计数器,本地方法栈,都是每个线程都有一份

2)堆区,元数据区,在JVM进程中只有一份

一个JVM进程,可能有多个线程

每个线程,有自己的 程序计数器 和 栈空间,这些线程共用一份 堆 和 方法区

可以说是,每个线程都有自己的私有空间

1)堆  存放new出来的对象

2)方法区/元数据区 存放类对象(类加载后存放的位置)

3)栈 存放方法之间的调用关系

4)程序计数器 存放每个线程,下一条要执行的指令的地址

1)2)整个Java进程共用一份         3)4)每个线程都有自己的一份

常见问题

class Test{

   public int n = 100;

   public static int a = 10;

}

void main(){

    Test t = new Test();

}                                                  n,a,t ,new Test() 处于哪个区域

Test t = new Test();

t这个变量是一个引用类型的变量,存储的是一个对象的地址,不是对象本身

new出来的对象在堆上,同时有创建了一个局部变量 Test t (引用类型的变量),把地址存到 t 里 

一个变量处于哪个区域,和变量的形态密切相关

局部变量  处于 栈 上

成员变量  处于 堆 上

静态变量(类属性)  处于  元数据区/方法区 里

2)类加载的过程

基本流程

java代码会被编译成.class文件(包含一些字节码),java程序要想运行起来,需要让JVM读取到这些.class文件,并把里面的内容构造成类对象,保存到内存的方法去中

“执行代码”就是调用方法,需要先知道每个方法,编译后生成的指令都是什么

官方文档把类加载的过程,主要分成了五个步骤(三个步骤):

1. 加载
2. 连接 (1.验证  2.准备  3. 解析)
3. 初始化
1)加载
找到.class文件,打开文件,读取文件内容
往往代码中,会给定某个类的“全限定类名”,例如
java.lang.String  java.util.ArrayList  ...
JVM会根据这个类名,在一些指定的目录范围内查找
加载 Loading )阶段是整个 类加载 Class Loading )过程中的一个阶段,它和类加载 Class Loading 是不同的,一个是加载 Loading 另一个是类加载 Class Loading ,所以不要把二者搞混了
在加载 Loading 阶段, Java 虚拟机需要完成以下三件事情:
1 )通过一个类的全限定名来获取定义此类的二进制字节流
2 )将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
3 )在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据的访问入口

2)验证

验证是连接阶段的第一步

.class文件是一个二进制的格式(某个字节具有特定的含义),需要验证当前读取的这个格式是否符合要求

3)准备

给类对象分配内存空间(最终目标是构造出类对象)

此处只是分配内存空间,并没有进行初始化,这个空间上的内存的值全都是0值

(此时类的 static 成员全是0值)

4)解析

针对类对象中包含的字符串常量进行处理,进行一些初始化操作

java代码中用到的字符串常量,在编译之后,也会进入到.class文件中

解析阶段是 Java 虚拟机将常量池内的符号引用替换为直接引用的过程,也就是初始化常量的过程

final String s = "hello";

此时,.class文件的二进制指令中,会有一个 s 这样的引用被创建出来

由于引用本质上保存的是一个变量的地址,在.class文件中(文件中不涉及到内存地址)

因此,在.class文件中,s 的初始化语句,就会先被设置成一个“文件的偏移量”,通过偏移量,就能找到“hello”这个字符串所在的位置

当这个类真正被加载到内存中的时候,再把这个偏移量,替换回真正的内存地址

在.class文件中会有一条指令,这条指令就描述了 String s = @100(偏移量)

“hello”字符串距离文件开头的长度是100字节

把字符串的真实地址,替换成文件偏移量的过程,就是“解析阶段”的主要工作

也叫做,把“符号引用”(文件偏移量)替换成“直接引用”(内存地址)

5)初始化

初始化阶段, Java 虚拟机真正开始执行类中编写的 Java 程序代码,将主导权移交给应用程序。初始化阶段就是执行类构造器方法的过程
针对类对象进行初始化,把类对象中需要的属性设置好——>
初始化static成员,执行静态代码块,加载父类...

双亲委派模型

站在 Java 虚拟机的角度来看,只存在两种不同的类加载器:一种是启动类加载器( Bootstrap
ClassLoader ),这个类加载器使用 C++ 语言实现,是虚拟机自身的一部分;另外一种就是其他所有的类加载器,这些类加载器都由 Java 语言实现,独立存在于虚拟机外部,并且全都继承自抽象类
java.lang.ClassLoader
属于类加载中,第一个步骤    “加载”过程中的一个环节
如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最 终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无 法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去完成加载
此处 “父子” 关系,不是继承关系
这几个 ClassLoader 里面有一个 parent 属性,指向了一个 “父加载器”

类加载器,JVM内置了三个类加载器:

1) BootStrap ClassLoader

负责的是标准库的目录

2) Extension ClassLoader

负责的是JDK中一些扩展的库

3) Application ClassLoader

负责的是搜索项目当前目录和第三方库对应目录

程序员也可以自己手动创造新的类加载器

类加载的过程(找.class文件的过程):

1)给定一个类的全限定类名,例如 java.lang.String

2)从 Application ClassLoader 作为入口,开始执行查找的逻辑

3)Application ClassLoader ,不会立即去扫描自己负责的目录,而是把查找的任务,交给它的父加载器 Extension ClassLoader

4)Extension ClassLoader,也不会立即扫描自己负责的目录,而是把查找的任务,交给它的父加载器 BootStrap ClassLoader

5)BootStrap ClassLoader,也不会立即扫描自己负责的目录,也想把它交给自己的父加载器,结果发现它自己没有父加载器。因此,BootStrap ClassLoader只能扫描自己负责的目录

6)没有扫描到,就会回到 Extension ClassLoader,Extension ClassLoader就会扫描自己负责的目录。如果找到,就执行后续的类加载操作,此时查找过程结束;如果没找到,把任务交给 Application ClassLoader 执行

7)没有扫描到,就会返回到 Application ClassLoader,Application ClassLoader 会扫描自己负责的目录。如果找到,就执行后续的类加载操作;如果没找到,就会抛出一个 ClassNotFoundException

双亲委派模型,就是一个 查找优先级 问题——>

确保 标准库的类,被加载的优先级最高,其次是 扩展库,其次是 自己写的库和第三方库

(若自己实现了一个 java.lang.String,JVM加载的是标准库的类)

双亲委派模型的打破:

如果自己编写一个类加载器,就不一定要遵循上述的流程

例如Tomcat里,加载 webapp 时用的就是自定义的类加载器

只能在 webapp 指定的目录中查找,找不到就直接抛异常(不会去标准库中查找) 

优点 

1. 避免重复加载类:比如 A 类和 B 类都有一个父类 C 类,那么当 A 启动时就会将 C 类加载起来,那么在 B 类进行加载时就不需要在重复加载 C 类了
2. 安全性:使用双亲委派模型也可以保证了 Java 的核心 API 不被篡改,如果没有使用双亲委派模
型,而是每个类加载器加载自己的话就会出现一些问题,比如我们编写一个称为 java.lang.Object
类的话,那么程序运行的时候,系统就会出现多个不同的 Object 类,而有些 Object 类又是用户
自己提供的因此安全性就不能得到保证了

3)垃圾回收机制

对于程序计数器、虚拟机栈、本地方法栈这三部分区域而言,其生命周期与相关线程有关,随线程而生,随线程而灭。并且这三个区域的内存分配与回收具有确定性,因为当方法结束或者线程结束时,内存就自然跟着线程回收了。因此此处所讲的有关内存分配和回收关注的为 Java 方法区 这两个区域
Java 中,所有的对象都是要存在内存中的(也可以说内存中存储的是一个个对象),因此我们将内存回收,也可以叫做死亡对象的回收
GC => 垃圾回收
GC回收的目标,是内存中的对象
对于Java来说,就是new出来的对象
栈里的局部变量,是跟着栈帧的生命周期走的(方法执行结束,栈帧销毁,内存释放)
静态变量,生命周期就是整个程序,始终存在,意味着静态变量是无需释放的
真正要需要GC释放的 上的对象

垃圾的判断算法

在GC中,有如下两个主流的方案:

1. 引用计数(Python,PHP)

new出来的对象,单独安排一块空间,来保存一个计数器

{

    Test t = new Test();

    Test t2 = t1;

}

出{}之后,t1和t2就销毁了,引用计数就为0了 

保存引用计数,描述有这个对象有几个引用指向它

在Java中,使用对象,必须依靠引用

如果一个对象,没有使用引用指向,就可以视为 垃圾 了(引用计数为0)

缺点:

1)比较浪费内存

如果对象很小,计数器占据的空间就难以忽视了

2)存在“循环引用”问题

class Test{

     public Test t;

}

Test a = new Test();

Test b = new Test();

a.t = b;

b.t = a;

a = null;

b = null;

此时,a 和 b两个引用已经销毁了

new出来的两个对象,无法被其他的代码访问到,但是它们的引用计数不是0,所以不能被回收 

此时,第一个对象,引用了第二个对象;第二个对象,引用了第一个对象——>类似死锁

2. 可达性分析

本质上是时间换空间

有一个/一组线程,周期性的扫描代码中的对象

从一些特定的对象出发,尽可能的进行访问的遍历,把所有能访问到的对象,都标记成“可达”;反之,经扫描后,未被标记到的对象,就是 垃圾

此处的遍历大概率是N叉树,看访问的某个对象,里面有多少个引用类型的成员,针对每个引用类型的成员都需要进行进一步的便利

此处的可达性分析都是周期性的——>可达性分析比较消耗系统资源,开销比较大  

垃圾回收算法

三种基本思路

1)标记清除

总的空闲空间是 2MB,但是申请空间时,只能申请 <= 1MB的空间

把对应的对象,直接释放掉——>会产生很多“碎片”

释放内存,目的是让别的代码能够申请

申请内存,都是申请到“连续”的内存

2)复制算法

把内存分成两份,一次只用其中的一半

通过复制的方式,把有效对象归类到一起,再统一释放剩下的空间

这个方案可以解决内存碎片的问题,但缺点依然很明显:

1. 内存要浪费一半,利用率不高

2. 如果有效对象很多,拷贝开销很大

3)标记整理

既能解决内存碎片的问题,又能处理重复算法中利用率问题 

类似于顺序表删除元素的搬运操作——>搬运的开销依然很大

具体实现

伊甸区 存放刚 new 出来的对象

经验规律:从对象诞生开始,到第一轮可达性分析的过程中,虽然时间不长(往往就是毫秒—秒),但是,在这个时间段内,大部分的对象都会变成垃圾 

1)伊甸区—>幸存区  复制算法

每一轮GC扫描之后,都会把有效对象复制到幸存区中,伊甸区就可以整个释放了

由于经验规律,真正需要复制的对象不多,非常适合复制算法

幸存区 分成大小相等的两块,每次只用一块(复制算法的体现)

2)GC扫描线程也会扫描幸存区,会把活过GC扫描的对象(扫描过程中可达)拷贝到幸存区的另一个部分

幸存区之间的拷贝,每一轮会拷贝多个对象,每一轮也会淘汰多个对象(有些对象随着时间的推移,就成垃圾了)

3)当这个对象已经在幸存区存活过很多轮GC扫描后,JVM就认为这个对象,短时间内应该是释放不掉了,就会把这个对象拷贝到 老年代

4)进入老年代的对象,也会被GC扫描,但是频率会比新生代低得多——>减少GC扫描的开销

经验规律,新生代的对象更容易成为垃圾,老年代的对象更容易存活

分代回收——> 对象活过的GC扫描越多,就越老
新生代,主要使用 复制算法
老年代,主要使用 标记整理
分代回收,是JVM中主要的回收的思想方法
但是在垃圾回收具体实现的时候,可能会有一些调整和优化

相关文章:

理解JVM

JVM简介 JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java 虚拟机 虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统 常见的虚拟机&#xff1a; JVM 、 VMwave 、 Virtual Box JVM 和其他两个虚拟机的区别&#xff1a; 1…...

GhostRace: Exploiting and Mitigating Speculative Race Conditions-记录

文章目录 论文背景Spectre-PHT&#xff08;Transient Execution &#xff09;Concurrency BugsSRC/SCUAF和实验条件 流程Creating an Unbounded UAF WindowCrafting Speculative Race ConditionsExploiting Speculative Race Conditions poc修复flush and reload 论文 https:/…...

【环境搭建】使用IDEA远程调试Dolphinscheduler

以Dolphinscheduler-3.1.8为例&#xff0c;先把容器起了&#xff1a; $ docker pull apache/dolphinscheduler-standalone-server:3.1.8 $ docker run -d -p 12345:12345 -p 25333:25333 -p 5005:5005 -d apache/dolphinscheduler-standalone-server:3.1.8下载Dolphinschedule…...

强基计划之编程:开启科研精英培养新路径

强基计划之编程&#xff1a;开启科研精英培养新路径 一、强基计划概述 1. 出台背景 在 2003 年&#xff0c;教育部开启高校自主招生改革&#xff0c;于探索综合评价学生、破除招生“唯分数论”等方面收获一定成效。相关调查研究显示&#xff0c;自主招生所录取的学生在入校后…...

奇怪问题| Chrome 访问csdn 创作中心的时候报错: 服务超时,请稍后重试

Chrome 访问csdn 创作中心的时候报错&#xff1a; 服务超时,请稍后重试用无痕浏览器可以正常访问 关闭代理无效清缓存和Cookies无效。考虑无痕浏览器模式下插件不生效&#xff0c;尝试把chrome 插件也禁用&#xff0c;发现有效&#xff0c;是该扩展程序的缘故...

Spring Boot 教程之三十六:实现身份验证

如何在 Spring Boot 中实现简单的身份验证&#xff1f; 在本文中&#xff0c;我们将学习如何使用 Spring设置和配置基本身份验证。身份验证是任何类型的安全性中的主要步骤之一。Spring 提供依赖项&#xff0c;即Spring Security&#xff0c;可帮助在 API 上建立身份验证。有很…...

设计模式中单例模式中懒汉模式的问题

设计模式中单例模式中懒汉模式的问题 今天在项目中遇到了要使用懒汉模式的问题。百度之后&#xff0c;发现还有很多细节是自己之前没有见过的。于是记录一下。下面是在AI助手中的说明。 单例模式的懒汉模式&#xff08;Lazy Singleton&#xff09;是在需要时才创建实例&#…...

【唐叔学算法】第18天:解密选择排序的双重魅力-直接选择排序与堆排序的Java实现及性能剖析

引言 在数据排序的世界里&#xff0c;选择排序是一类简单而直观的算法&#xff0c;它通过不断选取未排序部分中的最小&#xff08;或最大&#xff09;元素来逐步构建有序序列。今天&#xff0c;我们将深入探讨两种基于选择思想的排序方法——直接选择排序和堆排序&#xff0c;…...

力扣48.旋转图像

文章目录 一、前言二、原地旋转 一、前言 力扣48.旋转图像 这道题要求把给定矩阵旋转90度&#xff0c;并且不允许使用额外矩阵来完成旋转图像。 于是这道题只能使用原地旋转的方法来解决 二、原地旋转 对于一个N3的矩阵来说&#xff0c;只需要两次循环就可以完成了 将A1放到…...

jdk1.8新特性、jvm内存结构、垃圾回收

一、JDK 1.8 也被称为 Java 8&#xff0c;有许多重要的新特性&#xff1a; 1、Lambda 表达式: 它允许把函数作为一个方法的参数&#xff08;函数作为值传递&#xff09;&#xff0c;可以用更紧凑的方式来表示匿名内部类了例如&#xff1a; new Thread(new Runnable() {Overr…...

MFC/C++学习系列之简单记录13

MFC/C学习系列之简单记录13 前言memsetList Control代码注意 总结 前言 今天记录一下memset和List control 的使用吧&#xff01; memset memset通常在初始化变量或清空内存区域的时候使用&#xff0c;可以对变量设定特定的值。 使用&#xff1a; 头文件&#xff1a; C&#…...

RabbitMQ中的Topic模式

在现代分布式系统中&#xff0c;消息队列&#xff08;Message Queue&#xff09;是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个广泛使用的开源消息代理&#xff0c;支持多种消息传递模式&#xff0c;其中 Topic 模式 是一种灵活且强大的模式&#xff0c;允许生产者…...

苹果手机怎么清理空间:拯救你的拥挤手机

在数字生活的海洋中&#xff0c;我们的苹果手机就像一艘小船&#xff0c;载满了照片、应用、视频和各种下载的“宝贝”。随着时间的推移&#xff0c;这艘小船开始变得拥挤&#xff0c;航行速度放缓&#xff0c;甚至有时候直接卡壳。苹果手机怎么清理空间&#xff1f;是时候学会…...

实习冲刺数据库练习-01 基础查询

原题链接&#xff1a;牛客网在线编程_SQL篇_非技术快速入门 数据表示例&#xff1a; 根据数据表示例要求我们完成以下查询&#xff1a; &#xff08;1&#xff09;获取用户信息表中所有的数据&#xff0c;请你取出相应结果 &#xff08;2&#xff09;获取用户的设备id对应的…...

GAN网络详解及涨点大全总结(源码)

(需要源码请私信或评论) GAN原理 GAN的基本原理建立在 生成模型和判别模型的博弈过程 上。这种独特的机制使得GAN能够在复杂的分布上实现高效的无监督学习。在这个过程中,生成器G和判别器D相互竞争,最终达到一种平衡状态,在此状态下,G能够产生高质量的合成样本,而D则无…...

前端关于pptxgen.js个人使用介绍

官方文档链接:Quick Start Guide | PptxGenJS git地址&#xff1a;https://github.com/gitbrent/PptxGenJS/ 1. 安装命令 npm install pptxgenjs --save yarn add pptxgenjs 2. 示例demo import pptxgen from "pptxgenjs"; // 引入pptxgen // 1. Create a Presenta…...

Webrtc音频模块(四) 音频采集

音频的采集还是封装在AudioDeviceWindowsCore中&#xff0c;相关的Core Audio API接口是下面几个&#xff1a; IAudioClient* _ptrClientIn IAudioCaptureClient* _ptrCaptureClient rtc::scoped_refptr<IMediaObject> _dmo rtc::scoped_refptr<IMediaBuffer> _me…...

乘积小于K的子数组

要解决“乘积小于 k 的子数组”问题&#xff0c;可以使用滑动窗口技术。下面是详细的步骤和思路&#xff1a; 初始化变量&#xff1a; 定义两个指针 left 和 right&#xff0c;都初始化为 0&#xff0c;用于表示窗口的左右边界。一个 product 变量初始化为 1&#xff0c;用于存…...

vue的ElMessage的css样式不生效

我使用elementplus&#xff0c;是使用的用哪个单独引入的&#xff0c;然后表单校验时候警告的css不生效&#xff0c;就是这个效果 反复看视频的引入也没发现问题&#xff0c;后来才知道需要这个引入 import { ElMessage } from "element-plus"; import element-pl…...

视频会议系统如何对接电话会议系统?

视频会议系统如何对接电话会议系统&#xff1f; 作者&#xff1a;开源视频会议系统BigBlueButton&BBBEasy中国区团队&#xff0c;Github地址&#xff1a;https://github.com/lihaiya/bigbluebutton 视频会议系统与电话会议系统的对接&#xff0c;是现代企业通信整合的重要…...

亚马逊API接口深度解析:如何高效获取商品详情与评论数据

在当今数字化时代&#xff0c;电商平台的数据对于商家和开发者来说至关重要。亚马逊作为全球领先的电商平台&#xff0c;其API接口为开发者提供了丰富的商品信息和评论数据。本文将深入探讨如何使用亚马逊API接口获取商品详情和商品评论&#xff0c;同时提供简洁明了的使用方法…...

1222面经

1&#xff0c;Kafka 如何保障顺序消费? Kafka 保障顺序消费主要通过以下几个关键机制和配置来实现&#xff1a; 分区策略 Kafka 将主题划分为多个分区&#xff0c;每个分区内的消息是天然有序的&#xff0c;其按照消息发送到分区的先后顺序进行存储和追加。生产者在发送消息…...

271-基于XC7V690T的12路光纤PCIe接口卡

一、板卡概述 基于XC7V690T的12路光纤PCI-E接口卡&#xff0c;用于实现多通道高速光纤数据接收和发送&#xff0c;板卡兼容PCIe 2.0和PCIe 3.0规范&#xff0c;利用PCI-E Switch PEX 8748实现FPGA芯片与计算机的通信&#xff0c;计算机与板卡接口处提供PCI-e 16速接口&#xff…...

完成第一个 Vue3.2 项目后,这是我的技术总结

第一次Composition API 在vue3.2中&#xff0c;正式支持了script setup的写法,这样可以大大简化组件的代码量&#xff0c;减少一些重复操作&#xff0c;我认为当你写vue3时&#xff0c;应该把这当作默认写法。在vue3.2之前&#xff0c;一般会这样写。 <script>export de…...

类的动态演绎:程序运行中的生命绽放

任务1.按照要求设计类(根据输出设计类) 设计类就是根据数据封装的要求&#xff0c;抽象出适合的类。 有如下情况的测试程序和测试程序的输出结果&#xff0c;要求设计类Smile。 &#xff08;一&#xff09;第1种情况&#xff1a; &#xff08;1&#xff09;测试程序如下&#x…...

从代币角度介绍solana账户体系

1、solana 的账户概念介绍 Solana的账户体系是其区块链的核心组成部分&#xff0c;它允许数据和价值在链上存储和转移。以下是Solana账户体系的一些关键特点&#xff1a; • 账户模型&#xff1a; • 在Solana上&#xff0c;所有数据都存储在所谓的“账户”中&#xff0c;类似…...

Python pygame 主副屏编程时 在副屏上全屏窗口的方法

Python在windows环境中编程时&#xff0c;用pygame工具包能够很轻易的完成2D游戏的简单设计&#xff0c;非常好用&#xff0c;相关帖子很多。 而当电脑连接了多块显示器时&#xff08;注意不是windows的多桌面&#xff09;&#xff0c;系统选择扩展这些显示器后&#xff0c;可…...

服务器数据恢复—V7000存储中多块磁盘出现故障导致业务中断的数据恢复案例

服务器存储数据恢复环境&#xff1a; 一台V7000存储上共12块SAS机械硬盘&#xff08;其中1块是热备盘&#xff09;&#xff0c;组建了2组Mdisk&#xff0c;创建了一个pool。挂载在小型机上作为逻辑盘使用&#xff0c;小型机上安装的AIXSybase。 服务器存储故障&#xff1a; V7…...

Qt开发经验 --- 避坑指南(2)

文章目录 1、 Heob窗口变得非常长&#xff0c;配置名称是一长串乱码2、 Qt安装报错 From 6.5.0, xcb-cursor0 or libxcb-cursor0 is needed to load the Qt xcb platform plugin.3、Cmake编译错误找不到libwinpthread-1.dll4、CMake编译找不到mingw5、linux下qtcreator启动报错…...

2.4 网络概念(分层、TCP)

网络层与传输层概述 网络层&#xff1a; 抽象概念&#xff1a;网络层是基于 IP 的抽象概念&#xff0c;与数据链路层用 MAC 地址标记设备不同。MAC 地址是一种具体化的概念&#xff0c;绑定于所在的物理网络&#xff0c;而 IP 地址可以是固定的&#xff0c;也可以通过路由动态…...

Elasticsearch问题总结

Fielddata access on the_id field is disallowed, you can re-enable it by updating the dynamic cluster setting: indices.id_field_data.enabledElasticsearch默认禁用_id字段进行排序&#xff0c;这是因为_id字段通常不需要进行聚合或排序操作&#xff0c;启用字段数据可…...

C++点云大文件读取

C点云大文件读取 1. 常规读取1.1 逐行读取1.2 逐字节读取 2. 并行读取 (Multithreading)3. 使用缓冲读取 (Buffered I/O)4. 内存映射文件 (Memory Mapping) 在C中读取大文件时&#xff0c;如果需要提高读取速度&#xff0c;可以考虑以下几种方法&#xff1a; 1. 常规读取 常规…...

Hololens 2 Unity VS2019编译报错解决方案

报错问题描述不够详细&#xff0c;但是针对Hololens 2和Unity开发环境中的VS2019编译错误&#xff0c;以下 是一些常见的问题及其解决方案: 1.缺少或错误的Unity版本 确保安装了支持Hololens 2的Unity版本(例如2019.3或更高)。 2.缺少C工作负载 打开Visual Studio Installe…...

【Cadence射频仿真学习笔记】IC设计中电感的分析、建模与绘制(EMX电磁仿真,RFIC-GPT生成无源器件及与cadence的交互)

一、理论讲解 1. 电感设计的两个角度 电感的设计可以从两个角度考虑&#xff0c;一个是外部特性&#xff0c;一个是内部特性。外部特性就是把电感视为一个黑盒子&#xff0c;带有两个端子&#xff0c;如果带有抽头的电感就有三个端子&#xff0c;需要去考虑其电感值、Q值和自…...

记录:virt-manager配置Ubuntu arm虚拟机

virt-manager&#xff08;Virtual Machine Manager&#xff09;是一个图形用户界面应用程序&#xff0c;通过libvirt管理虚拟机&#xff08;即作为libvirt的图形前端&#xff09; 因为要在Linux arm环境做测试&#xff0c;记录下virt-manager配置arm虚拟机的过程 先在VMWare中…...

Qt Quick:CheckBox 复选框

复选框不止选中和未选中2种状态哦&#xff0c;它还有1种部分选中的状态。这3种状态都是Qt自带的&#xff0c;如果想让复选框有部分选中这个状态&#xff0c;需要将三态属性&#xff08;tristate&#xff09;设为true。 未选中的状态值为0&#xff0c;部分选中是1&#xff0c;选…...

腾讯云云开发 Copilot 深度探索与实战分享

个人主页&#xff1a;♡喜欢做梦 欢迎 &#x1f44d;点赞 ➕关注 ❤️收藏 &#x1f4ac;评论 目录 一、引言 二、产品介绍 三、产品体验过程 四、整体总结 五、给开发者的复用建议 六、对 AI 辅助开发的前景展望 一、引言 在当今数字化转型加速的时代&#xff0c;…...

Linux应用开发————mysql数据库表

mysql数据库表操作 查看表的结构 mysql> desc / describe 表名; 或者&#xff1a; mysql> show create table 表名; 常见数据库引擎&#xff1a; innodb, myISAM... 删除表 mysql> drop tabl…...

《军工记忆》第二季播出,科技创新铸国之重器

2019年8月1日晚20点&#xff0c;《军工记忆》第二季在央视纪录频道&#xff08;CCTV-9&#xff09;播出&#xff0c;第一集《第一颗氢弹》首当其冲&#xff0c;为我们生动描绘了氢弹研制过程的艰难岁月&#xff0c;重现中国军工事业的漫漫长路&#xff0c;科技创新铸国之重器。…...

linux 无网络安装mysql

下载地址 通过网盘分享的文件&#xff1a;mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz 链接: https://pan.baidu.com/s/1qm48pNfGYMqBGfoqT3hxPw?pwd0012 提取码: 0012 安装 解压 tar -zxvf mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz mv /usr/mysql-5.7.33-linux-glibc2.1…...

如何使用Python进行音频片断合成

以下是几种使用 Python 进行音频合成的方法&#xff1a; 使用 synthesizer 库 通过 pip install synthesizer 安装后&#xff0c;利用其提供的合成器类&#xff0c;可自定义振荡器类型&#xff0c;如锯齿波、方波或正弦波&#xff0c;并调制振幅来创造不同音色&#xff0c;还…...

【SH】在Ubuntu Server 24中基于Python Web应用的Flask Web开发(实现POST请求)学习笔记

文章目录 Flask开发环境搭建保持Flask运行Debug调试 路由和视图可变路由 请求和响应获取请求信息Request属性响应状态码常见状态码CookieSession 表单GET请求POST请求 Flask 在用户使用浏览器访问网页的过程中&#xff0c;浏览器首先会发送一个请求到服务器&#xff0c;服务器…...

方正畅享全媒体采编系统reportCenter.do接口SQL注入漏洞复现 [附POC]

文章目录 方正畅享全媒体采编系统reportCenter.do接口SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现方正畅享全媒体采编系统reportCenter.do接口SQL注入漏洞复现 [附POC] 0x01 前言 免责声明:请勿利…...

SpringBoot Redis 消息队列

文章目录 参考消息队列list源码 pub/sub源码 参考 https://www.cnblogs.com/uniqueDong/p/15904837.html https://www.cnblogs.com/wzh2010/p/17205390.html https://blog.csdn.net/qq_16557637/article/details/121015736 https://developer.aliyun.com/article/1095035 http…...

Oracle 中间件 Webcenter Portal服务器环境搭建

环境信息 服务器基本信息 如下表&#xff0c;本次安装总共使用2台服务器&#xff0c;具体信息如下&#xff1a; Webcenter1服务器 归类 SOA服务器 Ip Address 172.xx.xx.xx.xx HostName wcc01.xxxxxx.com Alias wccprd01 Webcenter2服务器 归类 OSB服务器 Ip Addr…...

域名和服务器是什么?域名和服务器是什么关系?

在互联网的生态系统中&#xff0c;域名和服务器是两个至关重要的组成部分。它们共同构成了我们访问网站和使用在线服务的基础。那么域名和服务器是什么?域名和服务器是什么关系? 1、域名的概念 域名是互联网中用于标识特定地址的一种文字形式。它是用户访问网站时输入的易记…...

设计模式-观察者模式

背景 气象站需要将每天测量到的温度、湿度、气压等数据公布出去&#xff0c; 需要设计开放的API&#xff0c;以便第三方获取气象站的数据&#xff0c; 如果数据有更新&#xff0c;能及时地通知第三方 传统思路&#xff1a; 创建WeatherData类&#xff0c;有温度、湿度、气…...

获取显示器(主/副屏)友好名称(FriendlyName)

在开发涉及多显示器的应用程序时&#xff0c;获取显示器的友好名称&#xff08;Friendly Name&#xff09;是一个常见需求。本文将深入探讨GetMonitorFriendlyName 方法&#xff0c;了解其实现细节和工作原理。 方法签名 public static string GetMonitorFriendlyName(bool i…...

打造智慧医院挂号枢纽:SSM 与 Vue 融合的系统设计与实施

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…...

图漾相机-ROS1_SDK_ubuntu版本编译(新版本)

文章目录 官网编译文档链接官网SDK下载链接1、下载 Camport ROS1 SDK1.下载git2、下载链接 2、准备编译工作1、安装 catkin2、配置环境变量3. 将Camport3中的linux库文件拷贝到 user/lib目录下4、修改lunch文件制定相机&#xff08;可以放在最后可以参考在线文档&#xff09;**…...