自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

寒山道杳

合抱之木,生於毫末;九層之台,起於累土;千里之行,始於足下。

  • 博客(86)
  • 资源 (1)
  • 收藏
  • 关注

原创 JVM内存模型深度剖析

JVM对象创建过程1、类加载检查当虚拟机遇到一条new指令的时候,首先会检查这条指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化过,如果没有,那么必须执行相应的类加载过程。2、分配内存当类检查完成后,便需要为新生的对象分配内存了。不过在类加载完成的时候,对象所需的内存大小便可完全确定了。为对象分配内存的任务,实际上等同步把一块确定大小的空间从Java堆中划分出来。这个步骤有两个问题:如何划分内存(和垃圾回收算法有关系)

2022-01-25 18:04:44 617

原创 JVM类加载机制

类加载的生命周期Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析、初始化,最终形成可被虚拟机直接使用的Java类型,这个过程便被成为Java虚拟机的加载机制。当一个类型从被加载到虚拟机内存开始,到卸载出内存为止,这样的整个生命周期经历加载、验证、准备、解析、初始化、使用、卸载七个阶段。而验证、准备、解析这三个阶段一般统称为“连接”,这些阶段的顺序图如下:类加载声明周期的具体步骤如下:加载 通过一个类的全限定类名,来获取定义此类的二进制字节流。 将这些字

2021-12-31 09:27:11 346

原创 Netty 客户端连接源码解析

