自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(46)
  • 问答 (3)
  • 收藏
  • 关注

转载 dump文件深度分析

java内存dump是jvm运行时内存的一份快照,利用它可以分析是否存在内存浪费,可以检查内存管理是否合理,当发生OOM的时候,可以找出问题的原因。综上,dump文件结构还是比较简单的,这对于分析线程的执行情况非常有用,也是每一个Java程序员必须掌握的高级技能之一,你学会了吗?(2)类的静态变量的名称类型及值是放在类对象里面的,成员变量的名称和类型也是放在类对象里面的,但是实例的值是放在实例对象里面的。有一个表格,对象类型,实例个数,实例所占用内存大小,哪种类型的对象占用了内存最多一目了然。

2023-04-11 10:40:50 4080

转载 jvm安全点的理解

>中说道GC Roots的节点主要在全局的引用(例如常量或类静态属性)与执行上下文(例如栈帧中的本地变量表)中,但是进行根节点枚举的时候我们并不需要一个不漏地检查完所有执行上下文和全局引用位置,即安全点就是某些记录线程此时调用栈、寄存器等一些重要的数据区域里什么地方包含了GC要管理的指针(对象引用),而这些对象引用是通过OopMaps结构进行记录的,可以直接通过对OopMaps结构的访问来获得对象的引用。于是jvm选择在某些”特定的位置“记录这些信息,这些位置就是“安全点”。

2023-01-11 10:35:19 223

原创 从Redisson看分布式锁实现原理

redisson为我们实现了一个相当完善的分布式锁,它的底层逻辑是几短lua脚本,lua脚本使得redis命令可以在redis中原子执行;并且这把锁使用的数据结构为hash,主要是为了可重入的逻辑;还有一个精髓点是:锁续期的逻辑,解决了高并发场景分布式锁下锁过期时间难以确定的难题。当然自己写出如此完备的分布式锁是很难的,其中的思想值得我们借鉴。

2022-12-31 22:09:32 827

转载 Java字节码技术javassist

Javassist是可以动态编辑Java字节码的类库。它可以在Java程序运行时定义一个新的类,并加载到JVM中;还可以在JVM加载时修改一个类文件。Javassist使用户不必关心字节码相关的规范也是可以编辑类文件的。

2022-10-24 11:28:14 1463

原创 Spring-Cloud-OpenFeign源码解析(下篇)

在上篇,分析了Feign客户端也就是我们写的Feign接口的动态代理的创建过程,接下来就是feign接口的调用过程啦,调用过程就比较简单了,大部分工作在创建feign接口的动态代理就做好了。 由于是接口,自然只能使用jdk动态代理,源码入口为FeignCircuitBreakerInvocationHandler: 这里主要看feign的调用逻辑,也就是方法委派,找到在创建feign动态代理时创建的的对应与每个接口方法的methodHandler:execute

2022-07-06 11:23:52 377

原创 Spring-Cloud-OpenFeign源码解析(上篇)

openFeign作为一个http客户端,可以让开发人员像调用一个本地接口一样调用一个http接口,而spring cloud也将openFeign集成到了spring cloud全家桶中,成为了spring cloud体系中微服务接口调用的标准实现,同时spring cloud也扩展的openFeign,使之支持springMVC注解。feign的使用我想大部分人都已经太熟悉了,下面直接进入源码。源码版本:spring-cloud-openfeign-3.1.1 源码入口就是EnableFe

2022-07-06 11:23:18 711

原创 Spring-Cloud-Alibaba-SEATA源码解析(四)(客户端)

在上一篇,分析了seata at模式一阶段的过程,在二阶段,TC异步通知RM,本地RM根据TC的反馈,如果全局回滚,则执行本地的undo_log回滚日志,如果全局提交,则删除undo_log即可,最后RM上报这一步的结果,TC释放全局锁。二阶段提交过程较为简单,这里以二阶段回滚为例。二阶段,RM接收到TC的回滚请求,来到seata netty客户端,源码入口:AbstractNettyRemoting#processMessage 处理二阶段RM回滚请求,对应RmBranchRollbackProce

2022-07-01 16:14:41 362

