JVM-Java字节码技术笔记
Java字节码技术
Java字节码是java代码编译后的中间代码格式,JVM需要读取并解析字节码才能执行相应的任务
-
获取字节码简介:由单字节(
byte
)的指令组成- 操作码(
指令
), 主要由类型前缀
和操作名称
两部分组成。 - 根据指令的性质,主要分为四个大类:
- 栈操作指令,包括与局部变量交互的指令
- 程序流程控制指令
- 对象操作指令,包括方法调用指令
- 算术运算以及类型转换指令
- 操作码(
-
获取字节码清单
-
用
javap
工具来获取 class 文件中的指令清单,专门用于反编译 class 文件。 -
Compiled from "HelloByteCode.java" public class demo.jvm0104.HelloByteCode {public demo.jvm0104.HelloByteCode();Code:0: aload_01: invokespecial #1 // Method java/lang/Object."<init>":()V4: returnpublic static void main(java.lang.String[]);Code:0: new #2 // class demo/jvm0104/HelloByteCode3: dup4: invokespecial #3 // Method "<init>":()V7: astore_18: return }
-
-
解读字节码清单
-
public demo.jvm0104.HelloByteCode(); // 如果不定义任何构造函数,就会有一个默认的无参构造函数.这是 Java 编译器生成的, 而不是运行时JVM自动生成的。
-
//每个构造函数中会先调用super类的构造函数,默认构造函数中有些字节码指令来干这个事情 //解析的java/lang/Object 默认继承了Object类 public demo.jvm0104.HelloByteCode();Code:0: aload_01: invokespecial #1 // Method java/lang/Object."<init>":()V4: return
-
-
查看class中的常量池
- 常量池就是一个常量的大字典,使用编号的方式把程序里用到的各类常量统一管理起来,这样在字节码操作里,只需要引用编号即可。
- 大多数时候指的是
运行时常量池
。运行时常量池里面的常量主要是由 class 文件中的常量池结构体
组成的。 - 查看常量池信息的命令:javap -c -verbose demo.jvm0104.HelloByteCode
- 反编译class的时候,指定-verbose选项,会输出附加信息
#1 = Methodref #4.#13 // java/lang/Object."<init>":()V
,#1
:常量编号,该文件中其他地方可以引用=
:分隔符Methodref
:表明这个常量指向的是一个方法;具体是哪个类的哪个方法呢? 类指向的#4
, 方法签名指向的#13
;
-
查看方法信息
-
//main方法编译结果public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: ACC_PUBLIC, ACC_STATICCode:stack=2, locals=2, args_size=1
-
方法描述: ([Ljava/lang/String;)V:
- 小括号内是入参信息/形参信息;
- 左方括号表述数组;
L
表示对象;- 后面的
java/lang/String
就是类名称; - 小括号后面的
V
则表示这个方法的返回值是void
; - 方法的访问标志也很容易理解
flags: ACC_PUBLIC, ACC_STATIC
,表示 public 和 static。
-
还可以看到执行该方法时需要的栈(stack)深度是多少,需要在局部变量表中保留多少个槽位, 还有方法的参数个数:
stack=2, locals=2, args_size=1
。
-
-
线程栈与字节码执行模型
- 每个线程都有一个独属于自己的线程栈(JVM stack),用于存储
栈帧
(Frame)。每一次方法调用,JVM都会自动创建一个栈帧。栈帧
由操作数栈
,局部变量数组
以及一个class 引用
组成。class 引用
指向当前方法在运行时常量池中对应的 class)。
局部变量数组
也称为局部变量表
(LocalVariableTable), 其中包含了方法的参数,以及局部变量。 局部变量数组的大小在编译时就已经确定: 和局部变量+形参的个数有关,还要看每个变量/参数占用多少个字节。操作数栈是一个 LIFO 结构的栈, 用于压入和弹出值。 它的大小也在编译时确定。- 有一些操作码/指令可以将值压入“操作数栈”; 还有一些操作码/指令则是从栈中获取操作数,并进行处理,再将结果压入栈。操作数栈还用于接收调用其他方法时返回的结果值。
- 每个线程都有一个独属于自己的线程栈(JVM stack),用于存储
-
方法体中的字节码解读
-
0: new #2 // class demo/jvm0104/HelloByteCode3: dup4: invokespecial #3 // Method "<init>":()V7: astore_18: return
-
前面的数字:间隔不相等的原因是, 有一部分操作码会附带有操作数, 也会占用字节码数组中的空间。
-
例如:
new
就会占用三个槽位: 一个用于存放操作码指令自身,两个用于存放操作数。因此,下一条指令dup
的索引从3
开始。
-
-
对象初始化指令:new 指令, init 以及 clinit 简介
-
创建类实例生成操作码
-
0: new #2 // class demo/jvm0104/HelloByteCode 创建对象,但没有调用构造函数 3: dup // 用来调用某些特殊方法的,即构造函数 4: invokespecial #3 // Method "<init>":()V 用于复制栈顶的值。构造函数调用不会返回值,所以如果没有 dup 指令, 在对象上调用方法并初始化之后,操作数栈就会是空的,在初始化之后就会出问题。所以在构造函数返回之后,可以将对象实例赋值给局部变量或某个字段
-
接下来指令
-
astore {N} or astore_{N} – 赋值给局部变量,其中 {N} 是局部变量表中的位置。 putfield – 将值赋给实例字段 putstatic – 将值赋给静态字段
-
在调用构造函数的时候,还会执行另一个类似的方法
<init>
,甚至在执行构造函数之前就执行了。 -
还有一个可能执行的方法是该类的静态初始化方法
<clinit>
, 但<clinit>
并不能被直接调用,而是由这些指令触发的:new
,getstatic
,putstatic
orinvokestatic
。
-
-
栈内存操作指令
- 最基础的是
dup
和pop
指令。dup
指令复制栈顶元素的值。pop
指令则从栈中删除最顶部的值。
- 复杂一点的指令:比如,
swap
,dup_x1
和dup2_x1
。swap
指令可交换栈顶两个元素的值,例如A和B交换位置(图中示例4);dup_x1
将复制栈顶元素的值,并在栈顶插入两次(图中示例5);dup2_x1
则复制栈顶两个元素的值,并插入第三个值(图中示例6)。
- dup 指令:复制栈顶的值,并将复制的值压入栈。
- dup_x1 指令:复制栈顶的值,并将复制的值插入到最上面 2 个值的下方。
- dup2_x1 指令:复制栈顶 1 个 64 位/或 2 个 32 位的值, 并将复制的值按照原始顺序,插入原始值下面一个 32 位值的下方。
- 最基础的是
-
局部变量表
-
stack
主要用于执行指令,而局部变量则用来保存中间结果,两者之间可以直接交互。 -
javac -g demo/jvm0104/*.java(生成调试信息的
-g
参数) -
javap -c -verbose demo/jvm0104/LocalVariableTest (反编译)
-
代码
-
//移动平均数 public class MovingAverage {private int count = 0;private double sum = 0.0D;public void submit(double value){this.count ++;this.sum += value;}public double getAvg(){if(0 == this.count){ return sum;}return this.sum/this.count;} }public class LocalVariableTest {public static void main(String[] args) {MovingAverage ma = new MovingAverage();int num1 = 1;int num2 = 2;ma.submit(num1);ma.submit(num2);double avg = ma.getAvg();} }
-
反编译 public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: ACC_PUBLIC, ACC_STATICCode:stack=3, locals=6, args_size=10: new #2 // class demo/jvm0104/MovingAverage new, 创建 MovingAverage 类的对象;3: dup // 复制栈顶引用值。4: invokespecial #3 // Method demo/jvm0104/MovingAverage."<init>":()V invokespecial 执行对象初始化。7: astore_1 //使用 astore_1 指令将引用地址值(addr.)存储(store)到编号为1的局部变量中: astore_1 中的 1 指代 LocalVariableTable 中ma对应的槽位编号,8: iconst_1 // iconst_1 和 iconst_2 用来将常量值1和2加载到栈里面, 并分别由指令 istore_2 和 istore_3 将它们存储到在 LocalVariableTable 的槽位 2 和槽位 3 中。store 之类的指令调用实际上从栈顶删除了一个值。 这就是为什么再次使用相同值时,必须再加载(load)一次的原因。9: istore_210: iconst_211: istore_312: aload_113: iload_214: i2d15: invokevirtual #4 // Method demo/jvm0104/MovingAverage.submit:(D)V18: aload_119: iload_320: i2d21: invokevirtual #4 // Method demo/jvm0104/MovingAverage.submit:(D)V24: aload_1 //调用 getAvg() 方法后,返回的结果位于栈顶,然后使用 dstore 将 double 值保存到本地变量4号槽位,这里的d表示目标变量的类型为double。25: invokevirtual #5 // Method demo/jvm0104/MovingAverage.getAvg:()D28: dstore 430: returnLineNumberTable:line 5: 0line 6: 8line 7: 10line 8: 12line 9: 18line 10: 24line 11: 30LocalVariableTable:Start Length Slot Name Signature0 31 0 args [Ljava/lang/String;8 23 1 ma Ldemo/jvm0104/MovingAverage;10 21 2 num1 I12 19 3 num2 I30 1 4 avg D
-
给局部变量赋值时,需要使用相应的指令来进行
store
,如astore_1
。store
类的指令都会删除栈顶值。 相应的load
指令则会将值从局部变量表压入操作数栈,但并不会删除局部变量中的值。
-
-
流程控制指令
-
主要是分支和循环在用, 根据检查条件来控制程序的执行流程。
-
代码
-
public class ForLoopTest {private static int[] numbers = {1, 6, 8};public static void main(String[] args) {MovingAverage ma = new MovingAverage();for (int number : numbers) {ma.submit(number);}double avg = ma.getAvg();} }
-
编译反编译
-
javac -g demo/jvm0104/*.java javap -c -verbose demo/jvm0104/ForLoopTest
-
字节码
-
0: new #2 // class demo/jvm0104/MovingAverage 3: dup 4: invokespecial #3 // Method demo/jvm0104/MovingAverage."<init>":()V 7: astore_1 8: getstatic #4 // Field numbers:[I 11: astore_2 12: aload_2 13: arraylength 14: istore_3 15: iconst_0 16: istore 418: iload 4 //循环体 用于执行循环计数器与数组长度的比较20: iload_321: if_icmpge 43 //if, integer, compare, great equal, 如果一个数的值大于或等于另一个值,则程序执行流程跳转到pc=43的地方继续执行。24: aload_225: iload 427: iaload28: istore 530: aload_131: iload 533: i2d34: invokevirtual #5 // Method demo/jvm0104/MovingAverage.submit:(D)V 37: iinc 4, 1 // 4号槽位的值加140: goto 18 //跳到循环开始的地方43: aload_144: invokevirtual #6 // Method demo/jvm0104/MovingAverage.getAvg:()D47: dstore_248: returnLocalVariableTable:Start Length Slot Name Signature30 7 5 number I //5 号槽位被 number 占用了。0 49 0 args [Ljava/lang/String; //0槽位被 main 方法的参数 args 占据了8 41 1 ma Ldemo/jvm0104/MovingAverage; //1 号槽位被 ma 占用了。48 1 2 avg D //2 号槽位是for循环之后才被 avg 占用的。2号槽位的变量保存了 numbers 的引用值,占据了 2号槽位。 3号槽位的变量, 由 arraylength 指令使用, 得出循环的长度。 4号槽位的变量, 是循环计数器, 每次迭代后使用 iinc 指令来递增。
-
-
算术运算指令与类型转换指令
-
将
int
值作为参数传递给实际上接收double
的submit()
方法时, 在实际调用该方法之前,使用了类型转换的操作码 -
31: iload 533: i2d34: invokevirtual #5 // Method demo/jvm0104/MovingAverage.submit:(D)V
-
将一个 int 类型局部变量的值, 作为整数加载到栈中,然后用
i2d
指令将其转换为double
值,以便将其作为参数传给submit
方法。 -
唯一不需要将数值load到操作数栈的指令是
iinc
,它可以直接对LocalVariableTable
中的值进行运算。 其他的所有操作均使用栈来执行。
-
-
方法调用指令和参数传递
用于方法调用的指令
-
invokestatic
,用于调用某个类的静态方法,这也是方法调用指令中最快的一个。 -
invokespecial
, 用来调用构造函数,也可以用于调用同一个类中的 private 方法, 以及可见的超类方法。 -
invokevirtual
,如果是具体类型的目标对象,用于调用公共,受保护和打包私有方法。 -
invokeinterface
,调用的方法属于某个接口。运行时受到更多限制区别:
-
使用
invokestatic
指令,JVM 就确切地知道要调用的是哪个方法:因为调用的是静态方法,只能属于一个类。 -
使用
invokespecial
时, 查找的数量也很少, 解析也更加容易, 那么运行时就能更快地找到所需的方法。
-
-
JDK7 新增的方法调用指令 invokedynamic
- 是实现“动态类型语言”
- 在不改变字节码的时候,Java 语言层面想调用一个类 A 的方法 m,只有两个办法:
- 使用
A a=new A(); a.m()
,拿到一个 A 类型的实例,然后直接调用方法; - 通过反射,通过 A.class.getMethod 拿到一个 Method,然后再调用这个
Method.invoke
反射调用;
- 使用
- invokedynamic配合新增的方法句柄(Method Handles,可以用来描述一个跟类型 A 无关的方法 m 的签名,甚至不包括方法名称,这样就可以做到我们使用方法 m 的签名,但是直接执行的时候调用的是相同签名的另一个方法 b),可以在运行时再决定由哪个类来接收被调用的方法。在此之前,只能使用反射来实现类似的功能。该指令使得可以出现基于 JVM 的动态语言,让 jvm 更加强大。而且在 JVM 上实现动态调用机制,不会破坏原有的调用机制。这样既很好的支持了 Scala、Clojure 这些 JVM 上的动态语言,又可以支持代码里的动态 lambda 表达式。
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
JVM-Java字节码技术笔记
Java字节码技术 Java字节码是java代码编译后的中间代码格式,JVM需要读取并解析字节码才能执行相应的任务 获取字节码简介:由单字节(byte)的指令组成 操作码( 指令), 主要由类型前缀和操作名称两部分组成。根据指令的性质…...
![](https://img-blog.csdnimg.cn/img_convert/0ededa294f5eae625d47d2132e8affeb.png)
C++ 友元、重载、继承、多态
友元 关键字:friend 友元的三种实现 全局函数做友元类做友元成员函数做友元 全局函数做友元 //建筑物类 class Building {//goodGay全局函数是Building好朋友,可以访问Building中私有成员friend void goodGay(Building& building); public:Build…...
![](https://img-blog.csdnimg.cn/ee26fc2ab5a44c59b1ff0d49ed96acd6.png)
Spring Boot 日志文件
前言 本篇博客主要介绍自定义的日志打印、日志的级别高低、如何保存日志等等..... 一、日志是什么?日志有什么用? 日志就是我们控制台上输出的内容,控制台上的输出的信息就是日志信息,如下所示: 日志有什么用&#x…...
![](https://img-blog.csdnimg.cn/e62ba10bb51a4b4b8953952d8bb03dc6.png)
vulhub venom
文章目录 靶场环境信息收集ftp服务二、信息利用三、任意文件上传三 sudo提权靶场环境 `vmware 靶场信息:https://www.vulnhub.com/entry/venom-1,701/ 下载地址:https://download.vulnhub.com/venom/venom.zip 新建虚拟机打开下载后的ovf文件 遇见导入失败合规性检查时,重试…...
![](https://www.ngui.cc/images/no-images.jpg)
量化交易之One Piece篇 - linux - 定时任务(重启服务器、执行程序、验证)
linux 执行命令: crontab -e 0 5 * * 1-5 sudo /sbin/shutdown -r now 0 17 * * 1-5 sudo /sbin/shutdown -r now 45 8 * * 1-5 cd /home/ubuntu/onepiece/bin/datacore && ./datacore 45 20 * * 1-5 cd /home/ubuntu/onepiece/bin/datacore && ./datacore 以…...
![](https://img-blog.csdnimg.cn/85ae9415e0364dda8f545b86380c4479.png)
Qt5开发及实例V2.0-第二十三章-Qt-多功能文档查看器实例
Qt5开发及实例V2.0-第二十三章-Qt-多功能文档查看器实例 第23章 多功能文档查看器实例23.1. 简介23.2. 界面与程序框架设计23.2.1. 图片资源23.2.2. 网页资源23.2.3. 测试用文件 23.3 主程序代码框架23.4 浏览网页功能实现23.4.1 实现HtmIHandler处理器 23.5. 部分代码实现23.5…...
![](https://img-blog.csdnimg.cn/0858e8abc4504e75b870b156806d9299.png)
爬虫笔记_
爬虫简介 爬虫初始深入 爬虫在使用场景中的分类 通用爬虫: 抓取系统重要组成部分。抓取的是一整张页面数据 聚焦爬虫: 是建立在通用爬虫的基础上。抓取的是页面中特定的局部内容。 增量式爬虫 监测网站中数据更新的情况。只会抓取网站中最新更新出来的…...
![](https://www.ngui.cc/images/no-images.jpg)
Spring设计模式,事务管理和代理模式的应用
扩充:贝叶斯定理答案见底。 设计模式对关于面向对象问题的具体解决方案. 1,单例多例 在设计单例模式时,要注意两个点 1.构造方法要私有 2.成员变量要私有 3.创建对象所用的方法要被synchronized修饰.(因为方法体中会涉及到判断当…...
![](https://img-blog.csdnimg.cn/d094b90c00c6436e825d2a2ec5f342b7.png)
基于海康Ehome/ISUP接入到LiveNVR实现海康摄像头、录像机视频统一汇聚,做到物联网无插件直播回放和控制
LiveNVR支持海康NVR摄像头通EHOME接入ISUP接入LiveNVR分发视频流或是转GB28181 1、海康 ISUP 接入配置2、海康设备接入2.1、海康EHOME接入配置示例2.2、海康ISUP接入配置示例 3、通道配置3.1、直播流接入类型 海康ISUP3.2、海康 ISUP 设备ID3.3、启用保存3.4、接入成功 4、相关…...
![](https://img-blog.csdnimg.cn/img_convert/b453ac0abc352973476e881bdac679d3.png)
Linux下git安装及使用
Linux下Git使用 1. git的安装 sudo apt install git安装完,使用git --version查看git版本 2. 配置git git config --global user.name "Your Name“ ##配置用户 git config --global user.email emailexample.com ##配置邮箱git config --global --list …...
![](https://www.ngui.cc/images/no-images.jpg)
python读取图片
要在Python中读取图片,你可以使用第三方库Pillow(Python Imaging Library,PIL)或OpenCV。以下是使用这两个库的示例: 使用Pillow库读取图片: 首先,确保你已经安装了Pillow库。如果还没有安装&am…...
![](https://img-blog.csdnimg.cn/d526fba227d54e9aae596dc4538545d4.png)
虚幻4学习笔记(15)读档 和存档 的实现
虚幻4学习笔记 读档存档 B站UP谌嘉诚课程:https://www.bilibili.com/video/BV164411Y732 读档 添加UI蓝图 SaveGame_UMG 添加Scroll Box 修改Scrollbar Thickness滚动条厚度 15 15 勾选 is variable 添加text 读档界面 添加背景模糊 添加UI蓝图 SaveGame_Slot …...
![](https://img-blog.csdnimg.cn/de64e8502aae4bf98af20d69c8f2e6ba.png)
Spring面试题22:Spring支持哪些ORM框架?优缺点分别是什么?Spring可以通过哪些方式访问Hibernate?
该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring支持哪些ORM框架?优缺点分别是什么? Spring 支持多种 ORM(对象关系映射)框架,其中包括: Hibernate:Hibernate 是一个强大的 ORM 框架…...
![](https://www.ngui.cc/images/no-images.jpg)
流行的Python库numpy及Pandas简要介绍
numpy.ndarray 是NumPy库中的主要数据结构,它是一个多维数组,用于存储和操作数值数据。NumPy是Python中用于数值计算的强大库,numpy.ndarray 是它的核心数据类型,提供了高效的数值运算和广泛的数学函数。 以下是 numpy.ndarray 的…...
![](https://img-blog.csdnimg.cn/94c4d587e68a4f98b5983b55aeceb69d.png)
【二、安装centOS】
下载 地址:https://mirrors.aliyun.com/centos/ 地址 1、https://mirrors.aliyun.com/centos/7.9.2009/ 2、https://mirrors.aliyun.com/centos/7.9.2009/isos/ 3、https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/ 选哪一个 可以选择第一个࿰…...
![](https://img-blog.csdnimg.cn/510bed509116437c8420150908426bfb.png)
【动手学深度学习-Pytorch版】序列到序列的学习(包含NLP常用的Mask技巧)
序言 这一节是对于“编码器-解码器”模型的实际应用,编码器和解码器架构可以使用长度可变的序列作为输入,并将其转换为固定形状的隐状态(编码器实现)。本小节将使用“fra-eng”数据集(这也是《动手学习深度学习-Pytor…...
![](https://img-blog.csdnimg.cn/7d5ed9143531462da9d6a8c10d000ffe.png)
AUTOSAR 面试知识回顾
如果答不上来,就讲当时做了什么 1. Ethernet基础: 硬件接口: ECU到PHY: data 是MII总线, 寄存器控制是SMI总线【MDCMDIO两根线, half duplex】PHY输出(100BASE-T1): MDI总线,2 wire 【T1: twisted 1 pair …...
![](https://img-blog.csdnimg.cn/7b9356a544d84947a6f7016710012f8f.png)
华为NFC设置教程(门禁卡/公交卡/校园卡等)
今天把华为NFC设置教程分享给大家 出门带门禁卡、校园卡、银行卡、身份证……东西又多,携带又麻烦,还容易搞丢,有没有一种方法可以把它们都装下?有!只要一部手机,出门不带卡包,各种证件&#x…...
![](https://img-blog.csdnimg.cn/e19c71b55c7d4a5ebbfa78c2dabf07f0.png)
基于微信小程序的音乐播放器设计与实现(源码+lw+部署文档+讲解等)
前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻…...
![](https://img-blog.csdnimg.cn/0470d348b35348888ded1cd230f74779.png)
如何取消显示Notepad++每行显示的CRLF符号
新电脑中重新安装了Nodepad,打开记事本后发现出现了许多黑底的CR|LF标记,特别碍眼。 如何取消呢? 视图 -> 显示符号 -> 取消勾选 显示行尾符操作步骤 预期效果...
![](https://img-blog.csdnimg.cn/994ea1fd68dc459f94ab8dff2970ea0d.png)
数据结构与算法之时间复杂度和空间复杂度(C语言版)
1. 时间复杂度 1.1 概念 简而言之,算法中的基本操作的执行次数,叫做算法的时间复杂度。也就是说,我这个程序执行了多少次,时间复杂度就是多少。 比如下面这段代码的执行次数: void Func1(int N) {int count 0;for…...
![](https://img-blog.csdnimg.cn/e62ecb24753648e1af6fca8943dd0c26.png)
TLS/SSL(十) session缓存、ticket 票据、TLS 1.3的0-RTT
一 TLS优化手段 TLS 为了提升握手速度而提出优化手段,主要是减少TLS握手中RTT消耗的时间关于session cache和session ticket,nginx关于ssl握手的地方都有影子 [指令] https面经 ① session 缓存 resume: 重用,复用 案例: 第二次访问www.baidu.com 说明&#x…...
![](https://img-blog.csdnimg.cn/4360148a565a41adb3b73ada67667beb.png)
C++设计模式_06_Decorator 装饰模式
本篇将会介绍Decorator 装饰模式,它是属于一个新的类别,按照C设计模式_03_模板方法Template Method中介绍的划分为“单一职责”模式。 “单一职责”模式讲的是在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随…...
![](https://img-blog.csdnimg.cn/339df71e7a0d40d6a493564f6bf86189.png)
MySQL 8.0数据库主从搭建和问题处理
错误处理: 在从库通过start slave启动主从复制时出现报错 Last_IO_Error: error connecting to master slaveuser10.115.30.212:3306 - retry-time: 60 retries: 1 message: Authentication plugin caching_sha2_password reported error: Authentication require…...
![](https://img-blog.csdnimg.cn/img_convert/0e8592b365e001b9e920e50677ad7231.jpeg)
公众号迁移多久可以完成?
公众号账号迁移的作用是什么?只能变更主体吗?长期以来,由于部分公众号在注册时,主体不准确的历史原因,或者公众号主体发生合并、分立或业务调整等现实状况,在公众号登记主体不能对应实际运营人的情况下&…...
![](https://www.ngui.cc/images/no-images.jpg)
Spring Cloud Stream Kafka(3.2.2版本)使用
问题 正在尝试只用Spring Cloud Stream Kafka。 步骤 配置 spring:cloud:function:definition: project2Building stream:kafka:binder:brokers: xxxx:9002configuration:enable.auto.commit: falsesession.timeout.ms: 30000max.poll.records: 30allow.auto.create.top…...
![](https://www.ngui.cc/images/no-images.jpg)
8位微控制器上的轻量级SM2加密算法实现:C语言详细指南与完整代码解析
引言 在当今的数字化世界中,安全性是每个系统的核心。无论是智能家居、医疗设备还是工业自动化,每个设备都需要确保数据的安全性和完整性。对于许多应用来说,使用高级的微控制器或处理器可能是不切实际的,因为它们可能会增加成本…...
![](https://img-blog.csdnimg.cn/ad0b11caf57040f8bbefe2bd577bcea5.png)
neo4j下载安装配置步骤
目录 一、介绍 简介 Neo4j和JDK版本对应 二、下载 官网下载 直接获取 三、解压缩安装 四、配置环境变量 五、启动测试 一、介绍 简介 Neo4j是一款高性能的图数据库,专门用于存储和处理图形数据。它采用节点、关系和属性的图形结构,非常适用于…...
![](https://img-blog.csdnimg.cn/76328db329e24e15b9d916bfef2094cd.png)
【机组】计算机系统组成课程笔记 第二章 计算机中的信息表示
2.1 无符号数和有符号数 2.1.1 无符号数 没有符号的数,其实就是非负数。在计算机中用字节码表示,目前最常用的是八位和十六位的。 2.1.2 有符号数 将正负符号数字化,0代表 ,1代表 - ,并把代表符号的数字放在有效数…...
![](https://img-blog.csdnimg.cn/5c2623926be44410bd6e87696effdfeb.png)
指针笔试题详解
个人主页:点我进入主页 专栏分类:C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 1.前言 2.指针题写出下列程序的结…...
![](/images/no-images.jpg)
福建省建设厅网站劳保核定卡/it行业培训机构一般多少钱
BrowserModule,CommonModule的选择: BrowserModule提供了启动和运行浏览器应用的那些基本的服务提供商。BrowserModule还从angular/common中重新导出了CommonModule,这意味着AppModule中的组件也同样可以访问那些每个应用都需要的Angular指令…...
![](/images/no-images.jpg)
做网站推广和头条推广/app网络推广方案
最近在做项目中,用Maven管理项目间的依赖关系,遇到一个问题,快折腾死了,不过初步试出来一种解决方案。在此把问题及解决方案描述一下,以资共享。 问题描述:有两个项目A和B,Dynamic Web Projec…...
![](/images/no-images.jpg)
php网站建设制作设计/优秀网站
STL 基础引入—迭代器一,pair双元组1,构造2,提取值二,map(内部有序)三、nth_element四,set(有序平衡树)引入—迭代器 1,.end()返回的不是最后一个元素的位置…...
什么网站做简历/电商运营多少钱一个月
题库来源:安全生产模拟考试一点通公众号小程序 2020建筑电工(建筑特殊工种)考试题库及建筑电工(建筑特殊工种)模拟考试,包含建筑电工(建筑特殊工种)考试题库答案解析及建筑电工(建筑特殊工种)模拟考试练习。由安全生产模拟考试一点通公众号结合国家建筑…...
做网站那个公司/免费seo网站推荐一下
日期内核版本架构作者GitHubCSDN2016-05-29Linux-4.5X86 & armgatiemeLinuxDeviceDriversLinux进程管理与调度-之-进程的创建 前言 Linux下有3个特殊的进程,idle进程(PID0), init进程(PID1)和kthreadd(PID2) * idle进程由系统自动创建, 运行在内核态 idle进…...
![](/images/no-images.jpg)
做网站推广员必备的条件/百度搜一搜
问:从北京邮电大学毕业的学生就业怎么样?值不值得报考?想要了解北京邮电大学毕业生就业具体情况详见>>>北京邮电大学总之,北京邮电大学就业率相对来说是比较良好的,如果大家对此学校感兴趣的话,可…...