分布式事务
2、3pc
tcc
可靠消息最终一致性
最大努力通知
总结
1)最大努力通知VS 可靠消息最终一致性
向上管理
态度 》 能力
沟通 》 抱怨
大局 》 细节
汇报进度
寻求知道
成长答疑
先完成后完美
分布式事务-独立消息服务+MQ
追溯业务执行状态的接口
说一下jvm
那我从java代码编译开始说吧。通过编译器将我们这个java代码编译成class文件。其实这一步他最终的目的是为了给类加载器提供一个可以加载的二进制文件。在这个阶段,java架构设计把这个阶段作为第一个阶段,也是比较重要的一个阶段,因为class文件编译之后,所有代码相关的字面量、符号引用、包括代码转字节码指令这些东西都会在这个阶段进行一个规整。从class文件结构来说,它通过一个比较紧凑的固定的这样结构进行排布。比如说魔术主次版本号他可以定位一文件的一个规范性和可加载性。常量池他为整个的一个class文件中的方法、字段、修饰符、类引用、符号引用提供了一个常量的存放位置。访问标志给我们的这个方法和类提供了访问权限。比如说public这种东西。
类索引、父类索引、接口类索引能够展示出类的一个继承结构。字段表方法表描述的描述了一些字段信息、方法信息,包括字段和方法的返回类型,访问权限等。属性表提供了一些更多的相关信息。比如我们的code属性。就代表了我们真正的一个代码的真正的执行逻辑,还有一些Exception属性,就是我们抛出的一些异常。那么这些存储结构和存储方法,直接决定了代码价值及运行过程中的一个提取方式,所以说他是比较重要的一步。拿属性表里的code属性来说,编译完成的code其实会转化为字节码指令,他并不是我们所想象的把abc转化为字节或者二进制,他其实是真正的去操作一个字节码指令。比如c=a+b,ab最终会以一个提取字节码指令,这个字节码指令就是iload,然后在将ab压入操作数经过加操作后最后通过istore把值赋给c。也就是说它会把他们都编译成这种我们读不懂的字节码指令。然后在线程运行的过程中,在线程的栈里的栈帧里的操作数栈里进行一个字节码指令的出入栈操作。
设计完class文件之后呢,就需要将我们的class文件加载到我们的jvm里面,所以java需要设计类加载器,就是双亲委派机制。包括启动类、拓展类、应用类、自定义类加载器。他采用双亲委派的原因是可以通过类加载器和类的全路径名共同保证一个类的唯一性,保证了类加载的安全性。
类加载过程中会class文件的这个存储结构进行校验。比如刚才说的魔术,版本号。
包含后续的准备阶段,把我们静态变量初始化为它的一个原始值
解析阶段把这个class文件里边的符号引用转换为直接引用。
初始化阶段的clinit方法则把一个静态变量的值修改为用户的目标值。
所以这些操作都是基于class文件存储结构进行的一个信息提取,然后在进行一下步的动作。
而加载完成之后了这个class文件它不能仅仅以静态的class文件存储在服务器里,它需要被加载到jvm的方法区里。
当创建对象的时候,创建的对象数据是存储在堆里,而方法直接的调用,包括本地方法则会使用到虚拟机栈和本地方法栈。
程序计数器就是为我们的方法栈进行计数,目前程序执行到哪一块。
随着程序的执行,对象不断创建导致栈的使用率变大,这个时候就需要垃圾收集。针对不同的代,使用复制、标清、标理进行垃圾收集。针对不同的场景,选择不同的垃圾收集,针对具体的业务,设置一些具体的参数。整个阶段我两个部分是重要,