当服务端启动后,那么久可以做客户端连接的事情了。客户端的示例代码在Netty服务端启动源码解析那篇文章中已经有展示了,那么这里在回顾一下,代码如下:public class NettyClient { public static void main(String[] args) throws Exception { //客户端需要一个事件循环组 EventLoopGroup group = new NioEventLoopGroup(); tr

2021-12-23 14:56:04 1288

原创 Netty服务端启动源码解析

前言前面写了一系列关于NIO和Netty基础相关的文章,对于学好Netty最主要的是什么呢?那应该是需要先学好NIO和理解Netty中的Reactor线程模型,还有关于网络编程方面的一些只是,譬如封帧、编解码等。那么本篇文章就开始进行Netty源码的解析了,对于Netty源码的解析,我们还是先从代码运行链路的角度来进行源码解析,在进行源码解析之前,我们还需要先看下Netty Reactor线程模型图,如下:上图中的含义大体如下:创建两组线程池BossGroup和WorkerGroup,B

2021-12-21 22:55:08 911

原创 Netty 编解码

网络编解码网络编程为什么需要编解码我们都知道Java时们面向对象的语言,但是在网络编程中,像Java中那样的“对象”是无法进行传输的,因为在Socket 中,传输的只能是字节流。那么这便表示我们必须要将对象转换成可以在网络间进行传输的字节流。平常我们的编程中有使用过toString()这样的方法,然后再获取字节流。这样是可以将对象转换成字节流,但是经过网络传输后,接收方接收到字节流后,仍然需要将字节流还原成原始数据对象,那么也就需要类似于fromString()方法进行转换。由此我们便知道,数据的编

2021-12-17 17:28:16 1352

原创 Hystrix源码解析之——Hystrix 各类执行命令

在上一篇文章中最后提到了AbstractCommand是Hystrix中的一个重要的类,于是这篇文章中准备就这个类中关于命令执行的相关方法进行解析。本篇文章将先了解一下observe和toObservable。一、AbstractCommand#observe 方法1、com.netflix.hystrix.AbstractCommand#observepublic Observable<R> observe() { // us a ReplaySubject

2021-12-14 21:32:09 861

原创 Netty 对三种 Reactor 模式的支持

在前面 Reactor 三种模型这篇文章中,已经对 Reactor 的三种模式作了简单的描述,那么在Netty 中是如何使用这个三种模式的呢?且Netty的内部对这三种模式是如何支持的呢?接下来就开始本篇的内容吧!如何在Netty中使用Reactor三种模式 Reactor 模式 Netty 使用示例 Reactor单线程模式 EventLoopGroup eventGroup = new NioEventLoopGroup(1)

2021-12-11 10:00:00 580

原创 Netty 封帧

一、网络编程为什么需要进行消息定界封帧一般是指在一段数据的前后分别添加首部和尾部,以此形成数据帧。对数据帧而言,首部和尾部的重要作用之一,就是可以对消息进行定界。因此封帧的本身就是消息定界中的一种方式。那么我们为什么要对消息进行定界呢?其根本原因是应用层传输的对象虽然是逐个发出的,但是经过传输层之后,对象却不见得能被识别出来。所以才需要对消息进行定界。下面先来介绍下基于传输层的两种流行的协议的相关问题。1、TCPtcp是一种流式协议,和水流一样,其本身是没有界限的。当可操作的消息对象被序列化成字

2021-12-10 09:30:00 1368

原创 Reactor 三种模型

目前存在的线程模型有:传统阻塞I/O服务模型 Reactor 模式根据Reactor的数量和处理资源线程池的数量不同,有三种典型的实现单 Reactor 单线程 单 Reactor 多线程 主从 Reactor 多线程Netty 线程模式(Netty 主要基于主从 Reactor 多线程模型做了一定的改进,其中主从 Reactor 多线程模型有多个 Reactor)传统阻塞I/O服务模型模型特点:采用阻塞IO模式获取输入数据 每个连接读需要独立的线程完成数据的输入,业务处

2021-12-09 21:24:29 1548

原创 NIO 三大组件之Buffer

Buffer 基本信息Java NIO 中的 Buffer 是用于和 NIO 中的 Channel 进行交互的,数据从 Channel 中读入 Buffer 中,从 Buffer 写入 Channel中。Buffer 是一个固定数量的数据容器,其作用就是一个存储器,或者分段运输区,在这里数据可以被存储,且可以用于检索。Buffer是一个包在一个对象内的基本数据元素数组,在NIO中所有缓冲区类型都继承自抽象类Buffer,最常用的是ByteBuffer。对于Java 中的基本类型,都有一个与之对应的

2021-12-07 20:17:32 497

原创 NIO 三大组件之Channel

NIO 三大组件Channel FileChannelel ServerSocketChannel SocketChannel DatagramChannel Buffer Selector阻塞I/O与非阻塞I/O非阻塞 I/O NIO 中的非阻塞I/O是基于 Reactor 模式的,在这里I/O的调用是不会阻塞的,相反是注册感兴趣的I/O事件。如可读数据到达,便会发生触发事件。NIO 中实现非阻塞I/O的核心对象是Selector。而 Selector就是注册各种事件的地

2021-12-07 20:09:28 1123

原创 NIO 三大组件之Selector

一、Selector 简介Selector 一般称其为“选择器”,在Java NIO中起着多路复用的作用。它可用于检查一个或多个Channel(通道)的状态,是否处于可读、可写。如此便可实现单个线程管理多个channels,也就可以管理多个网络链接。因此使用Selector 的好处便是使用更少的线程来就可以来处理多个通道了,相比传统I/O,这里也就避免了线程上下文切花的开销了。这里看下Selector类的代码:public abstract class Selector implements Cl

2021-12-06 22:30:45 696

原创 Hystrix源码解析之——封装 HystrixCommand(一)

一、Hystrix简介Hystrix是Nettflix中的一个开源项目,它能够在依赖服务失效的时候,可通过隔离系统依赖服务的方式,防止服务出现级联失败,通是Hystrix也提供了失败回滚机制,是系统能够更快的从异常中恢复。其实简单的一句话就是:hystrix为微服务间的调用提供强有力父容错机制,它主要的作用有:在通过第三方客户访问依赖服务出现高延迟或者失败的时候,为系统提供保护和控制 在复杂的分布式系统中防止级联失败(服务雪崩效应) 快速失败(fail fast),同时能快速回复 提供失败回滚

2021-11-28 23:12:26 777

原创 Eureka Client 源码解析-更新本地配置到Server

在Eureka Client 源码解析这篇文章中,说到按需注册定时任务的时候,当时没有对 InstanceInfoReplicator#run 方法中的DiscoveryClient#refreshInstanceInfo 方法中的一些调用进行解析,因此这里来就这个来进行一下简单的解析。首先在 DiscoveryClient#refreshInstanceInfo 方法中开始有两个方法的调用ApplicationInfoManager#refreshDataCenterInfoIfRequired 和

2021-11-28 23:01:57 455

原创 OpenFeign 源码解析

一、核心组件与概念关于OpenFeign源码阅读,可从两个方面来进行。首先是被@FeignClient注解修饰的接口类(FeignClient 接口类)是如何创建的,就是其Bean实例是如何被创建的。然后是调用FeignClient 接口类网络请求相关的函数时,OpenFeign 时如何发送网络请求的。对于OpenFeign 相关的类,也可以以此角度来看,一部分是初始化相应的Bean 实例,另一部分是用来在调用方法时的网络请求。二、动态注册 BeanDefinitionOpenFeign可以通过

2021-11-23 20:57:54 1571

原创 Eureka Server 源码解析

Eureka Server 为了满足与 Eureka Client 的交互,它提供了以下功能:服务注册 接收服务心跳 服务剔除 服务下线 获取集群 获取注册表中的服务实例一、Eureka Server 端基本设计在这里首先看一张类结构图:从上面的类图中,可以看到最顶层的接口是 LookupService 和 LeaseManager,关于LookupService 接口,在前面一篇文章已有阐述,它的主要作用是做服务列表查询的(因为 Eureka Server 端也可以向自己发

2021-11-20 00:12:03 928

原创 Eureka Client 源码解析

一、Client 端基本信息在老版本的 Spring Cloud 的使用中,当构建客户端的时候,会在启动类上标注 @EnableDiscoveryClient 注解,但是在新版本的时候,便不需再标注了,这是因为 Spring Boot 中的自动配置机制不同的原因,这里暂不做论述。那客户端是如何做自动装配的呢?Spring Boot 自身的注解 @SpringBootApplication 本身就是一个组合注解,其中之一的 @EnableAutoConfiguration。注:本系列文章 spri

2021-11-16 22:31:54 1001 3

原创 Spring Boot 初始化阶段解析

导语前面笔者写过一篇关于Spring Boot 自动装配的文章:再说Spring Boot的自动装配原理,这篇文章是从装配的角度上去进行阐述的,其间主要是对@SpringBootApplication这个注解进行展开,然后进行一些列的相关解析,由此很多童鞋可能并不能看出什么,那么下面笔者将会对此的用意进行说明。既然说完了自动装配,那么接下来自然要说说Spring Boot的初始化和运行等...

2020-03-11 11:31:48 750

原创 再说Spring Boot的自动装配原理

导语由于疫情原因,基本上大家过了半个暑假了,过年在家的时候,感觉貌似很少有人去写技术文章,于是我也随了大流,其实更多的原因是家里比较忙,最近忙完手头的一些事情,想着要继续回来写点东西,考虑了一下还是继续接着之前的那篇文章来写吧!前面的一篇说说Spring Boot(Spring)的自动装配机制文章中,简单大概笼统的说了一下Spring Boot的自动装配机制。其间应该也有一些错讹之处,不过...

2020-02-16 19:28:56 657

原创 说说Spring Boot(Spring)的自动装配机制

导语说到Spring Boot的特性是什么,大家都可能都会说Spring Boot的特性有自动化装配,当然我也看到网上有一些文章讲这方面的,但是貌似都是Copy来Copy去的,很多也没什么新意,基本上就是简单说说几个注解的含义等等。因此笔者想着是不是该写写这方面的文章,其实笔者也是现学现卖的。既然说的是现学现卖,那么肯定写的不是特别严谨,因此如果下面的文章中,有什么不足之处也请大家多多的之处。...

2020-01-20 23:50:02 559

原创 Spring Boot 的java -jar命令启动原理

导语在运用Spring Boot 后,我们基本上摆脱之前项目每次上线的时候把项目打成war包。当然也不排除一些奇葩的规定,必须要用war包上线,不过很多时候,我们对一些东西只是处在使用的阶段,并不会去深入的研究使用的原理是什么,这貌似也是大多数人的固定思维。或许正是如此,总会有些没有固定思维的人会去积极的探索原理,当然这话不是说我是积极的,我其实也是只原理的搬运工。今天和大家来简单的说下S...

2020-01-18 15:30:31 2622 1

原创 为什么不建议数据库建外键

导语有人可能在面试的时候被问到过,你觉得为什么不建议数据库通过构建外键做约束?你可以回答说,在《阿里Java开发手册》中是这样说的:不得使用外键与级联,一切外键概念必须在应用层解决。而且这个规约是强制的。但是我想这样的答案,可能并不能让面试官满意。当然,可能也有人说:在每次对表数据进行操作时,需要考虑外键的因素,太过于繁琐,但是这依然不是问题的重点。那么该如何回答这样的一个问题呢?下面我们...

2020-01-16 20:52:21 2514

原创 深入浅出Mybatis源码解析——结果集映射流程

前言在前一篇文章中,笔者补上了一篇文章,在那篇文章中,主要说了关于SQL语句的执行流程,当SQL执行完成后,那么肯定会返回一个结果集,对于这样的结果集是需要做一个映射的,就譬如你所返回的数据是表中的数据,但是要映射成Java中的实体类对象,便需要进行映射处理。说起来很抽象,那么就不多说了,还是直接进入主题,来看看在源码中是怎么实现的。一、包装结果列元信息对象在进入正文之前,还需要再...

2020-01-14 20:13:31 2403

原创 深入浅出Mybatis源码解析——SqlSession执行主流程(补)

前言由于Mybatis的源码系列文章,期间有长时间的脱节,导致笔者在写代码解析的时候中间出现了断裂,这个要和大家说声对不起,因此本篇文章是补深入浅出Mybatis源码解析——获取Mapper代理对象流程照片文章的,在这篇文章中简单的说了一下SqlSession执行主流程,也只是简单的说了说,后面的核心代码还没有涉及。说到这里,我们还是尽快进入主题,首先回顾下前面提到的那篇文章最后的代码,如...

2020-01-08 22:24:06 348

原创 深入浅出Mybatis源码解析——BoundSql获取流程

前言停更了一个多月,博主一直在忙于技术的学习与工作的繁忙之间,其实更多的是迷茫于技术中,但是想想还是要把Mybatis系列继续更新下去。博主也给自己在20年立了几个flag:深入学习Java、研究研究c++、第三个就是健身咯,只要是因为回首2019年,感觉自己在技术学习的道路上是在没走多少,因此想着这次必须要对自己狠一点了。先不多说了,回顾一下前一篇文章,由于时隔太久,笔者都有点记不清了。...

2020-01-06 19:32:57 6109

原创 深入浅出Mybatis源码解析——获取Mapper代理对象流程

前言在上一篇文章深入浅出Mybatis源码解析——SqlSource的创建流程中,说了SqlSource的创建流程这样一个完整的创建流程,在这个流程中包含了:动态SQL标签处理器、解析动态SQL、创建MappedStatement对象。这样给我们对SQLSource这样的整个流程有了一个大概的了解。而这个过程的作用其实就是把Mapper文件中的SQL语句进行相关的解析和封装,一遍后续的执行...

2019-11-20 23:34:44 797

原创 深入浅出Mybatis源码解析——SqlSource的创建流程

前言在前一篇文章深入浅出Mybatis源码解析——映射文件加载流程中,最后说到了创建SqlSource和创建MappedStatement对象,由于篇幅原因最后只好终止了,所以便只好在写一篇文章来说说SqlSource这样的一个创建流程是怎样的,在本系列第一篇完成后,也曾问过一两个认识的读者,有说不太看得懂,可能本人写博客不够图文并茂,所以在下一篇博文中准备来整理一张Mybatis的一个完整的...

2019-11-19 23:53:20 759

原创 深入浅出Mybatis源码解析——映射文件加载流程

前言在前两篇文章中,简单了说了下Mybatis全局配置文件解析加载流程和和全局配置文件的部分标签解析,但是还并没有涉及到核心的解析。所以本篇文章将开始核心解析的部分,那就是mappers标签的解析。可能有人很奇怪这为什么不在前两篇文章中拿出来说,因为mapper标签的解析在configuration标签同层标签解析中是一个比较特殊的部分,因此需要单独拿出来进行说明。好吧,说了这么多废话,还...

2019-11-18 23:46:19 336

原创 深入浅出Mybatis源码解析——全局配置文件解析(全局配置文件解析加载流程附篇)

前言首先要说下停更这么久的原因,因为工作上最近有点忙,加上学习债的繁重以至于没有继续更新Mybatis源码解析的文章,所以趁着忙里偷闲,来简单的更新一篇。在上一篇文章深入浅出Mybatis源码解析——全局配置文件解析加载流程中,我们讲到了全局配置文件的一个加载的过程,既然只是一个加载的流程,那就有解析的流程的啦!因此大家也猜到了,本篇正是讲全局配置文件中的一些解析,在parseConfig...

2019-11-16 23:18:56 222

原创 深入浅出Mybatis源码解析——全局配置文件解析加载流程

前言前面笔者其实已经写了两篇关于Mybatis源码解析的文章,可后面自觉其解析的不够全面,但是那两篇文章完全是按照debug模式,简单的走了一遍流程去解析的,对于Mybatis内部的很多类的属性以及类的作用都没有做相关介绍。后来想想还是觉得好好写几篇关于Mybatis的文章,其实这也是为了强逼自己要深度的去阅读一下源码。现在写这篇文章的同时,也是笔者自己在学习的一个过程,如果文章中有错误之...

2019-09-27 17:55:54 342

原创 Mybatis源码解析《二》

导语在前一篇文章Mybatis源码解析《一》中,已经简单了捋了一下mybatis核心文件和mapper配置文件的一个基本的解析流程,这是理解mybatis的基本,和spring中的配置文件的加载解析是一样的道理。既然说完了文件的加载,那么接下来便是关于mybatis的核心流程了,SqlSession的创建、SQL语句的操作、session的commit和关闭。在正式开始之前先回顾下上一篇文...

2019-08-05 17:09:25 667

原创 Mybatis源码解析《一》

导语在当前的日常开发中,mybatis这样的一个框架的使用,是很多程序员都无法避开的。大多数人都知道mybatis 的作用是为了避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。因为在开始接触使用Java操作数据库的时候,我们都是使用JDBC的。自从有了持久化框架之后,使用持久化框架已经是“理所当然”的了,虽然我们已经脱离了使用JDBC是阶段了,但是这毕竟是基础的知识,所以本篇...

2019-08-02 09:59:32 371

原创 Spring源码深度解析系列——自定义bean标签解析

导语前面已经通过两篇文章说了一下bean标签的解析,感兴趣的同学可以去看一下(Spring源码深度解析系列——bean标签解析《一》和Spring源码深度解析系列——bean标签解析《二》),而这两篇是关于默认标签解析的,既然存在默认的,那么自然就有自定义的了,本篇文章便开始自定义标签的解析。首先来回顾下bean解析初始代码吧! protected void parseBeanDefin...

2019-07-16 15:56:39 599

原创 Spring源码深度解析系列——bean的加载《一》

导语通过前面的几天文章,已经对xml的解析流程进行了阐述,那么在Spring中bean的工作就完成了?其实还没有,在第一篇文章“Spring源码深度解析系列——Bean的基本实现”的测试类中,第一行的代码是对bean解析的操作,第二句便是开始实行bean的加载动作了。那么这篇文章,就是对bean这样的一个加载流程进行讲解。一、初入Bean加载在说bean的加载之前,我们先来重新看...

2019-07-10 11:24:13 323

原创 Spring源码深度解析系列——bean标签解析《二》

导语前一篇文章中,已经把bean的属性解析完成了,也讲到了把xml文档转换为GenericBeanDefinition,这样在GenericDefinition中可以找到对应的配置。但是GenericDefinition也只是子实现类,大部分的属性还是保存在AbstractBeanDefinition中的,那么可以来先看下AbstractBeanDefinition中的基本属性来了解一下在xm...

2019-07-03 16:27:01 310

原创 Spring源码深度解析系列——bean标签解析《一》

导语在上一篇文章Spring源码深度解析系列——Bean的基本实现中,阐述了bean的加载、xml的验证模式、以及文件的获取等。但这还只是一个开始,在我们获取到文件后,且进行验证之后,我们便需要对这样的文件进行解析的工作了。所以,本篇文章将开始文件解析的代码讲解。在Spring中对于标签有默认标签和自定义标签这两种,但这两种方式的用法和解析是存在很大区别的,本篇文章将只针对默认标签和大家进...

2019-07-02 16:43:34 1107

原创 Spring源码深度解析系列——Bean的基本实现

导语笔者之前虽然草草的读了关于Spring方面的源码,但也仅仅是草草的读了一下。并未作任何笔记,无奈记性太差,近些时间想起前人的话:好记性不如烂笔头。于是想着再重新阅读一下Spring方面的源码,顺便复习一下一些基础知识。接下来便开始Spring源码之旅了。首先在Spring源码系列中,笔者所使用的是 spring-boot-starter-parent2.1.6.RELEASE 版本,...

2019-06-27 18:27:17 522 2

原创 Java并发编程之ReentrantLock源码解析

一、关于ReetrantLock在上篇文章Java并发编程之AQS中,比较详细的说了一下关于AQS的设计和AQS的代码相关原理。在上篇文章中也说了,AQS是J.U.C的核心,是用来构建锁或其他同步组件的基础框架,这其中就包括了ReentrantLock。由于前面已经详细的说了AQS的原理,在本篇文章中,对于涉及到AQS相关的东西,便会一带而过。ReentrantLock和synchro...

2019-04-15 15:20:58 351

原创 Java并发编程之AQS

一、关于AQS队列同步器 AbstractQueuedSynchronizer 简称AQS,是用来构建锁或其他同步组件的基础框架(ReentrantLock、ReentrantReadWriteLock、Condition、LockSupport等等),它使用了一个int成员变量表示同步的状态,通过内置的FIFO队列来完成资源获取线程的工作,并发包作者(Doug Lea)期望它能够成为实现大部...

2019-04-12 10:27:49 547

原创 Java并发编程之synchronized底层实现原理

一、为什么出现synchronized对于程序员而言,不管是在平常的工作中还是面试中,都会经常用到或者被问到synchronized。在多线程并发编程中,synchronized早已是元老级的角色了,很多人都称其为重量级锁,但是随着Java SE 1.6对其进行各种优化之后,便显得不再是那么的重了。也正是因为多线程并发的出现,便产生了线程安全这样的问题,对于线程安全的主要原因如下:...

2019-04-09 19:24:26 4813

Java基本算法手册

java算法,基本算法,冒泡排序,递归排序。

2015-12-03

空空如也

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

TA关注的人

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