RPC调用

  • 多个服务协同完成一次业务时,由于业务约束(如红包不符合使用条件、账户余额不足等)、系统故障(如网络或系统超时或中断、数据库约束不满足等),都可能造成服务处理过程在任何一步无法继续,使数据处于不一致的状态。传统的基于数据库本地事务的解决方案只能保障单个服务的一次处理具备原子性、隔离性、一致性与持久性,但无法保障多个分布服务间处理的一致性

  • 分析源代码,基本原理如下:

    • client 一个线程调用远程接口,生成一个唯一的 ID (比如一段随机字符串,UUID 等) , Dubbo 是使用 AtomicLong 从 0 开始累计数字的
    • 将打包的方法调用信息(如调用的接口名称,方法名称,参数值列表等),和处理结果的回调对象 call back ,全都封装在一起,组成一个对象 0bject
    • 向专门存放调用信息的全局 ConcurrentHashMap 里面 put ( ID , object )
    • 将 ID 和打包的方法调用信息封装成一对象 connRequest ,使用 Iosession.write ( connRequest )异步发送出去
    • 当前线程再使用call back 的get()方法试图获取远程返回的结果,在 get()内部,则使用 Synchronized 获取回调对象 caIlback 的锁,再先检测是否已经获取到结果,如果没有,然后调用 callbaCk 的 wait()方法,释放 callback 上的锁,让当前线程处于等待状态
    • 服务端接收到请求并处理后,将结果(此结果中包含了前面的 ID ,即回传)发送给客户端,客户端 socket连接上专门监听消息的线程收到消息,分析结果,取到 ID ,再从前面的ConcurrentHashMap里面 get(ID) ,从而找到 callback ,将方法调用结果设置到 callback 对象里
    • 监听线程接着使用 synchronized 获取回调对象 callback 的锁(因为前面调用过 wait ( ) ,那个线程已释放 callback 的锁了),再 notlfyAll ( ) ,唤醒前面处于等待状态的线程继续执行( call back 的 get ( )方法继续执行就能拿到调用结果了),至此,整个过程结束
  • 当前线程怎么让它暂停,等结果回来后,再向后执行?

    • 先生成一个对象obj ,在一个全局 map 里 put ( 1D obj )存放起来,再用synchronized获取obj锁,再调用obj.wait()让当前线程处于等待状态,然后另一消息监听线程等到服务端结果来了后,再 map.get (ID )找到 obj ,再用 synchronized获取obj 锁,再调用obj.notifyAll唤配前面处于等待状态的线程
    • Socket 通信是一个全双工的方式,如果有多个线程同时进行远程方法调用,这时建立在client server之间的socket连接上会有很多双方发送的消息有传递,前后顺序也可能是乱七八嘈的,server处理完结果后,将结果消息发送给 client, client收到很多消息,怎么知道消息结果是原先哪个线程调用的? 使用一个ID ,让其唯一,然后传递给服务端,再服务端又回传回来,这样就知道结果是原先哪个线程的了

GC垃圾回收

大多数刚创建的对象会被分配在Eden区,当Eden区满的时候,执行Minor GC,将消亡的对象清理掉,并将剩余的对象复制到一个存活区Survivor0,当Survivor0也满的时候,将其中仍然活着的对象直接复制到Survivor1,以后Eden区执行Minor GC后,就将剩余的对象添加Survivor1,当两个存活区切换了几次(HotSpot虚拟机默认15次,用-XX:MaxTenuringThreshold控制,大于该值进入老年代)之后,仍然存活的对象将被复制到老年代

年轻代收集器

  • Serial收集器:“停止-复制”算法,单线程,进行垃圾收集时必须暂停其他线程的所有工作
  • ParNew收集器:Serial收集器的多线程版本,“停止-复制”算法,多线程
  • Parallel Scavenge收集器:”停止-复制“算法,并行的多线程收集器,可控制的吞吐量

老年代收集器

  • Serial Old:Serial收集器的老年代版本,同样是一个单线程收集器,使用“标记-整理”算法
  • Parallel Old收集器:Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法
  • CMS收集器:CMS(Conrrurent Mark Sweep)收集器是以获取最短回收停顿时间为目标的收集器,使用"标记-清除"算法

CMS收集器

  • 初始标记:标记GCRoots能直接关联到的对象,时间很短
  • 并发标记:进行GCRoots Tracing(可达性分析)过程,时间很长
  • 重新标记:修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,时间较长
  • 并发清除:清除未标记(无关联引用)的对象,伴随着用户线程的执行,清除后会产生浮动垃圾
  • 优缺点:对CPU资源非常敏感,可能会导致应用程序变慢,吞吐率下降,无法处理浮动垃圾,采用的“标记-清除”算法,会产生大量的内存碎片

垃圾回收算法实现

  • 停止-复制算法:将内存分为两块,当其中一块内存用完了,将还存活着的对象复制到另一块中,再将使用过的内存一次性清理掉
  • 标记-清除算法:首先标记出所有需要回收的对象,标记完成后统一回收所有被标记的对象
  • 标记-整理算法:让所有存活对象都向一端移动,然后直接清理掉边界以外的内存

