- 博客(45)
- 收藏
- 关注
原创 【Spring之事务底层源码解析,持续更新中~~~】
一个Bean在执行Bean的创建生命周期时,会经过InfrastructureAdvisorAutoProxyCreator的初始化后的方法,会判断当前当前Bean对象是否和BeanFactoryTransactionAttributeSourceAdvisor匹配,匹配逻辑为判断该Bean的类上是否存在@Transactional注解,或者类中的某个方法上是否存在@Transactional注解,如果存在则表示该Bean需要进行动态代理产生一个代理对象作为Bean对象。
2023-11-29 22:25:37 246
原创 【Spring之AOP底层源码解析】
通过上面这个类,我们就直接定义好了所要代理的方法(通过一个表达式),以及代理逻辑(被@Before修饰的方法),简单明了,这样对于Spring来说,它要做的就是来解析这些注解了,解析之后得到对应的Pointcut对象、Advice对象,生成Advisor对象,扔进ProxyFactory中,进而产生对应的代理对象,具体怎么解析这些注解就是**@EnableAspectJAutoProxy注解**所要做的事情了,后面详细分析。通过这种方法来定义一个UserService的Bean,并且是经过了AOP的。
2023-11-26 20:11:45 339
原创 【从底层源码实现剖析Spring依赖注入】
这么写,表示Spring会自动的给userService中所有的属性自动赋值(不需要这个属性上@Autowired注解,但需要这个属性有对应的set方法)。Spring在AutowiredAnnotationBeanPostProcessor的postProcessProperties()方法中,会遍历所找到的注入点依次进行注入。上文说了@Autowired注解,是byType和byName的结合。在XML中定义Bean时,就是手动注入,因为是程序员手动给某个属性指定了值。
2023-11-23 19:56:56 191
原创 【Spring之底层核心架构概念解析】
图中的ListableBeanFactory和HierarchicalBeanFactory都继承至BeanFactory,所以ApplicationContext也是具备BeanFactory具备的特性和功能,但是,ApplicationContext还具备额外的功能,例如,支持国际化、支持获取环境信息、支持事件发布和相关资源加载,其有两个实现类,如下介绍。通过上面这段代码,我们自己创造了一个UserService对象,并且它将成为Bean。,其他Spring的生命周期步骤是不会经过的,比如依赖注入。
2023-11-10 19:12:28 817 1
原创 【手写模拟Spring底层原理】
总的来说,在Spring创建对象的过程中,主要分为,结合传入的类路径信息,扫描需要创建的对象资源=>结合上一步的扫描结果创建对象=>将创建好的对象提供一个对外获取Bean接口。
2023-11-09 15:32:39 148
原创 【Spring核心原理剖析】
当我们在某个方法上加了@Transactional注解后,就表示该方法在调用时会开启Spring事务,而这个方法所在的类所对应的Bean对象会是该类的代理对象。Spring创建Bean的过程中,如果需要在对象创建后,得到一些初始的数据或相关逻辑处理,那就需要在对象创建过程中,在对对象中属性被@Autowired注解的,需要进行属性赋值,那底层是如何去实现的呢?
2023-11-08 14:44:10 79
原创 【Redis专栏与常见面试题汇总】
在踏入Redis专题时,我们首先是先要了解Redis是什么,用来做什么的,怎么去用,有什么优缺点等,我们可以先来看探索的简单路线图:其路线主要是:先知道Redis是什么,有什么用,然后逐层的去剖析在使用过程中出现的问题,例如数据的持久化方案:RDB和AOF机制的特点,各自的优缺点,以及高可用方案,主从节点架构、哨兵机制以及后期的Redis集群架构,同时,我们也需要关注在大并发场景下,相关操作是否需要加分布式锁(Redisson),会出现的缓存击穿、缓存穿透、缓存雪崩以及数据库与缓存双写不一致问题,以及热
2023-11-07 20:34:53 148
原创 【Redis缓存架构实战常见问题剖析】
这张突发性的热点缓存数据,主要的场景为,例如:大V直播带货,可能介绍的商品之前属于三不问商品,好东西没被发掘,在直播大V介绍一通后,涌入一大波人对该商品进行查看以及购买等操作,那这时,Redis是无此商品信息的,大量的请求全打到数据库上,导致数据库压力暴增,甚至宕机等,针对这个问题,我们需要对该商品数据进行缓存数据重建,如何重建?2、使用布隆过滤器:对于恶意攻击,向服务器请求大量不存在的数据造成的缓存穿透,还可以用布隆过滤器先做一次过滤,对于不存在的数据布隆过滤器一般都能够过滤掉,不让请求再往后端发送。
2023-11-06 15:43:59 123
原创 【Redis分布式锁解决方案-Redisson深入源码剖析】
我们都知道,这段代码如果在并发的场景下,若不做任何的保护操作,商品的库存数据是线程不安全的,例如:当前同时有三个线程同时来扣减,假设商品总库存有300,三个线程同时纳300-1,那存库还有299,和期望的结果297不符,那就会出现超卖的情况,特别是在商品促销的场景下,商家可能拿出一部分商品来做引流的,那这一顿操作下来,商家也有可能是亏本,那如何解决呢?我们在开始这阶段的探索前,我们先来看一个例子,商品的库存扣减问题:如下图示。
2023-11-03 15:41:58 147
原创 【Redis Cluster集群运维与核心原理剖析】
redis集群没有过半机制会有脑裂问题,也就是如果在主从中,如果主节点出现网络问题,与从节点通信断开,从节点会认为主节点已经挂了,会重新选举Master节点,写数据时,会写入两个节点,那网络恢复之后,被屏蔽的主节点就会拉取当前选举出来的主节点数据,之前在屏蔽主节点写的数据就会被覆盖,所以,就存在脑裂问题,在第一台机器上,创建文件夹redis-cluster,然后在其下面创建两个文件夹8001、8002。将redis.confg拷贝一份到8001和8004文件下,修改其相关配置。
2023-11-02 20:07:09 71
原创 【Redis缓存持久化、主从机制原理与哨兵模式详解】
=>写时复制机制,也就是说,不会阻塞写操作,在生成快照的同时,依然可以往Redis中写数据,bgsave子进程是由主线程生成的,可以共享主线程中的所有内存数据,要是在子进程写数据时,主线程发生写数据操作,那写的这部分数据也会生产一个副本,子进程会把这个副本数据写到rdb文件中去。配置完Redis的从节点后,无论是否是第一次连接上master,都会发送一个psync请求到master上请求复制数据,master在收到这个psync命令后,会在后台进行数据持久化,表示不需要将变更的指令保存到aof文件中。
2023-11-01 20:46:51 107
原创 【Redis核心数据结构与高性能原理】
set key value:存入字符串键值对get key:获取一个字符串键值mset key value/mget key:批量存储/获取字符串键值对del key:删除一个键值对expire key seconds:设置一个键的过期时间(秒)incre key:将key中存储的数字值+1decr key:将key中存储的数字值-1increby key increment:将key中存储的数字值+increment。
2023-10-31 20:21:57 69
原创 【并发专题探索总结与常见面试题总汇】
充分的利用CPU计算能力,将多核的CPU计算能力发挥到极致,性能也能得到提升,而且针对访问量较高的业务,例如百万级或千万级的并发量,多线程并发编程正是解决的基础多线程操作同一个变量,这个操作(例如:累加操作)产生的结果是不确定的,有可能是正确的,有可能是错误的,这种情况我们就称当前的操作是线程不安全的。
2023-10-10 16:26:18 85
原创 【深入理解并发可见性、有序性、原子性与JMM内存模型】
文章目录一、原子性1.1、什么是原子性1.2、如何确保原子性二、可见性2.1、什么是可见性2.2、如何保证可见性三、有序性2.1、什么是有序性2.2、如何保证有序性四、JMM内存模型一、原子性1.1、什么是原子性1.2、如何确保原子性二、可见性2.1、什么是可见性2.2、如何保证可见性三、有序性2.1、什么是有序性2.2、如何保证有序性四、JMM内存模型
2023-10-08 21:48:54 116 1
原创 【从底层源码深入理解线程池ThreadPoolExecutor】
对于CPU密集型任务,线程数最好等于CPU核心数,只不过,为了应对线程执行过程发生缺页中断或其他异常导致线程阻塞的请求,我们可以额外在多设置一个线程,这样当某个线程暂时不需要CPU时,可以有替补线程来继续利用CPU。改为这个状态后,不管是创建线程还是执行任务,都需要先对线程池状态进行判断的,那就是说,状态变后,会结合当前线程池状态情况,中断线程或者直接中断所有执行的任务。如丧如上图,会调addWorker方法新建线程,如何新建的,我们下面会有介绍,我们先看主干的底层代码流程是如何的。线程在接受到任务后,
2023-10-06 22:12:06 106
原创 【阻塞队列详解】
ArrayBlockingQueue是最典型的有界阻塞队列,其内部是用数组存储元素的,初始化时需要指定容量大小,利用 ReentrantLock 实现线程安全。ArrayBlockingQueue可以用于实现数据缓存、限流、生产者-消费者模式等各种应用LinkedBlockingQueue是一个基于链表实现的阻塞队列,默认情况下,该阻塞队列的大小为Integer.MAX_VALUE,由于这个数值特别大,所以 LinkedBlockingQueue 也被称作无界队列,代表它几乎没有界限。
2023-10-05 19:07:31 673
原创 【深入理解AQS与ReentrantLock源码剖析】
管程是指管理共享变量与对共享变量操作过程,让其变量支持并发,具有互斥与同步特点,互斥是某一时刻只允许一个线程访问共享变量,同步既是线程之间的通信、协作。
2023-10-04 16:06:26 207
原创 【JUC并发工具类与相关的应用场景详解】
ReentrantLock是一种可重入的独占锁,允许同一个线程多次获取同一个锁而不被阻塞,同synchronized一样,是一种互斥锁,但是相对synchronized来说,ReentrantLock有以下特点:如下图:在多个线程同时操作同一个资源时,ReentrantLock相当于是给这些线程加了一道门锁,每个线程想要获取到资源,都需要先获取到这把钥匙,才能访问门锁后面持有的资源ReentrantLock实现了Lock接口规范,常见的API如下:void lockInterruptibly() th
2023-10-03 15:40:16 405
原创 【CAS与原子操作和并发安全问题探索】
在所写的业务程序中,如果是并发情况下,总是表现出正确的运行行为,那我们就称为:当前程序为线程安全的,反之,如果每次程序执行时,表现出来的结果都是不可预知的,有可能是正确的,也有可能是不正确的,那这种情况下,我们就称为是线程不安全的。
2023-10-02 15:03:10 117
原创 【线程本地变量ThreadLocal—底层存储结构与内存泄漏探索与分析】
如上图示,如果当前局部的方法执行完毕了,但线程未结束,那ThreadLocal这个局部变量就会出栈,相关的引用也随之去,那堆中,创建出的ThreadLocal对象只有Entry的弱引用指向了,如果发生GC,那ThreadLocal对象是直接被收回的,这时,Entry对象的key就会为null,那这个数据就无法访问了,就属于垃圾对象了,特别是线程池环境下,越积越多,就产生了内存泄漏,解决方案其实就是在局部方法执行完毕之后,记得调用当前ThreadLocal对应的remove方法即可;
2023-10-01 16:19:10 206
原创 【JVM专题与常见的面试题总汇】
参考答案:JVM的垃圾回收器,常用的主要有以下几种:Serial回收器、Parallel回收器、ParNew回收器、CMS回收器以及G1回收器,之所以有这么多的版本的垃圾回收器,主要是站在原垃圾回收器缺陷基础之上做的改善,例如:Serial回收器是一种单线程且STW进行回收垃圾的一种机制,而Parallel回收器就是基于Serial做了改善,改善点在于提高了吞吐量,利用多线程进行垃圾回收,但也会STW,CMS和G1则是站在用户体验的角度进行改善的,具体过程和模型图我们可以看上面第一个章节的垃圾回收器图。
2023-09-27 19:04:19 276
原创 【Java性能分析工具Arthas与GC日志和常量池详解】
Arthas是阿里巴巴在2018年9月发布开源的Java诊断工具,支持jdk6+版本,交互方式是命令行交互模式
2023-09-25 16:01:35 2572 1
原创 【JVM调优指令详解】
文章目录一、JVM常用指令实例详解1.1、Jmap1.2、Jstack1.3、Jinfo1.4、Jstat二、JVM优化思路2.1、JVM运行情况预估—年轻代对象增长的速率2.2、JVM运行情况预估—Young GC的触发频率和每次的耗时2.3、JVM运行情况预估—每次Young GC后有多少对象存活和进入老年代2.4、JVM运行情况预估—Full GC的触发频率和每次耗时三、JVM优化示例四、小结一、JVM常用指令实例详解1.1、Jmap1.2、Jstack1.3、Jinfo1.4、Jstat
2023-09-23 22:11:20 484
原创 【JVM垃圾回收器G1详解】
G1是一款面向服务器的垃圾回收器,主要是针对配置多个处理器和大容量内存的机器,满足GC停顿时间要求的同时,还具备高吞吐量性能特征,相比之前的CMS,G1没有明显的分代机制,我们可以先查下图所示,为G1的对象内存分布图:G1会把堆内存分为四种独立的小鸽子,也就是Region,JVM中最多可以有2048个Region;在给每个Region分配内存大小时。就说用总的分配空间除以2048,例如:现在分配的大小为:4096,那每个Region就为:4096/2048=2M;
2023-09-22 16:33:33 812
原创 【垃圾收集器与底层算法实现】
这节我们是先从垃圾的回收算法=>垃圾回收器=>垃圾回收器底层算法实现展开学习的,我们了解到垃圾回收算法和垃圾回收器的循序渐进的升级,都是针对前一代垃圾回收器/算法遗留或者发现的问题做改善,不断的优化的过程,而且也对三色标记中,针对CMS垃圾回收器在并发标记阶段产生漏标情况给予解决方案=>在这个分析的过程中,会出现==>当方法运行结束后,方法中的对象就会被释放了,但是这个对象在之前的标记过程中,被标记为非垃圾对象,那这时,这个对象其实是没用的了,只能在下一次扫描回收时,才被扫描回收,这种我们称为。
2023-09-21 19:40:31 285
原创 【JVM对象创建与内存分配机制深度剖析】
由上图我们不难看出,new一个对象时,是一个什么样的过程,那在这些过程中,我们需要重点关注。我们在程序中new一个对象时,在JVM内部,是一个什么样的流程?后,对齐的位数会在一定程度上减少,那什么是。,在给对象分配内存时,有两种机制,分别是。在这个图中,对齐填充如果收到。
2023-09-20 23:09:21 330 1
原创 【MySQL数据库深层剖析与常见面试题总结】
我们在接触任何技术时,首先要先明白其技术点是干什么,主要是解决一个什么样的问题,如何去使用和优化等,再会去结合真是业务场景中出现的问题“对症下药“,才能够去真正的解决问题,那对应MySQL专题,我们也是结合这种体系来总结学习,如下图示:索引、锁、事务、MVCC、日志机制,来对MySQL展开学习与优化,例如索引(SQL)优化模块,并没有展开说明,因为在实际的业务中,都会遇到不同的问题,并且MySQL内部也有自己的优化器,但是,我们可以掌握其优化的思路。
2023-09-19 21:15:06 107
原创 【JVM内存模型剖析】
我们这结合实际的代码以及class文件的反编译结果来对栈中存储的数据进行剖析,首先是add方法中,有三个变量,以变量a为例,这个区域主要是存储类元信息,静态变量和常量,有些静态变量是对象形式,所以这里也会有部分与堆有交互。这个区域主要是记录字节码执行引擎执行到当前位置信息。这个区域主要是存储被Native修饰的方法数据。其主要分为三部分组成,分别是。最后一个是main方法中,
2023-09-18 22:49:17 103 1
原创 【JDK源码级别剖析JVM类加载机制】
我们在启动一个类的过程中,首先是由java.exe调用jvm.dll创建Java虚拟机,再由其虚拟机创建一个引导类加载器实例,获取到对应的类加载器后,加载执行的类资源后调用其main执行的入口方法,执行相关的业务逻辑代码后,Java程序运行结束,JVM就销毁,相关的图示如下:加载器类的过程主要分为以下步骤:具体过程如下图示:类加载到JVM的方法区中,主要包含:运行时常量池、类型信息、字段信息、方法信息、类加载的引用(当前这个类到类加载实例的引用)、对应的class实例引用java中的类加载器主要分为四
2023-09-16 21:09:11 410 1
原创 【MySQL在Linux环境下的安装与集群搭建】
4.2 初始化:执行命令:mysqld --defaults-file=/data/software/mysql8/my.cnf --basedir=/data/software/mysql8/ --datadir=/data/software/mysql8/datas/mysql --user=mysql --initialize-insecure。目的就是为了保证数据库的数据在多台服务器上保存一致,对应MySQL,通常用到的是MySQL自身提供的一套。server-id:服务节点的唯一标识。
2023-09-14 21:22:52 996 1
原创 【MySQL-InnoDB底层原理与MySQL日志机制详解】
如上图,MySQL的内部结构主要是分为三层,分别为:客户端、service层和引擎层,各自组件的职责描述如上图所述对于上图中,在执行一条修改数据的操作时,在InnoDB存储引擎下,有以下步骤:1、文件的管理是以分段的方式进行管理的,也就是回滚段(rollback segment),每一个回滚段记录了1024个undo log segment,每一个事务只会使用一个undo log segment;2、在MySQL5.5之前,只有一个回滚段,最大同时支持的事务数量为1024个,在MySQL5.6开始,可
2023-09-12 21:08:09 420
原创 【MySQL锁机制与MVCC详解】
1、悲观锁:悲观锁在操作数据时比较悲观,认为别人会同时修改数据。因此操作数据时直接把数据锁住,直到操作完成后才会释放锁;上锁期间其他人不能修改数据2、乐观锁:乐观锁在操作数据时非常乐观,认为别人不会同时修改数据。因此乐观锁不会上锁,只是在执行更新的时候判断一下在此期间别人是否修改了数据:如果别人修改了数据则放弃操作,否则执行操作undo日志版本链与read view机制详解。
2023-09-11 23:05:43 596
原创 【MySQL事务详解】
事务是用于保证数据的一致性,是由一组相关的dml(数据操纵语句)语句组成,该组的dml语句要么全部执行成功,要么全部失败。
2023-09-09 22:43:30 152
原创 【MySQL索引常见优化实战】
在MySQL5.6版本开始,推出了对SQL跟踪的工具==>trace,可以通过trace,可以查看到MySQL优化器对SQL语句分析的结果,以及生成了一个怎样的执行计划。
2023-09-08 22:40:34 437 1
原创 【每日一问之持续更新~~】
1,脏读:当前执行的事务读取到其他事务修改或者新增数据库数据但未提交事务的数据。2,幻读:当前执行的事务涉及的SQL语句不变,在不同时间段读取到数据数量不一致(读取到其他事务新增后的数据库数据)3,不可重复读:当前执行的事务涉及的SQL不变,在不同时间段执行当前事务SQL,得到的数据结果是不一致,这主要体现在读取的数据是被其他事务修改或者删除后的最新数据,与第一次读取到的结果不同。
2023-09-07 20:15:13 67
原创 【MySQL的优化分析—Explain分析工具】
1、这一列是表示关联的类型和访问的类型,是SQL语句优化的重点关注列,也就是说会体现出SQL是如何去查找表中的行数据的,分别有七个值,依次从优到差为:system>const>eq_ref>ref>rang>index>all,优化时,一般都需要到达rang以上。的数据结构,但是对索引值做了计算和其他操作后,并不是原先索引树上的值了,那如果拿这种处理后的值去查找数据,其实在索引树上是找不到的,因为排好序已经。1、表示查询可能会走的索引,但不一定走此索引,具体还需要结合。
2023-09-07 15:31:50 177
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人