RabbitMQ命令行

RabbitMQ命令行

RabbitMQ附带多个命令行工具:

它们可以在安装根目录的sbin目录下找到。

  • 创建交换机
1
rabbitmqctl eval 'rabbit_exchange:declare({resource, <<"test">>, exchange, <<"ac.exchange.alarm">>}, direct, true, false, false, []).'
  • 创建队列
1
rabbitmqctl eval 'rabbit_amqqueue:declare({resource, <<"test">>, queue, <<"ac.queue.alarm">>}, true, false, [], none).'
  • 绑定队列和交换机
1
rabbitmqctl eval 'rabbit_binding:add({binding, {resource, <<"test">>, exchange, <<"ac.exchange.alarm">>}, <<"ac.routing.key.alarm">>, {resource, <<"test">>, queue, <<"ac.queue.alarm">>}, []}).'

这三条命令执行后的最终结果是:在 test 虚拟主机下创建了 direct 类型的,持久化的,名为 ac.exchange.alarm 的exchange,创建了持久化的,名为 ac.queue.alarm 的queue,该队列以 ac.routing.key.alarm 的routing key绑定到了 ac.exchange.alarm 这个exchange上。其他参数为默认值.

docker 命令

docker 命令

docker search

docker pull tomcat

命令格式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

docker run –name mytomcat -d tomcat:latest

docker ps

docker stop

docker ps a

docker start

docker rm

docker run -d -p 8888:8080 tomcat

docker images [name]

docker build -f /usr/local/dockerfile -t [name] path

docker build -t saleorder:1.0 .

docker exec

docker 容器数据卷

Dockerfile指令

FROM

基础镜像,当前镜像是基于哪个镜像的

MAINTAINER

镜像维护者的姓名和邮箱地址等

WORKDIR

指定创建容器后,终端默认位置(pwd的位置)

ENV

构建镜像过程中的环境变量

RUN

构建容器过程中的执行的命令

EXPOSE

当前容器对外暴露出的端口

VOLUME

容器数据卷,用于数据保存和持久化

ADD

将宿主机目录下的文件拷贝到镜像中,且会解压 tar包和自动处理URL

COPY

CMD

指定容器启动时要执行的命令

ENTRYPOINT

ONBUILD

Context初始化流程

Context初始化流程

1.prepareRefresh

对刷新进行准备,包括设置开始时间、设置激活状态、初始化context环境中的占位符这个动作,根据之类的需求由子类来执行,然后验证是否却是必要的properties。

2.ConfiguratbleListableBeanFactory beanFactory=obtainFreshBeanfactory();

刷新并获得内部的Bean Factory。

3.prepareBeanFactory(beanFactory);

对beanFactory进行准备工作,比如设置类加载器和后置处理器,配置不进行自动装配的类型,注册默认的环境Bean。

4.postProcessBeanFactory(beanFactory);

为context的子类提供后置处理BeanFactory的扩展能力。如果子类想在Bean定义加载完成后,开始初始化上下文之前,做一些特殊逻辑,可以复写这个方法。

5.invokeBeanFactotyPostProcessors(beanFactory);

执行context中注册的beanfactory后缀处理器,这里有两种后置处理器一种是可以注册bean的后缀处理器。另一种是针对beanfactory进行处理的后置处理器。执行顺序是,先按照优先级执行可注册Bean的处理器,再按优先级执行针对Beanfactory的处理器。对springboot来书,这一步会进行BeanDefinition的解析。

6.registerBeanPostProcessors(beanFactory);

按照优先顺序在BeanFactory中注册Bean的后缀处理器,Bean后置处理器可以在Bean初始化前、后执行处理。

7.initMessageSource();

初始化消息源,消息源用来支持消息的国际化。

8.initApplicationEventMulticaster();

初始化应用事件广播器。事件广播器用来向ApplicationListener通知各种应用产生的事件,是一个标准的观察者模式。

9.onRefresh();

是留给子类的扩展步骤,用来让特定的Context子类初始化其他的bean。

10.registerListeners();

