Java源码
文章平均质量分 85
Java源码
白鸽呀
这个作者很懒,什么都没留下…
展开
-
Sentinel源码剖析之滑动窗口
咱们就拿 60个窗口,这个60个窗口放在数组中,窗口长度是1s 来计算,看看当前时间戳的一个时间窗口是是在数组中哪个位置。比如说当前时间戳是1609085401454 ms算出秒 = 1609085401454 /1000(窗口长度)在数组的位置 = 算出秒 %数组长度。转载 2022-11-18 16:44:33 · 948 阅读 · 0 评论 -
Sentinel源码剖析之执行流程
上述讲了SCG Sentinel执行流程,这里给一个SpringBoot集成Sentinel的执行流程,两则本质上执行流程一致StatisticSlot计数,底层通过LongAdder实现,why?1、LongAdder底层通过cas保证高并发情况下的线程安全2、LongAdder底层通过add,decrement,sum这些现成的API可以使用熔断器在哪计数?下篇写为什么要用滑动窗口算法?原理是什么?怎么实现?下篇写。原创 2022-11-17 16:15:18 · 1059 阅读 · 1 评论 -
Sentinel源码剖析之初始化
Sentinel初始化,有个几个核心对象SphU sentinel基本APIEnv 组件初始化CommandCenterInitFunc 命令中心,负责接收命令CommandHandler,接收的命令,最终的处理器HeartBeatSenderInitFunc 心跳发送器,维护与dashboard的心跳,10s一次简单吧嘿嘿!!!原创 2022-11-09 20:53:00 · 889 阅读 · 0 评论 -
Java线程池使用详解及原理
线程池其实是一种池化的技术的实现,池化技术的核心思想其实就是实现资源的一个复用,避免资源的重复创建和销毁带来的性能开销。在线程池中,线程池可以管理一堆线程,让线程执行完任务之后不会进行销毁,而是继续去处理其它线程已经提交的任务。通过上面分析提到,通过Executors这个工具类来创建的线程池其实都无法满足实际的使用场景,那么在实际的项目中,到底该如何构造线程池呢,该如何合理的设置参数?1)线程数线程数的设置主要取决于业务是IO密集型还是CPU密集型。原创 2022-10-13 20:41:07 · 1149 阅读 · 0 评论 -
Netty 粘包拆包 编解码器简介与使用
在protobuf中,每个byte的最高位是一个判断位,如果这个位被置位1,则表示后面一个byte和该byte是一起的,表示同一个数,如果这个位被置位0,则表示后面一个byte和该byte没有关系,数据到这个byte就结束了。就是序列化整数的时候,占用的空间大小是不一样的,小的整数占用的空间小,大的整数占用的空间大,这样不用固定一个具体的长度,可以减少数据的长度,但是会带来解析的复杂度。xml也是一个非常常用的格式,但是它的体积会比较大,现在应该用的比较少了。原创 2022-10-11 20:14:34 · 1141 阅读 · 0 评论 -
Netty源码剖析之内存池和对象池设计流程
根据谁最后使用谁负责释放的原则,每个Handler对消息可能有三种处理方式对原消息不做处理,调用ctx.fireChannelRead(msg)把原消息往下传,那不用做什么释放。将原消息转化为新的消息并调用 ctx.fireChannelRead(newMsg)往下传,原创 2022-09-28 21:08:15 · 1050 阅读 · 0 评论 -
Netty源码剖析之IO多路复用模型
select缺点是:1、 单个进程可监视的fd数量被限制,即能监听端口的大小有限。一般来说这个数目和系统内存关系很大,具体数目可以cat /proc/sys/fs/file-max察看。32位机默认是1024个。64位机默认是2048.当套接字比较多的时候,每次select()都要通过遍历FD_SETSIZE个Socket来完成调度,不管哪个Socket是活跃的,都遍历一遍。这会浪费很多CPU时间。转载 2022-09-27 16:50:41 · 1158 阅读 · 0 评论 -
Netty源码剖析之核心组件
AbstractChannel抽象类包含以下几个重要属性。EventLoop:每个Channel对应一条EventLoop线程。DefaultChannelPipeline:一个Handler的容器,也可以将其理解为一个Handler链。Handler主要处理数据的编/解码和业务逻辑。Unsafe:实现具体的连接与读/写数据,如网络的读/写、链路 关闭、发起连接等。命名为Unsafe表示不对外提供使用,并非不安全。原创 2022-09-27 14:52:52 · 452 阅读 · 0 评论 -
Netty源码剖析之数据通信流程
我的理解是不会!只有当客户端与服务端建立连接的时候,ServerSocketChannel所在NioEventLoop将 接收到的SocketChannel通过 ServerBootAcceptor 交由 WorkerGroup NioEventLoop注册通道的时候,才会拿到这个WorkerNioEventLoop 创建线程,进行Selector监听。原创 2022-09-16 10:51:47 · 609 阅读 · 0 评论 -
Netty源码剖析之Netty启动流程
1、NettyServer2、NettyServerHandler3、NettyClient4、NettyClientHandlerNetty启动流程1、绑定端口,封装程SocketAddress2、创建初始化Channel,将NioServerSocketChannel绑定到BossNioEventLoopGroup中的EventLoop中的Selector上,指定Selector监听事件为accept2.1 反射创建NioServerSocketChannel给ServerSoc原创 2022-09-15 15:20:50 · 630 阅读 · 0 评论 -
Netty源码剖析之NIOEventLoopGroup创建流程
NioEventLoopGroup内部结构执行图。原创 2022-09-13 18:02:29 · 1453 阅读 · 0 评论 -
Netty源码剖析之线程模型
Netty 是由 JBOSS 提供的一个 Java 开源框架。Netty 提供异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络 IO 程序。Netty 是一个基于 NIO 的网络编程框架,使用Netty 可以帮助你快速、简单的开发出一 个网络应用,相当于简化和流程化了 NIO 的开发过程。原创 2022-09-13 15:39:42 · 310 阅读 · 0 评论 -
Netty源码分析之NIO
Socket是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议、本地主机的IP地址、本地进程的协议端口、远程主机的IP地址、远程进程的议。从 JDK1.4 开始,Java 提供了一系列改进的输入/输出的新特性,被统称为 NIO(即 New IO),是同步非阻塞的。,简化了程序编写,有效的请求才启动线程,它的特点是先由操作系统完成后才通知服务端程序启动线程去处理,一般适用于连接数较多且连接时间较长的应用。原创 2022-09-13 14:37:22 · 360 阅读 · 0 评论 -
SpringBoot源码剖析之SpringBoot执行流程
SpringApplication.run()方法到底是如何做到启动Spring Boot项目的呢?执行流程剖析public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) { return run(new Class[]{primarySource}, args);}public static ConfigurableApplicationContext run(Cl原创 2022-01-20 17:05:39 · 733 阅读 · 0 评论 -
SpringBoot源码剖析之自动配置
准备自动配置剖析1、先来看看@SpringBootApplication存在三个核心注解@SpringBootConfiguration 实际上就是 标识当前类为配置类@EnbaleAutoConfiguration: 开启自动配置@ComponentScan : 自定的类不扫描2、@EnableAutoConfiguration 开启自动配置如何进行自动配置的呢?@AutoConfigurationPackage : 对当前配置类所在包,极其子包进行组件扫描@Import(原创 2022-01-19 15:38:19 · 433 阅读 · 0 评论 -
Mybatis源码剖析之插件interceptor执行原理
预读mybatis通过插件 对(Executor、StatementHandler、ParameterHandler、ResultSetHandler) 这四个 核心对象创建代理进行拦截对mybatis来说插件就是拦截器,用来增强核心对象的功能,增强功能本质上是借助于底层的 动态代理实现的,换句话说,MyBatis中的四大对象都是代理对象Mybatis核心对象介绍MyBatis的主要的核心部件有以下几个:Configuration 初始化基础配置,比如MyBatis的别名等,一些重要的类型对象原创 2022-01-17 17:24:18 · 1031 阅读 · 0 评论 -
Mybaits源码剖析之自定义插件interceptor
预读我们知道插件默认对Executor,StatementHandler,ParameterHandler,ResultSetHandler 进行拦截.对mybatis来说插件就是拦截器,用来增强核心对象的功能,增强功能本质上是借助于底层的 动态代理实现的,换句话说,MyBatis中的四大对象都是代理对象Mybatis所允许拦截的方法如下:执行器Executor (update、query、commit、rollback等方法);SQL语法构建器StatementHandler (pre原创 2022-01-17 16:11:26 · 390 阅读 · 0 评论 -
Mybatis源码剖析之二级缓存
序言mybatis默认开启一级缓存,一级缓存存在于Executor中,而executor存在于sqlSession中,因此一级缓存可以当作在sqlSession生命周期中。与一级缓存不同,二级缓存和具体的命名空间绑定,一个Mapper中有一个Cache,相同Mapper中的MappedStatement共用一个Cache,一级缓存则是和 SqlSession 绑定。准备启用二级缓存1、开启全局二级缓存配置:<settings><setting name="cacheEnabl原创 2022-01-15 16:10:01 · 436 阅读 · 0 评论 -
Mybatis源码剖析之Mybatis执行流程(proxy 代理)
预读Mybatis在设计上,分为三层:接口层,数据处理层,框架支持层在接口层中,分为传统模式:通过sqlSession + statementId。接口代理模式:sqlSession+mapper接口准备<configuration> <!--加载外部的properties文件--> <properties resource="jdbc.properties"></properties> <!--开启全局的二级原创 2022-01-15 14:48:09 · 551 阅读 · 0 评论 -
mybatis源码剖析之typeAlias类型别名
mybatis默认定义了许多的类型别名,用来简化mapper.xml的编写从mybatis执行流程分析可知,typeAlias是mybatis解析核心配置文件的时候封装的过程分析1、通过classLoader 读取核心配置文件 为输入流注意:只要是流,底层就是数组,那么就存在两个指针 一个position指向数组存储元素的后一个节点,一个limit指向尾节点2、解析配置文件,封装Configuration对象 创建DefaultSqlSessionFactory对象通过XMLCon原创 2022-01-15 13:56:00 · 415 阅读 · 0 评论 -
Mybatis源码剖析之Mybatis执行流程(传统方式)
预读Mybatis在设计上,分为三层:接口层,数据处理层,框架支持层在接口层中,分为传统模式:通过sqlSession + statementId。接口代理模式:sqlSession+mapper接口准备userMapper.xmlmybatis核心配置文件<configuration> <!--加载外部的properties文件--> <properties resource="jdbc.properties"></prop原创 2022-01-15 11:59:25 · 413 阅读 · 0 评论 -
Mybatis源码剖析之Mybatis架构设计以及核心组件作用
架构设计核心组件作用原创 2022-01-14 10:40:04 · 161 阅读 · 0 评论 -
SpringMVC源码剖析之自动注入Request,为什么可行?
问题:我们知道在SpringMVC中controller层可以通过Autowire自动注入Request到当前类来使用如果看过Spring源码,IOC容器进行实例化bean的时候,一级缓存中存放的都是单例Bean。那么是否意味着Request,也是单例Bean,会不会出现线程安全?如果使用过request,发现其并不会出现线程安全问题,那为什么单例Bean Request不会出现线程安全问题?解决概述request实际上是一个代理对象,因此依赖注入request是一个代理对象,当通过reques原创 2022-01-13 11:48:49 · 879 阅读 · 0 评论 -
SpringMVC源码剖析之参数解析器处理handler参数流程
准备我们之前分析过通过handlerMapping获取到了handler以及对应的所有拦截器,在通过handlerAdapter找到匹配的handlerAdapter处理handler方法1、通过handlerAdapter 调用 handler方法,最终返回modelAndVIew,如果返回json对象给前端,那么MAV为null1.1、获取dataBinder工厂 ,通过获取handler所在类上的initBinder创建dataBinder工厂private WebDataBinder原创 2022-01-12 22:02:33 · 613 阅读 · 2 评论 -
SpringMVC源码剖析之SpringMVC工作流程
SpringMVC九大组件HandlerMapping(处理器映射器)HandlerMapping 是⽤来查找 Handler 的,也就是处理器,具体的表现形式可以是类,也可以是⽅法。⽐如,标注了@RequestMapping的每个⽅法都可以看成是⼀个Handler。Handler负责具 体实际的请求处理,在请求到达后,HandlerMapping 的作⽤便是找到请求相应的处理器Handler 和 Interceptor.HandlerAdapter(处理器适配器)Handler原创 2022-01-12 21:48:49 · 377 阅读 · 0 评论 -
Spring源码剖析之@Transactional
准备我们知道使用@Transactional,要满足以下条件1、配置数据源 DataSource2、配置事务管理器 PlatformTransactionManager3、配置类上标识 @EnableTransactionManagement@Configuration@PropertySource(value = {"classpath:jdbc.properties"},encoding = "UTF-8")public class TransactionalConfig {原创 2022-01-10 12:30:05 · 466 阅读 · 0 评论 -
Spring源码分析之AOP拦截器调用流程
Spring AOP 拦截器调用流程1、代理对象调用invoke方法@Override @Nullable public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object oldProxy = null; boolean setProxyContext = false; /** * 【1】获取代理工厂 */ TargetSource targetSour原创 2022-01-07 17:32:12 · 718 阅读 · 0 评论 -
Spring源码剖析之AOP代理对象创建
准备我们通过AOP实现日志记录来剖析AOP/** * 日志切面 * * 实现日志记录 */@Aspect@Componentpublic class LogAspect { public LogAspect(){ System.out.println("LogAspect 构造方法"); } /** * 将指定注解作为切入点 */ @Pointcut("@annotation(com.xiaoxu.annotatio原创 2022-01-07 17:30:59 · 625 阅读 · 0 评论 -
Spring源码剖析之循环依赖
什么是循环依赖循环依赖其实就是循环引用,两个或两个以上的Bean相互依赖,相互引用,例如A依赖B,B依赖于A,如果不加以处理,Bean A,Bean B 都无法创建成功。因为创建A的时候发现依赖B,于是去创建B,创建B的时候依赖A,这样整个SpringBean创建周期无法完成。Spring中循环依赖的场景依赖注入方式构造器注入导致循环依赖set注入注解注入构造器注入导致的循环依赖,无法被解决,因为创建A需要对象B,B又需要A,连基本的反射创建对象都创建不了。实际上就是Bean B ,Bea原创 2022-01-06 20:27:22 · 571 阅读 · 0 评论 -
Spring源码剖析之Bean创建流程
准备注意: spring中,Bean分为两种,一种Bean,一种FactoryBean。本质上没什么区别都是往IOC容器中注册Bean。但是形式上有区别,前者往IOC容器中注册了一个对象,后者为两个且后者FactoryBean主要用户创建复杂对象,例如SqlSessionFactoryBean,创建之前需要进行大量的XML解析而Bean由于创建的流程,又分为SpringBean和普通Bean。IOC容器一级缓存池中存放的是SpringBean,只是简单通过反射创建的称之为普通Beanrefresh方原创 2022-01-05 16:43:28 · 612 阅读 · 0 评论 -
Spring源码剖析之@Configuration核心配置类解析
ConfigurationClassPostProcessor 解析 @Configuration原创 2022-01-05 10:05:52 · 406 阅读 · 0 评论 -
java虚拟机(JVM)面试题
Java内存区域说一下 JVM 的主要组成部分及其作用?JVM包含两个子系统和两个组件,两个子系统为Class loader(类装载)、Execution engine(执行引擎);两个组件为Runtime data area(运行时数据区)、Native Interface(本地接口)。Class loader(类装载):根据给定的全限定名类名(如:java.lang.Object)来装载class文件到Runtime data area中的method area。Execution e转载 2021-07-30 11:22:28 · 284 阅读 · 0 评论 -
什么是GC root ,GC root原理
1、GC root原理GC root原理:通过对枚举GCroot对象做引用可达性分析,即从GC root对象开始,向下搜索,形成的路径称之为 引用链。如果一个对象到GC roots对象没有任何引用,没有形成引用链,那么该对象等待GC回收。2、GC root对象是什么?Java中可以作为GC Roots的对象1、虚拟机栈(javaStack)(栈帧中的局部变量区,也叫做局部变量表)中引用的对象。2、方法区中的类静态属性引用的对象。3、方法区中常量引用的对象。4、本地方法栈中JNI(Native原创 2021-07-30 10:20:07 · 16148 阅读 · 0 评论 -
Java基础面试题
本文转载自thinkwonJava概述何为编程编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程。为了使计算机能够理解人的意图,人类就必须要将需解决的问题的思路、方法、和手段通过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令一步一步去工作,完成某种特定的任务。这种人和计算机之间交流的过程就是编程。什么是JavaJava是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大转载 2021-07-19 16:16:23 · 1011 阅读 · 0 评论 -
java多线程面试题
基础知识为什么要使用并发编程(并发编程的优点)充分利用多核CPU的计算能力:通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升方便进行业务拆分,提升系统并发能力和性能:在特殊的业务场景下,先天的就适合于并发编程。现在的系统动不动就要求百万级甚至千万级的并发量,而多线程并发编程正是开发高并发系统的基础,利用好多线程机制可以大大提高系统整体的并发能力以及性能。面对复杂业务模型,并行程序会比串行程序更适应业务需求,而并发编程更能吻合这种业务拆分 。并发编程有什么缺点并发编程的目的就是为原创 2021-07-28 22:49:12 · 551 阅读 · 0 评论 -
AQS(abstractQueuedSynchronizer)锁实现原理详解
AQS(abstractQueuedSynchronizer)锁实现原理详解AQS是什么AQS(abstractQueuedSynchronizer)抽象队列同步器。其本身是一个抽象类,提供lock锁的实现。聚合大量的锁机制实现的共用方法。AQS(abstractQueuedSynchronizer)结构图为什么要使用AQS1、我们使用的可重入锁(公平锁/非公平锁)底层实现是AQS。通过实现AQS(队列同步器)子类Sync的FairSync和NonfairSync2、为什么线程争抢锁时,没原创 2021-07-28 10:49:55 · 1095 阅读 · 0 评论 -
java综合面试题
一些大厂的面试题蚂蚁花呗一面:Java容器有哪些?哪些是同步容器,哪些是并发容器?ArrayList和LinkedList的插入和访问的时间复杂度?java反射原理,注解原理?新生代分为几个区?使用什么算法进行垃圾回收?为什么使用这个算法?HashMap在什么情况下会扩容,或者有哪些操作会导致扩容?HashMap push方法的执行过程?HashMap检测到hash冲突后,将元素插入在链表的末尾还是开头?1.8还采用了红黑树,讲讲红黑树的特性,为什么人家一定要用红黑树而不是AVL、B树之类原创 2021-07-25 18:15:20 · 609 阅读 · 2 评论 -
JVM内存模型和JVM调优
JVM内存模型和JVM调优JVM内存模型注意:方法区的实现是MetaSpace,JVM中方法区和堆是共享的,每一个线程的自己独立的执行栈,pc计数器,本地方法栈均为线程私有JVM堆的划分1、创建的对象都会放入heap中的Eden区2、当Eden区满时,会开启youngGC,存活对象放入from区3、下次扫描时,就会扫描Eden区和from区,将存活的对象放入To区,From区和To区进行交换(复制交换)4、当对象经过15次交换后,将对象放入oldGen(full GC 主要是回收oldG原创 2021-07-23 15:20:40 · 272 阅读 · 1 评论 -
ArrayList在并发情况下的解决方案
ArrayList不是线程安全的怎么证明呢?public static void main(String[] args) { List<String> list = new ArrayList<>(); for (int i = 0; i < 10; i++) { new Thread(()->{ try { list.add(UUID.原创 2021-07-20 11:43:06 · 1514 阅读 · 0 评论 -
hashMap原理
HashMap原理hashMap底层由哈希表构成。 在jdk1.8中 hashMap由数组+链表+红黑树构成在介绍HashMap之前,有必要知道1、什么hashHash,一般翻译为“散列”,也有直接音译为“哈希”的,这就是把任意长度的输入通过散列算法,变换成固定长度的输出,该输出就是散列值(哈希值);这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的原创 2021-07-20 09:54:03 · 876 阅读 · 0 评论