自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(80)
  • 收藏
  • 关注

原创 AQS框架

AQS:抽象队列同步器,定义了一套多线程访问共享资源的同步器框架,提供了SDK层面的锁机制,JUC中的很多类譬如:ReentrantLock/Semaphore/CountDownLatch…等都是基于它。AQS用一个;属性表示锁状态getState(),其中CAS方法是核心。框架内部维护了一个FIFO的等待队列,是用双向链表实现的,我们称之为CLH队列框架也内部也实现了条件变量Condition,用它来实现等待唤醒机制,并且支持多个条件变量。

2024-08-06 14:38:32 907

原创 Springboot自动装配源码分析

在spring中,使用xml的方式将定义的bean加载到ioc容器中是最原始的定义方式,3.x 后,支持注解来加载bean。注意的是,在代码中加载的时候并不是全部加载这些配置类,而是根据bean的加载条件进行加载,这时候。在ioc容器的处理过程,后置处理器。在这个注解下我们需要关注两个注解。此处是去获取真正自动配置类的集合。在测试用例中,用到的。

2024-07-23 21:24:21 272

原创 Springboot源码——七大步骤详解

这个方法是空方法,子类会对他进行实现,而tomcat的启动就是在子类的实现中触发的。创建并配置SpringBoot应用将要使用的Environment。这里的监听器,就是监听SpringBoot的整个启动流程,实现了。接口,就可以完成监听,在启动的不同阶段,可以执行到不同的方法。ioc容器初始化,同时启动tomcat。方法,该方法会调用到,

2024-07-23 09:33:12 435

原创 Springboot源码——启动流程分析

ConfigurableApplicationContext 类关系如如下。自己的定义的spring.factories中得类也会被加载到。在第六步中会进入到ico的。中会启动tomcat容器。其中在第五步,会调注册。

2024-07-22 16:53:00 339

原创 Spring声明式事务源码分析

它实现了SmartInstantiationAwareBeanPostProcessor,说明这是⼀个后置处理器,⽽且跟spring AOP 开启@EnableAspectJAutoProxy 时注册的 AnnotationAwareAspectJProxyCreator实现的是同⼀个接⼝,所以说,声明式事务是 springAOP 思想的⼀种应⽤。:在业务代码中添加事务控制代码,这样的事务控制机制就叫做编程式事务。:通过xml或者注解配置的⽅式达到事务控制的⽬的,叫做声明式事务。上述组件如何关联起来的?

2024-07-18 15:27:29 1114

原创 Spring AOP源码分析

方法,从而会推进责任链方法进行推进,比如前置通知。触发了bean的后置处理器的调用。以上就是代理方法的执行流程。上面可以看出,每次都会调用。方法时,会直接进入到。

2024-07-18 14:55:00 387

原创 SpringMVC源码分析