把实现了ApplicationListener的Bean注册到事件广播器,并对广播器中的早期未广播事件进行通知。

11.finishBeanFactoryInitialization(beanFactory);

冻结所有的Bean描述信息的修改,实例化非延迟加载的单例Bean

12.finishRefresh();

完成上下文的刷新工作,调用LifecycleProcessor的onFresh()方法以及发布ContextRefreshedEvent事件。

13.resetCommonCaches();

在finally中,执行第13步,重置公共的缓存,比如ReflectonUtils中的缓存、AnnotationUtils中的缓存等等。

Java性能调优工具

Java性能调优工具

Linux命令行工具

top命令

语法

1
top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]

image-20200901095826286

两大区域统计信息区进程信息区

统计信息区

  • 第一行:任务队列信息,与uptime命令执行结果相同。

    • 09:58:07:系统当前时间
    • up 195 days, 23:28:主机已运行时间
    • 5 users:用户连接数(不是用户数,who命令)
    • load average: 0.03, 0.09, 0.12:系统平均负载,统计最近1,5,15分钟的系统平均负载

    补充uptime -V可查询版本

  • 第二行:进程信息

    • Tasks: 128 total:进程总数
    • 1 running:正在运行的进程数
    • 127 sleeping:睡眠的进程数
    • 0 stopped:停止的进程数
    • 0 zombie:僵尸进程数
  • 第三行:CPU信息(当有多个CPU时,这些内容可能会超过两行)

    • 2.8us:用户空间所占CPU百分比
    • 1.0sy:内核空间占用CPU百分比
    • 0.0 ni:用户进程空间内改变过优先级的进程占用CPU百分比
    • 96.3id:空闲CPU百分比
    • 0.0 wa:等待输入输出的CPU时间百分比
    • 0.0 hi:硬件CPU中断占用百分比
    • 0.0 si:软中断占用百分比
    • 0.0 st:虚拟机占用百分比
  • 第四行:内存信息(与第五行的信息类似与free命令)

    • 8010424 total:物理内存总量
    • 6038816 used:已使用的内存总量
    • 274220 free:空闲的内存总量(free+used=total)
    • 1723692 buffers:用作内核缓存的内存量
  • 第五行:swap信息

    • 0total:交换分区总量
    • 0used:已使用的交换分区总量
    • 0free:空闲交换区总量
    • 1663496cached Mem:缓冲的交换区总量,内存中的内容被换出到交换区,然后又被换入到内存,但是使用过的交换区没有被覆盖,交换区的这些内容已存在于内存中的交换区的大小,相应的内存再次被换出时可不必再对交换区写入。

进程信息区

  • PID:进程id
  • PPID:父进程id
  • RUSER:Real user name(看了好多,都是这样写,也不知道和user有什么区别,欢迎补充此处)
  • UID:进程所有者的id
  • USER:进程所有者的用户名
  • GROUP:进程所有者的组名
  • TTY:启动进程的终端名。不是从终端启动的进程则显示为?
  • PR:优先级
  • NI:nice值。负值表示高优先级,正值表示低优先级
  • P:最后使用的CPU,仅在多CPU环境下有意义
  • %CPU:上次更新到现在的CPU时间占用百分比
  • TIME:进程使用的CPU时间总计,单位秒
  • TIME+:进程所使用的CPU时间总计,单位1/100秒
  • %MEM:进程使用的物理内存百分比
  • VIRT:进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
  • SWAP:进程使用的虚拟内存中被被换出的大小
  • RES:进程使用的、未被换出的物理内存的大小
  • CODE:可执行代码占用的物理内存大小
  • DATA:可执行代码以外的部分(数据段+栈)占用的物理内存大小
  • SHR:共享内存大小
  • nFLT:页面错误次数
  • nDRT:最后一次写入到现在,被修改过的页面数
  • S:进程状态(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程)
  • COMMAND:命令名/行
  • WCHAN:若该进程在睡眠,则显示睡眠中的系统函数名
  • Flags:任务标志

top命令的使用

top使用格式

top [-] [d] [p] [q] [c] [C] [S] [s] [n]