原创 Spring-Cloud-Alibaba-SEATA源码解析(三)(客户端)

在上一篇,分析了seata at模式分布式事务的执行流程,可以看到它和spring声明式事务的过程非常相似,剩下的问题是分支事务是如何提交和回滚的,seata中的全局锁是什么?答案是seata代理了我们的数据源,这个代理数据源对数据源的某些方法进行了增强,加入了申请全局锁,生成undo_log,注册分支事务等逻辑。全局锁主要用来实现全局事务的写隔离:以一个示例来说明:两个全局事务 tx1 和 tx2,分别对 a 表的 m 字段进行更新操作,m 的初始值 1000。tx1 先开始,开启本地事务,拿到本地锁,更

2022-07-01 16:13:17 488

原创 Spring-Cloud-Alibaba-SEATA源码解析(二)(客户端)

上一篇讲到了seata的全局事务模板方法,有8个主要步骤,下面一一分析。TransactionInfo txInfo = business.getTransactionInfo():获取已存在的全局事务(如果存在的话,那么当前事务角色则为参与者):处理事务传播行为:如果不存在事务,则创建一个新的全局事务:开始全局事务,像TC发起开始事务的请求:执行业务逻辑(目标方法):rs = business.execute();回滚(需要的话):completeTransaction

2022-07-01 16:08:32 216

原创 Spring-Cloud-Alibaba-SEATA源码解析(一)(客户端)

seata作为Spring-Cloud-Alibaba的一员,目前正逐渐成为分布式事务的一个事实标准。它是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。seata支持多种分布式事务实现,如TCC,SAGA,XA,以及独有的AT模式,AT模式是阿里官方推荐的模式,提供无侵入自动补偿的事务模式,目前已支持MySQL、Oracle、PostgreSQL、TiDB 和 MariaDB。下面结合Spring-Cloud-Alibaba介绍SEATA AT模式源码。前置知识:

2022-07-01 16:07:40 377

原创 回首Spring源码之声明式事务源码级详解(下篇)

在上篇中,详细分析了事务的执行过程,中间留了一些尾巴没讲:在一个内部事务中spring是如何处理外部事务的?事务同步管理器TransactionSynchronizationManager到底是何方神圣,它有哪些作用?当外层有了一个事务,内层需要根据传播行为决定应该怎样处理,下面进入源码:看一下如何挂起一个事务:ok,以上就是挂起一个事务的全部操作了。TransactionSynchronizationManager是事务同步管理器,用来为每个线程管理事务资源和事务同步对象Transaction

2022-06-16 15:11:27 440

原创 回首Spring源码之声明式事务源码级详解(中篇)

