- 博客(149)
- 资源 (2)
- 收藏
- 关注
原创 HotSpot虚拟机之内存模型与线程安全
共享变量如:实例字段、静态字段、数组元素等线程共享变量(不包含线程私有变量)。内存模型中有:主内存、工作内存,如下图所示是两者交互关系,看出。
2023-08-20 14:45:23
422
原创 HotSpot虚拟机之后端编译与优化
输出代码优化质量的高低决定编译器是否优秀的关键,编译器分为:前端编译器(将Java源码转变成字节码的过程,只完成源码到抽象语法树或字节码的生成,如:javac命令)、后端编译器(完成代码优化及字节码生成本地机器码的过程,如:即时编译、提前编译都是后端编译器)。:虽然以整个方法作为编译对象,但是执行入口(从方法第几条字节码指令)不同,编译时会传入执行入口点字节码序号。,为了提高效率,则提前编译器编译后提前保存(即时编译缓存),运行时则直接加载使用。a.运行时,即时编译的目标是“热点代码”,有更好的优化;
2023-08-16 09:55:04
339
原创 HotSpot虚拟机之类加载过程及类加载器
step5:否则,查找失败,则抛出java.lang.NoSuchMethodError;step6:查找成功后,是否对该方法有访问权限,否则抛出:java.lang.IllegalAccessError。接口方法当前代码处在D类,根据未解析的符号引用N去解析方法(方法所属的接口C),步骤如下:step1:首先解析D方法表class_index的索引CONSTANT_Class_info类进行解析(字段所在的类解析),
2023-08-13 14:46:57
286
原创 HotSpot虚拟机之Class文件及字节码指令
Class文件格式如下表所示,主要有:常量池、字段表、方法表、属性表等。Class文件、字段、方法都有自己的属性,这些属性存储到属性表(attribute_info),《Java虚拟机规范》允许属性只要不重名,任何编译器都可以添加自己的属性信息。javac编译过程:一个准备(初始化插入式注解处理器);a.i代表int、l代表long、s代表short、b代表byte、c代表char、f代表float、d代表double、(byte、short、char、boolean、int型返回使用ireturn)
2023-08-04 20:33:45
248
原创 HotSpot虚拟机参数配置及优化
2.user:进程执行用户态(User Mode)所耗费的处理器时间(此进程实际CPU时间、其他进程和此进程阻塞时间不包括);2.代码根所引用的存活对象,从一个Region迁移到了另外的Region,更新迁移对象的引用。2.Region增加,垃圾的存活时间更长,GC间隔更长,但每次GC的时间也会更长。1.回收线程的启动时间,该值 = JVM进程启动时间点 - 当前时间点;下图是VisualVM的Visual GC插件的监控图。回收线程的结束时间,该值 = JVM进程启动时间点 - 当前时间点;
2023-06-15 20:23:44
951
原创 HotSpot虚拟机垃圾回收算法及收集器
如下表所示,垃圾回收算法总结。算法特点标记-清除1.标记存活的对象,统一回收所有未被标记的对象;2.最基础的收集算法;内存碎片化,大对象分配时没有足够连续空间,则提前触发GC;对象数量增加时,标记和清除两个过程执行效率低4.适用:老年代;5.采用该算法收集器:CMS。标记-复制1.“半区复制”:内存按大小相等分两块(使用一块;存活对象复制到另一块);2.“Appel式回收”:新生代分为一个Eden区、两个Survivor区(每次可用一个Eden区、一个Survivor区;
2023-06-07 19:39:30
874
原创 HotSpot虚拟机OutOfMemoryError异常
HotSpot虚拟机把内存分为不同的数据区域,有的区域随JVM启动而一直存在(线程共享区域),有的区域随用户线程启动和结束而建立和销毁(线程私有区域),如下图所示。JVM:-XX:MetaspaceSize=64M -XX:MaxMetaspaceSize=128M,如下代码所示。JVM配置:-Xms20M -Xmx20M -XX:+HeapDumpOnOutOfMemoryError,如下代码所示。下图所示是堆外内存,由参数-XX:MaxDirectMemorySize决定大小,没有配置该参数时,
2023-05-29 20:31:19
780
原创 同一热卖商品的高并发写难题 - Lua脚本扣减库存方案
org.springframework.data.redis.core.script.DefaultRedisScript#getSha1获取Lua脚本的校验码,是对Lua脚本的预加载,首次执行生成SHA的校验码,第二次执行无需生成校验码。通常来说,秒杀场景的爆款商品库存数量相对较少,当发生库存扣减操作时,实际上落到数据库中的写流量很小,只要系统上游能够配合交易系统做好限流保护,数据库基本上不会有太大的负载压力,但大库存的限时抢购场景就恰恰相反了。若采用分布式锁,该方案太重,并发量上不去。
2023-04-19 22:01:11
1565
原创 全链路压测时动态路由数据源MySQL、MongoDB、Redis
目录一、全链路压测二、动态路由Mysql1. 参数配置application-localDynamic.yml2. 加载配置参数DynamicDataSourceProperties.java3. 动态数据源DynamicDataSource.java4. 动态数据源供应DynamicDataSourceProvider.java5. 动态数据源bean6. 动态数据源上下文DynamicDataSourceContextHolder.java7. 动态数据源过滤器DynamicDataSourceFilt
2023-04-13 21:31:08
1288
原创 RocketMQ5.0.0顺序消息
本章介绍RocketMQ支持顺序消息的实现机制,有加锁完成。消费端负载均衡后,向Broker端发送给分配到的消费队列加锁请求,加锁成功后才能拉取消息。拉取的消息不是直接消费,而是放入消费队列中再消费。消费时,消费队列加锁,使得多个消费者同一时间,只能是一个消费者再消费。
2023-03-24 21:57:55
1290
原创 RocketMQ5.0.0定时消息
本章节介绍延迟消息的概览,及实现机制。根据延迟级别来创建不同的定时任务,延迟到延迟级别对应的延迟时间,进行还原原始主题和消费队列,再次存储到commitlog文件中,供消费者消费。
2023-03-18 13:30:41
2123
原创 RocketMQ5.0.0消息消费<三> _ 消息消费
本章节介绍PUSH模式下的消息拉取及负载均衡后的消息消费。消费线程池消费消息失败后,进行消息ACK确认,进入重新消息队列。消息成功后,根据广播/集群模式更新消费进度。
2023-03-14 19:24:58
617
原创 RocketMQ5.0.0消息消费<二> _ 消息队列负载均衡机制
本章介绍了消费者负载均衡,给消费者分配消费队列。消费者启动后,会启动MQClientInstance实例,从而启动负载均衡线程,每20s周期执行重新分配,进而对分配的消费队列是否变化进行消费进度修改,重新拉取消息。同时也介绍了不同的负载均衡策略。
2023-03-09 20:09:06
1000
原创 RocketMQ5.0.0消息消费<一> _ PUSH模式的消息拉取
本章节介绍消费者订阅主题及消费者启动后,PUSH模式下的消息拉取机制。PUSH模式是基于拉模式的,消费者周期执行拉取消息任务。同时介绍了消息拉取长轮询机制,Broker的两种处理方式。
2023-03-05 21:57:23
1632
原创 RocketMQ5.0.0事务消息
介绍事务消息利用两阶段提交和Broker定时回查来实现事务消息机制,事务监听器保存本地事务及事务状态回查的两个方法,生产者触发结束事务及Broker定时回查状态来结束事务等机制。
2023-03-02 19:26:28
968
2
原创 RocketMQ5.0.0的Broker主从同步机制
本章节介绍RocketMQ的主从同步机制实现,其主/从Broker启动流程相同,根据配置角色来决定是否执行HA同步。
2023-02-23 22:01:02
2283
原创 RocketMQ5.0.0消息存储<五>_文件过期删除机制
介绍了RocketMQ为什么采用文件过期机制,文件过期机制实现就是利用定时任务执行删除文件,或磁盘不足进行强制删除等。删除过期文件的三个触发条件:指定定时时间删除文件、磁盘不足、人工执行删除命令。
2023-02-18 22:22:39
1637
原创 RocketMQ5.0.0消息存储<四>_刷盘机制
本章节介绍RocketMQ的刷盘机制,分为同步刷盘和异步刷盘两种,默认异步刷盘方式。异步刷盘根据是否开启堆外内存池进行不同的刷盘策略。
2023-02-15 21:55:33
850
原创 RocketMQ5.0.0消息存储<三>_消息转发与恢复机制
本章介绍Broker提交消息后,进行消息转发的介绍。消息异步转发来构建ConsumeQueue、IndexFile文件,供消费者消息。Broker根据abort文件来判定是否正常退出,来采取不同的恢复策略来修复ConsumeQueue、IndexFile文件,到达消息数据一致性的目的。
2023-02-12 19:24:15
812
原创 RocketMQ5.0.0消息存储<二>_消息存储流程
介绍消息生产者发送消息后,Broker接收消息时处理流程,主要讲解同步或异步的区别,消息commit操作(追加消息到文件内存映射中),如何刷盘与HA同步将后续介绍。
2023-02-09 20:01:46
849
原创 RocketMQ5.0.0消息存储<一>_存储文件及内存映射
介绍RocketMQ的Brokder存储文件,不同存储文件的作用,及加载文件到内存映射。同时介绍了commit与flush操作的区别
2023-02-07 19:44:43
1649
原创 RocketMQ5.0.0路由中心NameServer
介绍NameServer的注册中心作用,Broker定时任务发送心跳包给NameServer,NameServer是消息存储Broker、生产者、消费者、从Broker的连接桥梁。
2023-01-15 19:58:50
1396
原创 B+树结构与索引<一> _ 结构与索引
介绍了MySQL的B+树索引算法及B+的插入/删除操作,B+索引类型及对比,MySQL对索引的管理和使用
2022-08-30 21:14:36
1521
原创 py_innodb_page_info.py工具使用
py_innodb_page_info.py工具是《MySQL技术内幕 InnoDB存储引擎》作者姜承尧写的用来分析表空间中的各页的类型和信息
2022-07-31 21:25:02
901
原创 《Java并发编程的艺术》总结
目录一、总结第一章 并发编程的挑战第二章 Java并发机制的底层实现原理第三章 Java内存模型第四章 Java并发编程基础第五章 锁Lock第六章 Java并发容器和框架第七章 原子操作类第八章 并发工具类第九/十章 线程池及Executor框架二、参考资料一、总结第一章 并发编程的挑战第二章 Java并发机制的底层实现原理第三章 Java内存模型第四章 Java并发编程基础第五章 锁Lock第六章 Java.
2022-06-26 19:39:30
212
原创 Java的原子操作类和并发工具类
一、原子操作类java.util.concurrent.atomic包下提供了一系列的原子操作类,主要包含:原子更新基本类型、原子更新数组、原子更新引用、原子更新类的属性。这些类都具有线程安全性,其底层实现基本上使用Unsafe实现的包装类,完成自旋和CAS操作。1. 类型总结作用 实现类 特点 原子更新 基本类型 AtomicBoolean AtomicInteger AtomicLong 1. 只能...
2022-04-29 20:48:37
787
2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人