top参数说明

  • d: 指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。
  • p: 通过指定监控进程ID来仅仅监控某个进程的状态。
  • q: 该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。
  • S: 指定累计模式
  • s: 使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。
  • i: 使top不显示任何闲置或者僵死进程。
  • c: 显示整个命令行而不只是显示命令名

交互命令

  • Ctrl+L: 擦除并且重写屏幕。
  • h或者?: 显示帮助画面,给出一些简短的命令总结说明。
  • k: 终止一个进程。系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什么样的信号。一般的终止进程可以使用15信号;如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽。
  • i: 忽略闲置和僵死进程。这是一个开关式命令。
  • q: 退出程序。
  • r: 重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10。
  • S: 切换到累计模式。
  • s: 改变两次刷新之间的延迟时间。系统将提示用户输入新的时间,单位为s。如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s。需要注意的是如果设置太小的时间,很可能会引起不断刷新,从而根本来不及看清显示的情况,而且系统负载也会大大增加。
  • f或者F: 从当前显示中添加或者删除项目。
  • o或者O: 改变显示项目的顺序。
  • l: 切换显示平均负载和启动时间信息。
  • m: 切换显示内存信息。
  • t: 切换显示进程和CPU状态信息。
  • c: 切换显示命令名称和完整命令行。
  • M: 根据驻留内存大小进行排序。
  • P: 根据CPU使用百分比大小进行排序。
  • T: 根据时间/累计时间进行排序。
  • W: 将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。

sar命令

vmstat

iostat

pidstat

Java字节码指令收集大全

Java字节码指令收集大全

常量入栈指令

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0x01 aconst_null null值入栈
0x02 iconst_m1 -1(int)值入栈
0x03 iconst_0 0(int)值入栈
0x04 iconst_1 1(int)值入栈
0x05 iconst_2 2(int)值入栈
0x06 iconst_3 3(int)值入栈
0x07 iconst_4 4(int)值入栈
0x08 iconst_5 5(int)值入栈
0x09 lconst_0 0(long)值入栈
0x0a lconst_1 1(long)值入栈
0x0b fconst_0 0(float)值入栈
0x0c fconst_1 1(float)值入栈
0x0d fconst_2 2(float)值入栈
0x0e dconst_0 0(double)值入栈
0x0f dconst_1 1(double)值入栈
0x10 bipush valuebyte valuebyte值带符号扩展成int值入栈
0x11 sipush valuebyte1 valuebyte2 (valuebyte1 << 8)\ valuebyte2 值带符号扩展成int值入栈。
0x12 ldc indexbyte1 常量池中的常量值
(int, float, string reference, object reference)入栈。
0x13 ldc_w indexbyte1 indexbyte2 常量池中常量
(int, float, string reference, object reference)入栈。
0x14 ldc2_2 indexbyte1 indexbyte2 常量池中常量(long, double)入栈。