在上一篇介绍了@EnableTransactionManagement和@Transactional这两个注解,spring声明式事务的准备工作完成了,下面正式进入事务的执行流程。声明式事务本质是aop的一个环绕通知,也就是这个拦截器:TransactionInterceptor,来到TransactionInterceptor的invoke方法:这个方法有点长,稍微总结一下:TransactionAttribute txAttr = (tas != null ? tas.getTransactio

2022-06-16 13:53:56 235 2

原创 回首Spring源码之声明式事务源码级详解(上篇)

spring的声明式事务本质还是基于spring aop,只不过少去了解析切面的过程,核心为Transactional这个注解,本篇将基于spring源码详解声明式事务。首先来到Spring声明式事务入口注解EnableTransactionManagement,有了这个注解表明开启声明式事务功能。看一下这个注解:可以看到Import了TransactionManagementConfigurationSelector这个类,是一个ImportSelector,用来注册bean定义:这里会引入两

2022-06-14 20:34:20 305

原创 mybatis源码解析

mybatis作为一个流行了多年的orm框架,广泛地被各大互联网公司所使用,它的特点是半自动sql,需要自己手写sql,非常灵活,简单小巧。 首先先写一个mybatis的配置文件(当然现在已经被springboot自动配置类所取代),大家应该很熟悉了:再写一个测试的main方法:附上mapper文件:完成,可以看到mybatis的使用非常简单,下面直接进入源码,首先是创建SqlSessionFactory: configuration这个对象在mybati

2022-06-01 16:19:01 287

原创 Dubbo服务调用流程源码分析(服务调提供方)

前言 Dubbo作为一款阿里开源的高性能RPC调用框架,在重新维护后又焕发了生机,本篇博文主要分析Dubbo服务的调用过程,侧重点是服务提供方,Dubbo版本:2.7.8。服务提供方执行逻辑Dubbo服务在导出时同样会为导出的服务(一般是我们写的服务实现类,有@DubboService注解)创建动态代理,也是一个invoker。Dubbo默认使用的dubbo协议基于netty,源码的入口为netty服务器的ChannelHandler:NettyServerHan...

2022-05-29 16:02:07 1350

原创 Dubbo服务调用流程源码分析(调用方)

前言Dubbo作为一款阿里开源的高性能RPC调用框架,在重新维护后又焕发了生机,本篇博文主要分析Dubbo服务的调用过程,侧重点是服务调用方,Dubbo版本:2.7.8。服务调用方执行逻辑首先来到Refrenced代理对象的Handler:InvokerInvocationHandler,里面的invoke方法:public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

2022-05-19 15:53:09 417

原创 Nacos注册中心AP架构源码(Distro)下篇

前言紧接着上篇,发布了服务变更事件,来到处理的流程。APNotifier#handle:private void handle(Pair<String, DataOperation> pair) { try { //服务对应的key String datumKey = pair.getValue0(); //任务类型 DataO

2022-04-15 14:02:48 2033

原创 Nacos注册中心AP架构源码(Distro)上篇

前言Nacos作为微服务注册配置中心,同时支持AP模式和CP模式,默认情况下,注册到Nacos的实例都是临时实例,本篇将会着重分析Nacos AP模式,Nacos实现了一个名为distro的协议来支持AP模式,本篇源码基于Nacos1.4.x。AP分布式中的CAP理论就不阐述了,直接上源码,其实Nacos服务端就是一个SpringBoot,客户端会请求/nacos/v1/ns/instance这个接口注册服务,来到Nacos服务端注册实例的接口:@CanDistro @PostMa

2022-04-15 14:02:22 2439

原创 Spring进阶之Bean的自定义作用域(Scope)

前言

2022-04-10 10:58:57 859

原创 回首Spring源码之AOP:方法增强(责任链模式)

前言在上一篇介绍了spirng aop创建创建动态代理的过程,本片着重分析一下切面方法的执行过程。以JKD动态代理为例。方法增强(责任链模式)来到JDK的动态代理类JdkDynamicAopProxy,它是一个InvocationHandler,JKD动态代理基于InvocationHandler的invoke方法进行方法增强:public Object invoke(Object proxy, Method method, Object[] args) t...

2022-04-09 16:48:35 1709 1

原创 回首Spring源码之AOP:创建动态代理

前言之前在spring ioc的bean加载过程中也提到了,在bean的初始化后置处理中,AnnotationAwareAspectJAutoProxyCreator这个bean的后置处理器会为容器中的bean创建aop动态代理,我们首先回顾一下这处调用。创建动态代理//bean初始化后置调用public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) thr

2022-04-08 20:59:35 1756

原创 回首Spring源码之AOP:解析切面(aspect)

前言之前分析了spring容器创建bean的整个流程,其中涉及到了bean的后置处理器的几处调用,其中在bean的实例化前置调用中,aop会在此处解析aspect切面,我们先来回顾一下这个BeanPostProcessor。解析切面//bean后置处理器实例化前置处理Object bean = resolveBeforeInstantiation(beanName, mbdToUse);protected Object resolveBeforeInstantiation(String

2022-04-07 21:48:37 1790

原创 回首Spring源码之AOP:@EnableAspectJAutoProxy

前言AOP是spring的重点和难点,它的本质是用动态代理增强容器中bean的方法,本篇从基于注解的AOP开发方式开始分析。当你需要进行AOP切面编程时,首相要引入一个注解:@EnableAspectJAutoProxy。@EnableAspectJAutoProxy@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(AspectJAutoProxyRegistrar...

2022-04-07 10:58:46 1580

原创 回首Spring源码之IOC:Bean的创建(finishBeanFactoryInitialization)下篇

上篇讲到了doCreateBean,这是一个创建bean的核心方法。下面直接进入分析:protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException { BeanWrapper instanceWrapper = null; if (mbd.isSingleton()) { ins...

2022-04-04 11:13:24 1525

原创 回首Spring源码之IOC:Bean的创建(finishBeanFactoryInitialization)上篇

前言紧接着上一篇,所有BeanFactoryPostProcessor完成了历史使命,

2022-04-04 11:11:14 1384

原创 回首Spring源码之IOC:解析配置类(ConfigurationClassPostProcessor)下篇

前言紧接着上篇,分析完了@ComonentScan这个注解的解析,接下来看spirng是怎么处理@Import和@Bean这两个注解的。我们知道@Import这个注解使用范围很广,支持多种形式。@Import and@Bean

2022-04-01 11:46:39 1718

原创 回首Spring源码之IOC:解析配置类(ConfigurationClassPostProcessor)上篇

前言在上一篇,分析了BeanFactoryPostProcessor加工bean工厂的流程,提到了一个很重要的类ConfigurationClassPostProcessor,它的作用是解析配置类,下面分析一下这个类的工作原理。ConfigurationClassPostProcessorConfigurationClassPostProcessor是一个BeanDefinitionRegistryPostProcessor,具有注册BeanDefinition的...

2022-03-31 21:16:36 1958

原创 回首Spring源码之IOC:bean工厂后置处理器(invokeBeanFactoryPostProcessors)

前言上一篇完成了Spring容器刷新的准备工作,接下来开始刷新容器,从invokeBeanFactoryPostProcessors这个方法开始,这里说下BeanFactoryPostProcessor,bean工厂后置处理器,这个类型的bean可以对容器中的BeanDefinition进行加工,也就是可以修改bean定义,是spring的扩展点之一;与之对应的是BeanPostProcessor,可以对bean进行加工,后续详解;提一下BeanDefinitionRegistryPos...

2022-03-30 16:42:39 2070

原创 回首Spring源码之IOC:prepareBeanFactory

前言上篇讲到了基于注解的容器AnnotationConfigApplicationContext的创建过程,紧接着就是容器的加载refresh,这是spring ioc的主流程,里面包含了多个阶段的逻辑,主要分析一下刷新容器的几个主要方法,本篇着重分析容器刷新前的准备工作prepareBeanFactory。prepareBeanFactory首先进入AbstractApplicationContext#refresh:public void refresh() throw...

2022-03-30 12:48:23 1912

原创 回首Spring源码之IOC:AnnotationConfigApplicationContext

前言Spring作为java web的一款开发框架已经演进了许多年,当初Spring也是笔者源码阅读的开端,故借以回首,更求精进。本篇源码基于Spring 5.x。现在开发者多以注解方式使用spring,spring的配置文件时代早成了过去时,所以本篇主要从基于配置文件的容器: AnnotationConfigApplicationContext开始分析。AnnotationConfigApplicationContext启动容器:public static void main(Str

2022-03-29 18:26:12 2141

原创 RocketMQ源码之高性能组件MessageStore(MappedFile)

前言前篇介绍了rocketmq启动的各个组件的功能,本篇着重分析使rocketmq能够抗住10万级吞吐的高性能消息持久化组件MessageStore,它是一个commitlog存储库,底层使用了c语言的内存映射函数mmap,实现了内存零拷贝。前置知识:java MappedByteBuffer。MappedByteBufferMappedByteBuffer是mmap的java实现,继承自ByteBuffer,它是一个映射了的字节缓冲区,可以将一个文件映射到直接内存中,java程序可以通过在这个

2022-03-28 17:25:11 545

原创 RocketMQ源码之Broker启动原理(一)

前言rocketmq作为一个越来越流行的消息中间件,被广泛使用,本文主要分析Broker的启动原理,主要是Broker的各个服务组件以及主要配置属性的介绍,会略过一些次要代码。Broker初始化broker会从BrokerStartup的main方法启动:public static void main(String[] args) { start(createBrokerController(args));}//创建BrokerControllerpublic s

2022-03-26 13:23:48 833

原创 Zookeeper源码之集群选举

前言zookeeper算是一个流行的分布式协调框架,在大量java分布式中间件中广泛使用。在学习zookeeper的源码前建议先了解一下分布式一致性协议的概念,zookeeper自己实现了一套满足cp的一致性协议zab。本篇将会先从zookeeper服务器启动讲起,主要内容为各节点启动后的集群选举。本篇源码版本为3.5.8,因为zookeeper的源码说实话在各个java写的中间件中是属于非常复杂的,而且有些代码写的并不规范,对阅读者并不友好。本篇只关注主流程核心源码,一些次要的逻辑会略过。集群选举

2022-03-23 21:20:51 3837

原创 Netty源码之EventLoop工作原理

前言上一篇分析了Netty服务端启动原理,本篇会详细介绍Netty服务启动后的工作流程。NioEventLoopNetty线程模型中,NioEventLoop是一个非常重要的类,把netty服务看成是一个工厂,bossGroup中的NioEventLoop负责分配任务,而workerGroup中的NioEventLoop就是干活的工人,也就是处理读写事件。 上篇讲到Netty服务启动后,bossGroup中的NioEventLoop就开始工作,下面就从NioE...

2022-03-22 13:47:17 2206

原创 Netty源码之ServerBootstrap启动原理

前言阅读netty源码之前建议先了解下netty相关的线程模型,推荐Doug Lea的Scalable IO in Java。并且熟悉java NIO的基本使用。启动流程下面是一个常见的netty启动方法:public static void main(String[] args) throws Exception { EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoop...

2022-03-19 21:55:57 2531

原创 Dubbo服务导出流程分解一张图(v2.7.8)

dubbo服务导出流程图

2022-03-08 17:48:55 195

原创 Semaphore源码解读

Semaphore源码解读目录Semaphore源码解读前言源码解读前言Semaphore字面意思是信号量的意思,它的作用是控制访问特定资源的线程数目,底层依赖AQS的状态State,是在生产当中比较常用的一个工具类。构造方法:public Semaphore(int permits) public Semaphore(int permits, boolean fair)permits 表示许可线程的数量fair 表示公平性,如果这个设为 true 的话,...

2021-06-02 19:48:36 151

原创 阻塞队列ArrayBlockingQueue源码解读

阻塞队列ArrayBlockingQueue源码解读目录阻塞队列ArrayBlockingQueue源码解读前言源码解读前言BlockingQueue,是java.util.concurrent 包提供的用于解决并发生产者 - 消费者问题的最有用的类,它的特性是在任意时刻只有一个线程可以进行take或者put操作,并且BlockingQueue提供了超时return null的机制,在许多生产场景里如线程池都可以看到这个工具的身影。常见的4种阻塞队列:ArrayBlockin

2021-06-01 19:32:53 106

原创 Reentantlock源码解读

Reentantlock源码解读目录Reentantlock源码解读前言源码解读前言ReentrantLock是一种基于AQS框架的应用实现,是JDK中的一种线程并发访问的同步手段,它的功能类似于synchronized是一种互斥锁,可以保证线程安全。而且它具有比synchronized更多的特性,比如它支持手动加锁与解锁,支持加锁的公平性。至于AQS,不用多说它的核心地位,它是整个java并发包JUC的基石。AQS定义了一套多线程访问共享资源的同步器框架。源码解读话不多说.

2021-05-31 21:21:41 150

原创 透彻理解MySql MVCC机制

Mysql在可重复读隔离级别下如何保证事务较高的隔离性,我们上节课给大家演示过,同样的sql查询语句在一个事务里多次执行查询结果相同,就算其它事务对数据有修改也不会影响当前事务sql语句的查询结果。这个隔离性就是靠MVCC(Multi-Version Concurrency Control)机制来保证的,对一行数据的读和写两个操作默认是不会通过加锁互斥来保证隔离性,避免了频繁加锁互斥,而在串行化隔离级别为了保证较高的隔离性是通过将所有操作加锁互斥来实现的。Mysql在读已提交和可重复读隔离级别下都

2021-05-27 20:34:51 218

空空如也

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

TA关注的人

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