RPC调用与GC垃圾回收的更多相关文章

  1. 数往知来C#之接口 值类型与引用类型 静态非静态 异常处理 GC垃圾回收 值类型引用类型内存分配<四>

    C# 基础接口篇 一.多态复习 使用个new来实现,使用virtual与override    -->new隐藏父类方法 根据当前类型,电泳对应的方法(成员)    -->override ...

  2. GC垃圾回收

    我们在开发需求的时候,可能很少关注到垃圾回收,因为我们绝大多数的时候都是使用的托管资源,托管资源的内存回收.net已经帮我们做了,但是.net的内存回收不是实时的,所以我们还是要关注下.net的垃圾回 ...

  3. JVM和GC垃圾回收机制和内存分配

    JVM运行期间 线程共享 线程私有 线程共享: 方法区 堆方法区:存放可以共享数据,静态常量,类的共有方法属性字段等,可以共享的存在方法区. 堆:存放class对象 . 线程私有:本地方法栈 虚拟机栈 ...

  4. Java虚拟机笔记(二):GC垃圾回收和对象的引用

    为什么要了解GC 我们都知道Java开发者在开发过程中是不需要关心对象的回收的,因为Java虚拟机的原因,它会自动回收那些失效的垃圾对象.那我们为什么还要去了解GC和内存分配呢? 答案很简单:当我们需 ...

  5. java面试题之----JVM架构和GC垃圾回收机制详解

    JVM架构和GC垃圾回收机制详解 jvm,jre,jdk三者之间的关系 JRE (Java Run Environment):JRE包含了java底层的类库,该类库是由c/c++编写实现的 JDK ( ...

  6. 乐字节Java|GC垃圾回收机制、package和import

    本文接上一篇:乐字节Java|this关键字.static关键字.block块.本文是接着讲述JavaGC垃圾回收机制.package 和 import语句. 一.GC垃圾回收机制 GC全名:Garb ...

  7. 计时器 GC垃圾回收 demo

    计时器: public void start() { //定义计时器 Timer timer=new Timer(); //定义运行间隔(数字越小,速度越快) int interval=30; //创 ...

  8. Java学习之二(线程(了解) JVM GC 垃圾回收)

    线程与进程(了解)→JVM→字节码→GC 一.程序 = 算法 + 数据结构(大佬) 二.程序 = 框架 + 业务逻辑(现实) 1.线程与进程.同步与异步 1.1进程是什么? 进程就是操作系统控制的基本 ...

  9. JVM虚拟机 与 GC 垃圾回收

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.JVM体系结构概述 1.JVM 与系统.硬件 ​ JVM是运行在操作系统之上的,它与硬件没有直接的交 ...

随机推荐

  1. struts2 简单注解配置代替xml配置文件

    1. 主要文件 LoginAction.javapackage com.edu.struts2.action;import org.apache.struts2.convention.annotati ...

  2. 2018年1月20日上海MVP线下技术分享会纪实

    1月20日正值大寒节气,在微软MVP朱兴亮的组织牵头下,上海MVP自发举办了题为<跟社区专家一起聊聊混合云.领域驱动.区块链和数字营销>的技术交流会.四名来自上海的MVP分别在自己擅长的技 ...

  3. Android Studio升级3.2.1后的合并XML出错的解决方案

    升级到3.2.1版本之后,遇到了合并XML出错的问题.错误内容大概如下: 当大家看到这个问题的时候,可能会有一行是可以点击的文件目录,点击到报错的地方. 如果没有可以点击的地方,也可以根据目录和 “行 ...

  4. 文本编辑器 EditPlus 的激活与设置

    说明 1.EditPlus是Windows的文本编辑器,具有内置的FTP,FTPS和sftp功能.虽然它可以作为一个很好的记事本替代品,但它也为网页作者和程序员提供了许多强大的功能. 2.语法高亮显示 ...

  5. Kali学习笔记17:OpenVAS安装部署

    正式介绍OpenVAS之前先说一些题外话 1.有一个网站记录了很多的漏洞: https://www.exploit-db.com/ 可以下载利用 2.如果觉得从网上寻找太麻烦,Kali自带工具:sea ...

  6. 数据结构图解(递归,二分,AVL,红黑树,伸展树,哈希表,字典树,B树,B+树)

    递归反转 二分查找 AVL树 AVL简单的理解,如图所示,底部节点为1,不断往上到根节点,数字不断累加. 观察每个节点数字,随意选个节点A,会发现A节点的左子树节点或右子树节点末尾,数到A节点距离之差 ...

  7. Python中变量的命名

    变量的命名 目标 标识符和关键字 变量的命名规则 0.1 标识符和关键字 1.1 标识符 标示符就是程序员定义的 变量名.函数名 名字 需要有 见名知义 的效果,见下图: 标示符可以由 字母.下划线 ...

  8. python高级-深浅拷贝(16)

    一.浅拷贝 浅拷贝是对一个对象的顶层拷贝,通俗地讲就是:拷贝了引用,并没有拷贝内容. a = [1,2,3] print(id(a)) b=a print(b) print(id(b)) a.appe ...

  9. python之获取当前操作系统(平台)

    Python在不同环境平台使用时,需要判断当前是什么系统,比如常用的windows,linux等 下面介绍一些能够获取当前系统的命令 1.使用sys.platform获取 #!/usr/bin/env ...

  10. sql server 索引阐述系列一索引概述

    一. 索引概述 关于介绍索引,有一种“文章太守,挥毫万字,一饮千钟”的豪迈感觉,因为索引需要讲的知识点太多.在每个关系型数据库里都会作为重点介绍,因为索引关系着数据库的整体性能, 它在数据库性能优化里 ...