局部变量值转载到栈中指令

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0x19 (wide)aload indexbyte 从局部变量indexbyte中装载引用类型值入栈
0x2a aload_0 从局部变量0中装载引用类型值入栈
0x2b aload_1 从局部变量1中装载引用类型值入栈
0x2c aload_2 从局部变量2中装载引用类型值入栈
0a2d aload_3 从局部变量3中装载引用类型值入栈
0x15 (wide)iload indexbyte 从局部变量indexbyte中装载int类型值入栈
0x1a iload_0 从局部变量0中装载int类型值入栈
0x1b iload_1 从局部变量1中装载int类型值入栈
0x1c iload_2 从局部变量2中装载int类型值入栈
0x1d iload_3 从局部变量3中装载int类型值入栈
0x16 (wide)lload indexbyte 从局部变量indexbyte中装载long类型值入栈
0x1e lload_0 从局部变量0中装载long类型值入栈
0x1f lload_1 从局部变量1中装载long类型值入栈
0x20 lload_2 从局部变量2中装载long类型值入栈
0x21 lload_3 从局部变量3中装载long类型值入栈
0x17 f(wide)load indexbyte 从局部变量indexbyte中装载float类型值入栈
0x22 fload_0 从局部变量0中装载float类型值入栈
0x23 fload_1 从局部变量1中装载float类型值入栈
0x24 fload_2 从局部变量2中装载float类型值入栈
0x25 fload_3 从局部变量3中装载float类型值入栈
0x18 (wide)dload indexbyte 从局部变量indexbyte中装载引用类型值入栈
0x26 dload_0 从局部变量0中装载double类型值入栈
0x27 dload_1 从局部变量1中装载double类型值入栈
0x28 dload_2 从局部变量3中装载double类型值入栈
0x29 dload_3 从局部变量3中装载double类型值入栈
0x32 aaload 从引用类型数组中装载指定项的值入栈
0x2e iaload 从int类型数组中装载指定项的值入栈
0x2f laload 从long类型数组中装载指定项的值入栈
0x30 faload 从float类型数组中装载指定项的值入栈
0x31 daload 从double类型数组中装载指定项的值入栈
0x33 baload 从boolean或者byte类型数组中装载指定项的值入栈(
先转换为int类型值,后压栈)。
0x34 caload 从char类型数组中装载指定项的值入栈
(先转换为int类型值,后压栈)。
0x35 saload 从short类型数组中装载指定项的值入栈
(先转换为int类型值,后压栈)。

将栈顶值保存到局部变量中指令

0x3a (wide)astore indexbyte 将栈顶引用类型值保存到局部变量indexbyte中。
0x4b astroe_0 将栈顶引用类型值保存到局部变量0中。
0x4c astore_1 将栈顶引用类型值保存到局部变量1中。
0x4d astore_2 将栈顶引用类型值保存到局部变量2中。
0x4e astore_3 将栈顶引用类型值保存到局部变量3中。
0x36 (wide)istore indexbyte 将栈顶int类型值保存到局部变量indexbyte中。
0x3b istore_0 将栈顶int类型值保存到局部变量0中。
0x3c istore_1 将栈顶int类型值保存到局部变量1中。
0x3d istore_2 将栈顶int类型值保存到局部变量2中。
0x3e istore_3 将栈顶int类型值保存到局部变量3中。
0x37 (wide)lstore indexbyte 将栈顶long类型值保存到局部变量indexbyte中。
0x3f lstore_0 将栈顶long类型值保存到局部变量0中。
0x40 lstore_1 将栈顶long类型值保存到局部变量1中。
0x41 lstore_2 将栈顶long类型值保存到局部变量2中。
0x42 lstroe_3 将栈顶long类型值保存到局部变量3中。
0x38 (wide)fstore indexbyte 将栈顶float类型值保存到局部变量indexbyte中。
0x43 fstore_0 将栈顶float类型值保存到局部变量0中。
0x44 fstore_1 将栈顶float类型值保存到局部变量1中。
0x45 fstore_2 将栈顶float类型值保存到局部变量2中。
0x46 fstore_3 将栈顶float类型值保存到局部变量3中。
0x39 (wide)dstore indexbyte 将栈顶double类型值保存到局部变量indexbyte中。
0x47 dstore_0 将栈顶double类型值保存到局部变量0中。
0x48 dstore_1 将栈顶double类型值保存到局部变量1中。
0x49 dstore_2 将栈顶double类型值保存到局部变量2中。
0x4a dstore_3 将栈顶double类型值保存到局部变量3中。
0x53 aastore 将栈顶引用类型值保存到指定引用类型数组的指定项。
0x4f iastore 将栈顶int类型值保存到指定int类型数组的指定项。
0x50 lastore 将栈顶long类型值保存到指定long类型数组的指定项。
0x51 fastore 将栈顶float类型值保存到指定float类型数组的指定项。
0x52 dastore 将栈顶double类型值保存到指定double类型数组的指定项。
0x54 bastroe 将栈顶boolean类型值或byte类型值保存到指定boolean
类型数组或byte类型数组的指定项。
0x55 castore 将栈顶char类型值保存到指定char类型数组的指定项。
0x56 sastore 将栈顶short类型值保存到指定short类型数组的指定项。