是,首先会经过`javax.servlet.http.HttpServlet#service(javax.servlet.ServletRequest, javax.servlet.ServletResponse),在该方法中会调用。在web容器创建后,会调用到ioc容器的初始化方法。实现了该接口,进而在这个实现方法里面有调到了。,整个web容器便是在该方法中初始化完成。在ioc容器初始阶段的最后,会发布一个事件。监听到事件后,就开始初始化mvc的9大组件。方法,从而进行初始化,而·项目启动后,会先执行。

2024-07-10 21:13:49 915

原创 IoC源码分析——singleton bean创建与循环依赖

这里要注意的时,三级中A的会被移除,从而转移到二级缓存中,这里为什么要从三级缓存中移除呢?假如有个对象C也引用了A,并且对象A是需要创建动态代理的,如果不从3级缓存中进行移除,那么A对象就会被重复执行到三级缓存中的函数式接口,这样就是产生多个A的代理对象。从三级缓存中移除,并转移到二级缓存中,这样,当C也需要A时,直接从二级缓存中进行获取就可以了,就不会造成创建多个A对象的代理对象。

2024-07-10 15:12:04 702

原创 Ioc容器源码分析——BeanFactory后置处理

在Ioc初始化的整体流程上,本文主主要关注BeanFactory后置处理源码流程,该处理器,是IOC容器加载过程中的一个扩展点。是后置处理器的其中一个具体应用,他的作用是在BeanFactory后置处理器中,可以对占位符进行替换。这两个接口的bean,然后根据优先级进行排序,再触发调用。这两个接口的bean,然后根据优先级进行排序,再触发调用。上面两步处理完后,再处理只实现了。接下来从容器中获取同时实现了。接下来再容器中获取同时实现了。上面处理完后,再处理实现了。方法,是本文关注的重点。

2024-07-09 16:03:16 214

原创 分布式事务协议

TM首先发起所有的分支事务的try操作,任何一个分支事务的try操作执行失败,TM将会发起所有分支事务的Cancel操作,若try操作全部成功,TM将会发起所有分支事务的Confirm操作,其中Confirm/Cancel操作若执行失败,TM会进行重试。当没有调用参与方Try方法的情况下,就调用了二阶段的Cancel方法(比如调try时超时了,会接着调Cancel),Cancel方法需要有办法识别出此时Try有没有执行,如果Try还没执行,表示这个Cancel操作是无效的,即本次Cancel属于空回滚;

2024-06-06 15:19:03 803

原创 分布式架构与分布式理论

分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。所谓分布式系统,就是一个业务拆分成多个子业务,分布在不同的服务器节点,共同构成的系统称为分布式系统,同一个分布式系统中的服务器节点在空间部署上是可以随意分布的,这些服务器可能放在不同的机柜中,也可能在不同的机房中,甚至分布在不同的城市。分布式与集群的区别集群: 多个服务器做同一个事情分布式: 多个服务器做不同的事情。

2024-06-05 14:25:55 826

原创 java线程状态及线程相关常用方法

中定义),在任意一个时间点中,一个线程只能有且只有其中的一种状态,并 且可以通过特定的方法在不同状态之间转换。这两个超时方法表示,如果线程thread在给定的超时时间里没有终止,那么将会从该超时方法中返回。方法会释放对象的锁,进入 WaitSet 等待区,从而让其他线程就机会获取对象的锁。从上面的断点可以看出,执行了park方法的线程属于WAIT状态。方法的调用时不要求获取锁,调用后,并不会释放持有的锁。有时限的等待, 到 n 毫秒后结束等待,或是被。这两个方法时Object中的方法。

2024-06-04 15:03:26 891

原创 Redis的删除策略与内存淘汰

Redis过期删除策略是采用惰性删除和定期删除这两种方式组合进行的,惰性删除能够保证过期的数据我们在获取时一定获取不到,而定期删除设置合适的频率,则可以保证无效的数据及时得到释放,而不会一直占用内存数据。但是我们说Redis是部署在物理机上的,内存不可能无限扩充的,当内存达到我们设定的界限后,便自动触发Redis内存淘汰策略,而具体的策略方式要根据实际业务情况进行选取。

2024-06-03 16:11:31 777

原创 redis持久化

Redis 4.0 中提出了一个混合使用 AOF 日志和内存快照的方法。简单来说,内存快照以一定的频率执行,在两次快照之间,使用 AOF 日志记录这期间的所有命令操作。这样一来,快照不用很频繁地执行,这就避免了频繁 fork 对主线程的影响。而且,AOF 日志也只用记录两次快照间的操作,也就是说,不需要记录所有操作了,因此,就不会出现文件过大的情况了,也可以避免重写开销

2024-06-03 14:55:50 623

原创 HotSpot虚拟机的几个实现细节

安全点的设计似乎完美的解决了如何停顿用户线程,它能保证用户线程在执行时,不太长时间内就会遇到可进入垃圾回收的安全点,但是如果用户线程本身就没在执行呢?比如用户线程处于 sleep 或者 blocked 状态,这个时候它就无法响应虚拟机的中断请求,没办法主动走到安全的地方中断挂起自己,对于这种情况就必须引入安全区域( Safe Regin )来解决。安全区域是指能够确保在某一段代码片段之中, 引用关系不会发生变化,因此,在这个区域中任意地方开始垃圾收集都是安全的。我们也可以把安全区域看作被扩展拉伸了的安全

2024-05-27 10:38:54 327

原创 垃圾收集器

的值 来提高CMS的触发百分比, 降低内存回收频率, 获取更好的性能。:要实现这个目标,首先要有一个思想上的转变,G1收集器出现之前的其他所有收集器,他们的收集范围要么是新生代( Minor GC ),要么是老年代( Major GC ),要么是整堆( Full GC ),而G1跳出了这个樊笼,它可以面向堆内存任何部分来组成回收集( Collection Set , CSet )进行回收,衡量标准不再是它属于哪个分代,而是哪个回收集中存放的垃圾最多,回收收益最大,就回收哪个。垃圾收集器是算法的落地实现。

2024-05-26 18:06:00 781

原创 垃圾回收机制及算法

2、老年代回收( Major GC/Old GC ):指的是进行老年代的回收。在JDK1.2之后,Java对引用的概念做了扩充,将引用分为 强引用(Strong Reference) 、 软引用(Soft Reference) 、 弱引用(Weak Reference) 和 虚引用(Phantom Reference) 四种,这四种引用的强度依次递减。根据以上两个理论,朝生夕死的对象放一个区域,难回收的对象放另外一个区域,这个就构成了新生代和老年代,并且不同的分代采用的回收算法不一样。

2024-05-26 10:07:05 645

原创 jvm的类加载

除了上面的系统提供的3种loader,jvm允许自己定义类加载器,典型的在tomcat上:隔离加载类模块隔离,把类加载到不同的应用选中。比如tomcat这类web应用服务器,内部自定义了好几中类加载器,用于隔离web应用服务器上的不同应用程序。修改类加载方式除了Bootstrap加载器外,其他的加载并非一定要引入。根据实际情况在某个时间点按需进行动态加载。扩展加载源比如还可以从数据库、网络、或其他终端上加载防止源码泄露。

2024-05-26 07:20:05 910

原创 java中的对象

在 JVM 开启逃逸分析后,如果对象没有逃逸,结合对象的大小等因素决定对象分配在栈上。其本质是Java虚拟机提供的一项优化技术。**逃逸分析**JVM会分析对象的动态作用域,当一个对象在方法中定义后,它可能被外部所引用,称之为逃逸。比如:通过调用参数传递到其他方法中,称之为**方法逃逸**;赋值给其他线程中访问的变量,称之为**线程逃逸**。 从不逃逸到方法逃逸到线程逃逸,称之为对象由低到高的不同逃逸程度。开启逃逸分析需要配置以下参数:`XX:+DoEscapeAnalysis`,默认开启。

2024-05-25 15:16:29 920

原创 CAS操作

CAS 指令包含 3个参数:共享变量的内存地址 A、用于比较的值 B 和共享变量的新值 C;并且只有当内存中地址 A 处的值等于 B 时,才能将内存中地址 A 处的值更新为新值 C。CAS是项乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。利用CPU的CAS指令,同时借助JNI来完成Java的非阻塞算法,实现原子操作,其它原子操作都是利用类似的特性完成的。类型的CAS原子操作。

2024-05-23 15:01:59 583

原创 Java内存模型

在并发编程中,需要处理两个关键问题:**线程之间如何通信及线程之间如何同步**。Java虚拟机规范定义了一种Java内存模型(Java Memory Model,JMM)来**屏蔽各种硬件和操作系统的内容访问差异,以实现让java程序在各种平台下都能达到一致的内存访问效果**。Java 内存模型规范了 JVM 如何提供**按需禁用缓存和编译优化**的方法。具体来说,这些方法包括 `volatile`、`synchronized` 和 `final` 三个关键字,以及六项 Happens-Before 规

2024-05-23 14:23:22 1341 1

原创 synchronized及锁优化

1. synchronized是基于进入与退出监视器对象(Monitor)来实现的,每个java对象都有一个Monitor对象。2. Monitor依赖于操作系统底层实现3.开启偏向锁的情况下(默认是开启的),锁状态演化顺序为 偏向锁,轻量级锁,重量级锁4. 锁的各种优化措施,是为了避免线程从用户态进入到内核态,从而提高效率

2024-05-22 15:35:43 1013

原创 java线程池

在 HotSpot VM 的线程模型中,Java 线程被一对一映射为内核线程。Java 在使用线程执行程序时,需要创建一个内核线程;当该 Java 线程被终止时,这个内核线程也会被回收。因此 Java 线程的创建与销毁将会消耗一定的计算机资源,从而增加系统的性能开销。为了解决上述两类问题,Java 提供了线程池概念,线程池的作用总结如下:1. 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。2. 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。3. 提高线程

2024-05-21 17:03:29 519

原创 kafka防止消息丢失配置

kafka防止消息丢失最佳实践配置

2024-05-21 14:59:20 461

原创 Redis高可用

Redis有 两种不同的持久化方式, Redis 服务器通过持久化,把 Redis 内存中持久化到硬盘当中,当Redis 宕机时,我们重启 Redis 服务器时,可以由 RDB 文件或 AOF 文件恢复内存中的数据。此时单机Redis存在以下问题:1. 硬件发生故障时如何快速恢复数据?2. 单机存在容量瓶颈问题针对这些问题,redis提供了 复制(`replication`) 的功能, 通过"主从(一主多从)"和"集群(多主多从)"的方式对redis的服务进行水平扩展,用多台redis服务器共同构

2024-05-20 20:32:07 997

原创 redis基本数据结构与应用

scan 参数提供了三个参数,第一个是 cursor 整数值(hash桶的索引值),第二个是 key 的正则模式,第三个是一次遍历的key的数量(参考值,底层遍历的数量不一定),并不是符合条件的结果数量。如果在scan的过程中如果有键的变化(增加、 删除、 修改) ,那么遍历效果可能会碰到如下问题: 新增的键可能没有遍历到, 遍历出了重复的键等情况, 也就是说scan并不能保证完整的遍历出来所有的键, 这些是我们在开发时需要考虑的。redis基于该类型,提供了经纬度设置,查询,范围查询,距离查询,经纬。

2024-05-20 15:06:30 1153

原创 MySQL集群架构

在集群架构设计时,主要遵从下面三个维度- 可用性- 扩展性- 一致性**可用性设计**- 站点高可用,冗余站点- 服务高可用,冗余服务- 数据高可用,冗余数据

2024-05-19 09:40:43 952

原创 MySQL性能优化

数据库优化维度有4个:硬件升级、系统配置、表结构设计、SQL语句及索引。

2024-05-18 08:31:38 780

原创 插入死锁例子(二)

我们执行以下插入语句时,会在插入间隙上获取插入意向锁,而插入意向锁与间隙锁是冲突的,所以当其它事务持有该间隙的间隙锁时,需要等待其它事务释放间隙锁之后,才能获取到插入意向锁。而间隙锁与间隙锁之间是兼容的,所以两个事务中 select ... for update 语句并不会相互影响。

2024-05-10 15:44:15 641

原创 插入死锁案例(一)

如何尽量避免死锁发生1)不同的应用访问同一组表时,应尽量约定以相同的顺序访问各组表。对一个表而言,应尽量以固定的顺序存取表中的信息。这点真的很重要,它可以明显的减少死锁的发生。2)在主键等值更新的时候,尽量先查询看数据库中有没有满足条件的数据,如果不存在就不用更新,存在才更新。为什么要这么做呢,因为如果去更新一条数据库不存在的数据,一样会产生间隙锁。举例:如果表中只有id=1和id=5的数据,那么如果你更新id=3的sql,因为这条记录表中不存在,那就会产生一个(1,5)的间隙锁,但其实这个锁就是多余

2024-05-10 15:20:44 532

原创 Redis使用规范

在实际开发过程中,从性能或者规范的角度考虑,都需要给团队的成员制定使用redis的使用规范。防止出现例如,key的定义五花八门,危险命令代码中随便使用等情况。

2024-05-10 15:04:26 526

原创 Elasticsearch查询

es常用的高级查询语法,批量操作命令

2024-01-22 19:19:23 2301

原创 java虚拟机内存管理

根据 JVM 规范,JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。

2023-12-30 14:38:25 1231

原创 Elasticsearch基本使用

`Elasticsearch`是基于`Lucene`的全文检索引擎,本质也是存储和检索数据。ES中的很多概念与MySQL类似 可以按照关系型数据库的经验去理解。

2023-12-24 16:39:34 1553

原创 MySQL线上死锁案例分析

生产环境mysql死锁排查

2023-12-13 17:38:32 1396 2

原创 InnoDB的B+树索引(一)

回到我们最开始的问题,一条记录在 ``B+树``中是如何进行查找的?只要分为两大步骤:1. 找到该条记录所在的`页` - 从根节点出发,通过c1的值跟根页面中的目录项中的主键值进行比较,确认下一层级**内节点**的页号 - 在内节点中再次比较主键值 - 重复步骤2,直到找到叶子节点2. 在叶子节点中找到该条记录 - 通过二分法确定该记录所在的槽。 - 通过记录的next_record属性遍历该槽所在的组中的各个记录。假设所有存放用户记录的叶子节点数据页可以存放100条用户记录,存放目录项记

2023-12-04 11:43:42 1167

原创 InnoDB存储引擎中的锁

如果事务之间涉及到相同的数据项时,会使用排他锁,或叫互斥锁,先进入的事务独占数据项以后,其他事务被阻塞,等待前面的事务释放锁。上面的查询操作,对account表中的id = 1的记录增加了共享锁,其他事务依然可以查到该账户的余额,但是不能对账户余额进行修改,在某种场景下能够满足业务的需求。规定事务在等待的时候也需要在内存中生成一个锁结构,表明有事务想在某个间隙中插入新记录,但是现在在等待。,写操作针对的是最新版本的记录,读记录的历史版本和改动记录的最新版本本身并不冲突,也就是采用。

2023-11-29 18:05:36 893

原创 MySQL的undo log 与MVCC

MVCC(Multi Version Concurrency Control)被称为多版本控制,是指在数据库中为了实现高并发的数据访问,对数据进行多版本处理,并通过版本链保证事务能看到自己应该看到的数据版本。InnoDB 的**行数据有多个版本**,每个数据版本有自己的 row trx_id,每个事务或者语句有自己的一致性视图。普通查询语句是一致性读(快照读),一致性读会根据 row trx_id 和一致性视图确定数据版本的可见性。

2023-11-27 08:01:25 1767 2

原创 MySQL的Redo Log跟Binlog

Redo Log和Binlog是MySQL日志系统中非常重要的两种机制,也有很多相似之处,本文主要介绍两者细节和区别

2023-11-23 19:43:49 1126

原创 The coordinator is not aware of this member异常分析

线上问题:The coordinator is not aware of this member异常分析与解决方案

2023-09-15 16:25:37 4051

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除