wide**指令**

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0xc4 wide 使用附加字节扩展局部变量索引(iinc指令特殊)。

通用(无类型)栈操作指令

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0x00 nop 空操作。
0x57 pop 从栈顶弹出一个字长的数据。
0x58 pop2 从栈顶弹出两个字长的数据。
0x59 dup 复制栈顶一个字长的数据,将复制后的数据压栈。
0x5a dup_x1 复制栈顶一个字长的数据,弹出栈顶两个字长数据,
先将复制后的数据压栈,再将弹出的两个字长数据压栈。
0x5b dup_x2 复制栈顶一个字长的数据,弹出栈顶三个字长的数据,
将复制后的数据压栈,再将弹出的三个字长的数据压栈。
0x5c dup2 复制栈顶两个字长的数据,将复制后的两个字长的数据压栈。
0x5d dup2_x1 复制栈顶两个字长的数据,弹出栈顶三个字长的数据,
将复制后的两个字长的数据压栈,再将弹出的三个字长的数据压栈。
0x5e dup2_x2 复制栈顶两个字长的数据,弹出栈顶四个字长的数据,
将复制后的两个字长的数据压栈,再将弹出的四个字长的数据压栈。
0x5f swap 交换栈顶两个字长的数据的位置。Java指令中没有提供以
两个字长为单位的交换指令。

类型转换指令

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0x86 i2f 将栈顶int类型值转换为float类型值。
0x85 i2l 将栈顶int类型值转换为long类型值。
0x87 i2d 将栈顶int类型值转换为double类型值。
0x8b f2i 将栈顶float类型值转换为int类型值。
0x8c f2l 将栈顶float类型值转换为long类型值。
0x8d f2d 将栈顶float类型值转换为double类型值。
0x88 l2i 将栈顶long类型值转换为int类型值。
0x89 l2f 将栈顶long类型值转换为float类型值。
0x8a l2d 将栈顶long类型值转换double类型值。
0x8e d2i 将栈顶double类型值转换为int类型值。
0x90 d2f 将栈顶double类型值转换为float类型值。
0x8f d2l 将栈顶double类型值转换为long类型值。
0x91 i2b 将栈顶int类型值截断成byte类型,后带符号扩展成int类型值入栈。
0x92 i2c 将栈顶int类型值截断成char类型值,后带符号扩展成int类型值入栈。
0x93 i2s 将栈顶int类型值截断成short类型值,后带符号扩展成int类型值入栈。

整数运算

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0x60 iadd 将栈顶两int类型数相加,结果入栈。
0x64 isub 将栈顶两int类型数相减,结果入栈。
0x68 imul 将栈顶两int类型数相乘,结果入栈。
0x6c idiv 将栈顶两int类型数相除,结果入栈。
0x70 irem 将栈顶两int类型数取模,结果入栈。
0x74 ineg 将栈顶int类型值取负,结果入栈。
0x61 ladd 将栈顶两long类型数相加,结果入栈。
0x65 lsub 将栈顶两long类型数相减,结果入栈。
0x69 lmul 将栈顶两long类型数相乘,结果入栈。
0x6d ldiv 将栈顶两long类型数相除,结果入栈。
0x71 lrem 将栈顶两long类型数取模,结果入栈。
0x75 lneg 将栈顶long类型值取负,结果入栈。
0x84 (wide)iinc indexbyteconstbyte 将整数值constbyte加到indexbyte指定的int类型的局部变量中。

浮点运算

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0x62 fadd 将栈顶两float类型数相加,结果入栈。
0x66 fsub 将栈顶两float类型数相减,结果入栈。
0x6a fmul 将栈顶两float类型数相乘,结果入栈。
0x6e fdiv 将栈顶两float类型数相除,结果入栈。
0x72 frem 将栈顶两float类型数取模,结果入栈。
0x76 fneg 将栈顶float类型值取反,结果入栈。
0x63 dadd 将栈顶两double类型数相加,结果入栈。
0x67 dsub 将栈顶两double类型数相减,结果入栈。
0x6b dmul 将栈顶两double类型数相乘,结果入栈。
0x6f ddiv 将栈顶两double类型数相除,结果入栈。
0x73 drem 将栈顶两double类型数取模,结果入栈。
0x77 dneg 将栈顶double类型值取负,结果入栈。

逻辑运算——移位运算

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0x78 ishl 左移int类型值。
0x79 lshl 左移long类型值。
0x7a ishr 算术右移int类型值。
0x7b lshr 算术右移long类型值。
0x7c iushr 逻辑右移int类型值。
0x7d lushr 逻辑右移long类型值。

逻辑运算——按位布尔运算

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0x73 iand 对int类型按位与运算。
0x7f land 对long类型的按位与运算。
0x80 ior 对int类型的按位或运算。
0x81 lor 对long类型的按位或运算。
0x82 ixor 对int类型的按位异或运算。
0x83 lxor 对long类型的按位异或运算。

控制流指令——条件跳转指令

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0x99 ifeq branchbyte1branchbyte2 若栈顶int类型值为0则跳转。
0x9a ifne branchbyte1branchbyte2 若栈顶int类型值不为0则跳转。
0x9b iflt branchbyte1branchbyte2 若栈顶int类型值小于0则跳转。
0x9e ifle branchbyte1branchbyte2 若栈顶int类型值小于等于0则跳转。
0x9d ifgt branchbyte1branchbyte2 若栈顶int类型值大于0则跳转。
0x9c ifge branchbyte1branchbyte2 若栈顶int类型值大于等于0则跳转。
0x9f if_icmpeq branchbyte1branchbyte2 若栈顶两int类型值相等则跳转。
0xa0 if_icmpne branchbyte1branchbyte2 若栈顶两int类型值不相等则跳转。
0xa1 if_icmplt branchbyte1branchbyte2 若栈顶两int类型值前小于后则跳转。
0xa4 if_icmple branchbyte1branchbyte2 若栈顶两int类型值前小于等于后则跳转。
0xa3 if_icmpgt branchbyte1branchbyte2 若栈顶两int类型值前大于后则跳转。
0xa2 if_icmpge branchbyte1branchbyte2 若栈顶两int类型值前大于等于后则跳转。
0xc6 ifnull branchbyte1branchbyte2 若栈顶引用值为null则跳转。
0xc7 ifnonnull branchbyte1branchbyte2 若栈顶引用值不为null则跳转。
0xa5 if_acmpeq branchbyte1branchbyte2 若栈顶两引用类型值相等则跳转。
0xa6 if_acmpne branchbyte1branchbyte2 若栈顶两引用类型值不相等则跳转。

控制流指令——比较指令

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0x94 lcmp 比较栈顶两long类型值,前者大,1入栈;相等,0入栈;
后者大,-1入栈。
0x95 fcmpl 比较栈顶两float类型值,前者大,1入栈;相等,0入栈;
后者大,-1入栈;有NaN存在,-1入栈。
0x96 fcmpg 比较栈顶两float类型值,前者大,1入栈;相等,0入栈;
后者大,-1入栈;有NaN存在,-1入栈。
0x97 dcmpl 比较栈顶两double类型值,前者大,1入栈;相等,0入栈;
后者大,-1入栈;有NaN存在,-1入栈。
0x98 dcmpg 比较栈顶两double类型值,前者大,1入栈;相等,0入栈;
后者大,-1入栈;有NaN存在,-1入栈。

控制流指令——无条件跳转指令

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0xa7 goto branchbyte1branchbyte2 无条件跳转到指定位置。
0xc8 goto_w branchbyte1branchbyte2branchbyte3branchbyte4 无条件跳转到指定位置(宽索引)。

控制流指令——表跳转指令

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0xaa tableswitch <0-3bytepad>
defaultbyte1
defaultbyte2
defaultbyte3
defaultbyte4
lowbyte1
lowbyte2
lowbyte3
lowbyte4
highbyte1
highbyte2
highbyte3
highbyte4
jump offsets…
通过索引访问跳转表,并跳转。
0xab lookupswitch <0-3bytepad>
defaultbyte1
defaultbyte2
defaultbyte3
defaultbyte4
npairs1
npairs2
npairs3
npairs4
match offsets
通过键值访问跳转表,并跳转。

控制流指令——异常和**finally**

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0xbf athrow 抛出异常。
0xa8 jsr branchbyte1branchbyte2 跳转到子例程序。
0xc9 jsr_w branchbyte1branchbyte2branchbyte3branchbyte4 跳转到子例程序(宽索引)。
0xa9 (wide)ret indexbyte 返回子例程序

对象操作指令

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0xbb new indexbyte1indexbyte2 创建新的对象实例。
0xc0 checkcast indexbyte1indexbyte 类型强转。
0xc1 instanceof indexbyte1indexbyte2 判断类型。
0xb4 getfield indexbyte1indexbyte2 获取对象字段的值。
0xb5 putfield indexbyte1indexbyte2 给对象字段赋值。
0xb2 getstatic indexbyte1indexbyte2 获取静态字段的值。
0xb3 putstatic indexbyte1indexbyte2 给静态字段赋值。

数组操作指令

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0xbc newarray atype 创建type类型的数组。
0xbd anewarray indexbyte1indexbyte2 创建引用类型的数组。
0xbe arraylength 获取一维数组的长度。
0xc5 multianewarray indexbyte1indexbyte2dimension 创建dimension维度的数组。

方法调用指令

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0xb7 invokespecial indexbyte1indexbyte2 编译时方法绑定调用方法。
0xb6 invokevirtual indexbyte1indexbyte2 运行时方法绑定调用方法。
0xb8 invokestatic indexbyte1indexbyte2 调用静态方法。
0xb9 invokeinterface indexbyte1indexbyte2count0 调用接口方法。

方法返回指令

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0xac ireturn 返回int类型值。
0xad lreturn 返回long类型值。
0xae freturn 返回float类型值。
0xaf dreturn 返回double类型值。
0xb0 areturn 返回引用类型值。
0xb1 return void函数返回。

线程同步指令

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0xc2 monitorenter 进入并获得对象监视器。
0xc3 monitorexit 释放并退出对象监视器。

java泛型

java泛型

Java从1.5之后支持泛型,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。

1.类型安全。泛型的主要目标是提高Java程序的类型安全。通过知道使用放心定义的变量的类型限制,并且可以在一个高得多的成熟度上验证类型。假设如果没有反省,这些假设就只存在于程序员的头脑中消除强制。一类型安全范畴的主要目标是提高Java程序的类型安全通过知道使用放心定义的变量的类型限制,并且可以在一个高得多的成熟度上验证类型。假设如果没有反省,这些假设就只存在于程序员的头脑中。

2.消除强制类型转换翻新的一个附带的好处,是消除源代码中,许多强制类型转换,这使得代码更加可读,并且减少了出错的机会,

3000赞的性能收益饭行为较大的优化带来了可能在梵行的初始视线中,编译器将强制类型。消除强制类型转换翻新的一个附带的好处,是消除源代码中,许多强制类型转换,这使得代码更加可读,并且减少了出错的机会,3000赞的性能收益饭行为较大的优化带来了可能在梵行的初始视线中,编译器将强制类型。

dubbo架构设计

dubbo架构设计

image-20200821100631881

淡蓝色是服务提供者使用到的接口,淡绿色是服务消费者使用接口,中轴线上是双方都用到的接口。

从下至上分为十层,各层均为单向依赖,右边的黑色箭头代表之间的依赖关系,每一层都可以剥离上层被复用,其中,Service和Config层为API,其他各层均为SPI。

绿色小块的为扩展接口,蓝色小块为实现类

蓝色虚线为初始化过程,即启动时组装链,红色实线为方法调用过程,即运行是调用链,紫色三角箭头为继承

config配置层:对外配置接口,以ServiceConfig,ReferenceConfig为中心,可以直接初始化配置类,也可以通过spring解析配置生成配置类

proxy服务代理层

registry注册中心层

cluster路由层

monitor监控层

ptotocol远程调用层

exchange信息交换层

transport网络传输层

serialize 数据序列化层