自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

李哈zzz的博客

各种框架的源码解读,工具分享,分享平常遇见的bug

  • 博客(91)
  • 收藏
  • 关注

原创 JVM源码剖析之信号处理机制

在看到Saturn唯品会的分布式调度框架时,看到此框架使用了信号处理,并且外面关于Java信号处理机制的文章很少有写到JVM层面,所以笔者心血来潮写下了这篇关于Java信号处理机制的文章~因为Java信号处理机制是依赖于底层操作系统的信号处理机制,本文重点关注于Java信号处理机制,所以并不会过度的去介绍操作系统的信号处理机制~

2023-12-13 16:45:31 401

原创 JVM源码剖析之为什么ctrl+c能够结束JVM进程

在Linux和mac操作系统上当开发者运行Java程序(当然不限于Java程序)想停止结束进程时一般都使用ctrl+c或者kill -9 进程号来结束。那么肯定会有开发者对ctrl+c为什么能结束JVM进程感到兴趣,所以笔者写在了这篇关于ctrl+c结束JVM进程的文章,带领各位读者研究为什么ctrl+c能结束,以及看了源码后得到的一些 " 有趣 " 的事情~本文讲解了JVM使用信号机制优雅的关闭JVM,也讲解了如何使用Java信号机制把JVM默认的信号处理函数给替换导致JVM无法正常关闭~

2023-12-13 14:45:59 226

原创 JVM源码剖析之registerNatives方法

在Java类库中很多类都有一个registerNatives的native方法,并且写在static静态代码块中进行初始化调用,有不少的读者应该会对这个方法感兴趣,但是此方法是一个native方法,让不少的读者望而却步,所以笔者写在这一篇关于registerNatives方法的文章~

2023-12-13 10:01:22 564

原创 JVM源码剖析之你不知道的HashCode

笔者看了很多关于HashCode文章,发现大家很多都是" 面试宝典 " 的内容照搬,这对于喜欢底层研究的程序员来说不是好事,所以在这种情况下促使我写下这篇关于hashCode的文档。hashCode 作为一个native方法定义在Object类中,方法上给出了方法的注释和定义。Returns:See Also:此方法返回一个整数的hash码,此方法提供给HashMap类使用此方法在同一对象上多次调用都返回同一个hash码。

2023-12-12 15:51:11 128

原创 RocketMQ源码剖析之createUniqID方法

首先,笔者先吐槽一下RocketMQ的官方,源码中啥注释都没有,虽然文档给的多,但是很多都是版本过时不及时更新,阅读者只能靠自己的强硬的技术去理解~回归正题,如今互联网的技术离不开微服务、分布式的体系,所以在分布式的体系中如何创建一个全局唯一的ID是大家所面对的问题。现大厂都提出了解决方案:Twitter的雪花算法(Snowflake)、美团的Leaf算法、以及Mysql、Redis 这种自带原子性操作的中间件。

2023-11-29 15:44:56 157

原创 JVM源码剖析之软、弱、虚引用的处理细节

对于大大大大大大部分Java业务场景来说都是强引用,基本上不会使用到软、弱、虚引用。而在JDK1.2推出的软、弱、虚引用大部分出现场景都是在缓存中,在JDK类库ThreadLocal、WeakHashMap。框架:Mybatis、Netty、以及各种缓存框架等等。至于为什么要用在缓存中呢,也很好理解,因为这些引用实际上可有可无,完美契合于缓存,在有的时候给系统加速,在系统内存紧张的时候清除缓存给核心业务使用。

2023-11-10 15:56:52 801

原创 JVM源码剖析之Thread类中sleep方法

大部分的Java程序员知道让线程睡眠的方法是Thread.sleep方法,而这个方法是一个native方法,让很多想知道底层如何让线程睡眠的程序员望而却步。所以笔者特意写在这篇文章,带各位读者剖析一下Thread.sleep方法背后的神秘。sleep的底层实现并不复杂,但是不看源码是不会知道,如果传入的时间为0会优化成yield方法,并且在底层并不会像Object类中wait方法一样,释放锁资源等等~

2023-10-08 16:52:08 510

原创 JVM源码剖析之线程的创建过程

对于Java线程的创建这个话题,似乎已经被"八股文"带偏~ 大部分Java程序员从"八股文"得知创建Java线程有N种方式,比如new Thread、new Runnable、Callable、线程池等等~ 而笔者写下这篇文章的目的是让大家从JVM源码的层面知道创建一个Java线程的方式。

2023-10-08 15:37:50 304

原创 Netty源码剖析之IdleStateHandler空闲检测机制

在各种论坛上,笔者看到大部分的博客都是把netty的IdleStateHandler说成心跳机制,而笔者认为这并不是心跳机制,仅仅是跟心跳机制比较相似,并且IdleStateHandler能做的并不仅仅只有"心跳机制",笔者认为叫做空闲检测机制比较适合。为什么说叫做空闲检测机制比较合适呢?因为netty是封装了NIO,而提及IO无非就是输入输出,换种方式说无非就是读和写。

2023-09-08 17:14:02 602

原创 Netty源码剖析之HashedWheelTimer时间轮

在上篇文章中讲述了PriorityQueue优先级队列,它底层由小顶堆实现(完全二叉树),在插入元素的时候需要向上调整(siftUp),在取出元素的时候需要向下调整(siftDown),调整的过程是非常浪费性能,尤其是数据量过多的时候。而时间轮通过O1的时间复杂度直接定位在哪一块上,如果有冲突就使用链表把定位在同一块的任务链起来,不需要任何的调整,整体效率比小顶堆高,尤其是数据量大的时候差距就更加的明显~

2023-09-08 15:10:42 287

原创 JDK源码剖析之PriorityQueue优先级队列

在数据结构中,队列分为FIFOLIFO两种模型,分别为先进先出,后进后出先进后出,后进先出(栈)而一切数据结构都是基于数组或者是链表实现。在Java中,定义了Queue接口,接口中定义了CRUD的基本方法。分别add、offer、remove、poll等等,而PriorityQueue 实现此接口实现了基本的CRUD的同时拥有了自己的特性,从名字来看也能知道是优先级队列 : 保持队列头部节点是整条队列中永远是最小或者最大的节点,其实现原理就是一个小顶堆或者大顶堆。上文提及到。

2023-09-07 16:54:45 190

原创 Linux内核源码剖析之kmem_cache_create

一个操作系统对于内存的管理是非常的重要,关乎到整个系统的运行效率和内存最大使用率。内存管理从宏观来看,无非就是使内存达到最大使用率,减少内存的内/外碎片。而在Linux内核中使用伙伴算法(Buddy)管理一组页,使用Slab算法管理单独页,伙伴算法+Slab算法合理的避免内存的内/外碎片。那么今天介绍的kmem_cache_create方法就是Slab算法。

2023-08-29 16:49:56 1019

原创 Netty源码剖析之FastThreadLocal机制

FastThreadLocal完全是O1时间复杂度,不过是空间换时间罢了,存在一定的内存浪费(尤其是项目中大量使用FastThreadLocal,每个线程的InternalThreadLocalMap会越来越大,浪费会越来越多,不过,如今内存不值钱,用很小很小一部分内存换取执行效率是值得的~!

2023-08-24 16:18:26 241

原创 Linux内核源码剖析之TCP保活机制(KeepAlive)

为什么写下这篇文章,因为在实际项目中,是无法避免TCP通讯(对于这点,可能大部分Java程序员感受不到底层的网络通讯),正因为无法避免TCP通讯,恰好TCP通讯存在三次握手和四次挥手的过程,如果建立一次连接就三次握手和四次挥手,而我们清楚的知道三次握手和四次挥手是同步的过程,此过程也会带来不少的时间浪费和资源的浪费。所以Linux内核TCP网络协议栈就出现了KeepAlive机制,此机制减少三次握手和四次挥手次数,第一次建立连接后保持长连接,后续通讯就可以只考虑发送数据报文即可。往往出现一个机制解决某个问题

2023-08-15 15:12:04 3103

原创 JVM源码剖析之Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded异常

最近在群里看到有一位老哥拿着异常信息到处问,而发生的就是java.lang.OutOfMemoryError: GC overhead limit exceeded异常,恰好看到经常有人询问关于这个异常的问题,如何发生的,要如何解决呢?所以促使我写下这篇文章,此文章分为3大块,出现的原因,如何解决,源码论证。

2023-08-11 16:13:13 910

原创 JVM源码剖析之System.getProperty实现

System.getProperty 方法大家并不陌生,在各大框架源码中都能见到,项目中也能使用到,那么此篇文章将带你揭开System.getProperty方法底层实现。System.getProperty 可以拿到当前系统属性,比如当前操作系统的属性、动态链接库位置、编码集、当前虚拟机的版本等等一系列系统属性。当然,你可以把它理解为整个系统上下文的一个存储数据的集合,你可以往里面set属性,任何地点get取出,并且线程安全。下面案例是展示了默认情况下所有的属性(所有的key都展示出来了,项目中如需使

2023-08-09 17:11:28 1059

原创 JVM源码剖析之Java命令行参数全解

最近,有一位网友询问关于Java命令行参数方面的问题,因为在Java中参数有很多种,有不少的读者一直没弄明白,所以特意写下此篇文章。此篇文章分2大块,第一块是不同参数的解释,第2块就是JVM源码论证~图1-1给出了运行Java代码的命令行,其中包括了启动命令和不同种类的参数,分别用红、黄、黑、绿、蓝、粉 6种颜色代表。

2023-08-09 15:11:22 1126

原创 JVM源码剖析之JIT工作流程

Hotspot中执行引擎分为解释器、JIT及时编译器,上篇文章描述到解释器过度到JIT的条件。[JVM源码剖析之达到什么条件进行JIT优化](https://blog.csdn.net/qq_43799161/article/details/131831105?spm=1001.2014.3001.5501) 这篇文章大致讲述JIT的编译过程。在JDK中javac和JIT两部分跟编译原理挂钩,而编译原理抛开内部实现的算法,从思想的角度出发可以分为前端、中间IR、后端,见图1.1描述。比如拿javac举例,开

2023-07-27 14:11:57 905

原创 JVM源码剖析之达到什么条件进行JIT优化

在Hotspot虚拟机中执行引擎包括解释器、JIT及时编译器。从" Hotspot" 这个单词也能看出,此虚拟机为了热点而生。Hotspot虚拟机默认允许2大执行引擎同时进行工作,在正常情况下使用解释器进行工作,当达到一定阈值后从解释器转为JIT编译器工作(PS:当然,一切都可由开发者高度配置,比如:只允许解释器,比如转换阈值变低等等,为了篇幅,这里并不会把配置参数提供出来)

2023-07-21 09:38:21 360

原创 JVM源码剖析之-Xms和-Xmx参数最小的设置值是多少

JVM是一个运行在操作系统上的虚拟机。因为是一台虚拟的机器,所以对于内存肯定是可以控制的,恰好JVM提供了众多个参数控制内部运行时,而Xms和Xmx两个参数是用来控制Java堆内存的最小内存和最大内存。可能不少读者会好奇Xms和Xmx两个参数能够设置的最小值是多少,所以笔者借助源码来简单论述~答案先放在这里JDK8JDK12。

2023-07-17 15:08:18 3632

原创 JVM源码剖析之Java对象创建过程

关于 "Java的对象创建" 这个话题分布在各种论坛、各种帖子,文章的水平参差不齐。并且大部分仅仅是总结 "面试宝典" 的流程,小部分就是copy其他帖子,极少能看到拿源码作为论证。所以特意写下这篇文章。

2023-07-07 15:44:28 1051

原创 JVM源码剖析之SymbolTable和StringTable

很多读者在观看JVM相关的书籍时会看到SymbolTable和StringTable,书中的三言二语介绍的不是很清楚,并且读者的水平有限,导致无法理解SymbolTable和StringTable。所以特意写此篇图文并茂的文章来彻底理解SymbolTable和StringTable这两张表。因为Hotspot是c++构成,所以也存在面向对象的思想,也即存在类和对象,所以直接看到SymbolTable和StringTable的类定义即可。

2023-07-04 15:56:53 836

原创 JVM源码剖析之JVM层面调用Java方法

先看以下2个案例。为什么调用Thread的start方法就能执行Runnable的代码?作为Java开发者,一定明白main方法是作为Java程序的入口。那么,为什么是main方法?那main方法是如何被调用执行的?此篇文章借用2个很简单的案例,带读者明白JVM层面是如何调用Java方法。

2023-07-03 19:49:53 828

原创 JVM源码分析VMThread线程

而安全点的触发工作就是"VMThread"线程来做,并且此线程还会执行需要安全点才能执行的工作,比如:GC垃圾回收、dump 线程堆栈数据 等等需要安全点的操作。

2023-05-31 16:15:43 1282

原创 JVM Shutdown Hook 机制原理以及源码分析

最近看众多框架源码的时候都看到使用到了Shutdown Hook机制。比如下图:SkyWalking、Spring、Tomcat等等框架,几乎只要是Java层面的框架都会使用到此机制。所以,借用论坛给读者写一篇关于JVM Shutdown Hook 机制原理分析以及源码分析。

2023-05-09 15:35:38 897 1

原创 Spring Cloud组件源码之LoadBalancer源码分析

由于原有的负载均衡组件Ribbon停止维护,而完美的Spring生态怎能允许缺少负载均衡组件呢?Spring Cloud官方自己造出了Spring Cloud LoadBalancer来代替原有的Ribbon。由于是官方自己写的组件,所以并没有像eureka、Feign那样抽出一个单独的组件包出来。放入到Spring Cloud Commons规范包中。

2023-04-13 17:15:45 923

原创 Spring Cloud LoadBalancer自定义负载均衡策略

由于原有的负载均衡组件Ribbon停止维护,而完美的Spring生态怎能允许缺少负载均衡组件呢?Spring Cloud官方自己造出了Spring Cloud LoadBalancer来代替原有的Ribbon。由于是官方自己写的组件,所以并没有像eureka、Feign那样抽出一个单独的组件包出来。而放入到Spring Cloud Commons规范包中。

2023-04-13 16:15:17 1167 1

原创 Spring Cloud组件源码之OpenFeign源码分析

既然是学习OpenFeign源码,我们第一步是不是应该清楚Openfeign的架构,由上图我们得知Spring Cloud 组件名 承上启下,向下兼容组件,向上实现规范和扩展。那么把Spring Cloud Openfeign带入进去就很好理解了,向下兼容Feign这个组件,向上实现规范和扩展。反观,我们连Feign这个组件的原理都不知道,就去学习Spring Cloud Openfeign那怎么学得懂呢?下面是Feign这个组件的架构思想图。一言以蔽之:简化Http客户端的操作,兼容众多Http客户端

2023-04-12 17:26:24 1336 1

原创 @RefreshScope注解底层源码分析

最近在研究Spring Cloud和Spring Cloud Alibaba源码,在看到Nacos的配置中心的时候,有注意到自动刷新配置的玩法,底层实现依靠@RefreshScope注解。那么为什么要写这篇文章呢?笔者认为@RefreshScope注解源码实现跨度特别大,从Spring Cloud Alibaba 到Spring Cloud 到 Spring Boot 再到Spring,笔者认为能够理解它的源码实现的话对Spring全家桶的理解又能上升一个档次~版本如果下:先会用,再深入源码,所以我们

2023-04-06 15:13:17 1059 4

原创 JUC并发编程之ArrayBlockingQueue的底层原理

在JUC包下关于线程安全的队列实现有很多,那么此篇文章讲解ArrayBlockingQueue的实现原理。相对于LinkedBlockingQueue和来说,ArrayBlockingQueue效率比较低,但是实现比较容易,从类名也可以看出,这个是基于数组实现的队列。从简单入手,再一步步学习复杂的。JUC并发编程之LinkedBlockingQueue的底层原理JUC并发编程之SynchronousQueue的底层原理// 因为基于数组实现的队列,全局数组// 消费者索引// 生产者索引。

2023-02-01 16:45:06 381

原创 JUC并发编程之LinkedBlockingQueue的底层原理

在JUC包下关于线程安全的队列实现有很多,那么此篇文章讲解LinkedBlockingQueue的实现原理,相信各位读者在线程池中能看到或者队列来作为储存任务和消费任务的通道。一个并发安全的队列,在多线程中充当着安全的传输任务的责任。既然是介绍那么从构造方法入手最合适不过。// 初始化一个伪节点,让head和last都指向这个伪节点// 为什么需要伪节点的存在?// 因为可以保证不会发生极端情况(假设没有伪节点,并且只存在一个节点的情况下,生产者和消费者并发执行就可能出现极端情况)

2023-02-01 14:55:19 316

原创 JUC并发编程之SynchronousQueue的底层原理

判断当前线程与队列最后一个节点是否是同一个模式(因为在SynchronousQueue队列同一时刻节点都是一样的,如果当前插入的节点不一致,他就是一个匹配节点,反之,如果一致就需要插入到队尾中,阻塞等待,直到轮到他与其他线程做匹配)可以很清楚的看到不管是put还是take方法,他们的统一入口都是transferer.transfer方法,只不过参数不一致,所以也可以明白,内部可能是根据参数来判断当前是消费者还是生产者。以上代码是transfer方法的所有实现,读者先需明白,这个方法是统一的入口。

2023-01-31 23:57:29 327

原创 Synchronized底层原理系列之Synchronized的偏向锁实现原理

上篇文章已经对Synchronized关键字做了初步的介绍,从字节码层面介绍了Synchronized关键字,最终字节码层面就是和字节码指令。并且拿Synchronized关键字和Java的JUC包下的ReentrantLock做了比较。Synchronized关键字的初体验-超链接地址那么本篇文章将开始深入解析Synchronized关键字的底层原理,也就是解析Hotspot虚拟机对和字节码指令的实现原理。理论知识。

2023-01-14 16:17:07 757 1

原创 Synchronized底层原理系列之Synchronized的初体验

Synchronized是什么:各位Java读者,对于synchronized关键字并不陌生,在各种中间件源码或者JDK源码中都能看到,对于不熟悉synchronized的读者只知道在多线程中需要使用到synchronized关键字,知道synchronized能够保证线程安全,那么本篇文章带领各位读者对synchronized有一个认识。称之为:互斥锁(同时只能一个线程执行,其他的线程将会等待)又称之为:悲观锁(同时只能一个线程执行,其他的线程将会等待)

2023-01-13 14:17:48 593

原创 为什么C语言需要指定平台开发?

笔者心血来潮,特意站在初学者角度去思考为什么C语言需要指定平台去开发呢?物有本末,事有终始,知其先后,则近道矣。C语言的语法GCC是帮开发者实现了跨平台,但是不同的操作系统和不同CPU提供的接口不一致,所以需要C语言开发者去完成适配工作。

2022-11-15 23:11:36 553

原创 AQS源码中cancelAcquire()方法详解

首先,先考虑一个问题,什么条件会触发cancelAcquire()方法? 可以清楚的看到在互斥锁和共享锁的拿锁过程中都是有调用此方法的,而cancelAcquire()方法是写在finally代码块中,并且使用failed标志位来控制cancelAcquire()方法的执行。可以得出,在触发异常的情况下会执行cancelAcquire()方法。 可以清楚的看到,这里是响应异常,如果发生了异常,比如中断异常,那么当前线程Node需要做出取消的操作,那么下面详细的说明cancelAcquire()方法。

2022-11-08 15:07:51 1227 1

原创 C语言中volatile关键字的详解

​版本信息:Linux操作系统,x86架构,Linux操作系统下GCC9.3.1版本。GCC 9.3.0手册。看了外面很多写volatile的文章,笔者算是认为“乱七八糟”,根本没有任何论证就在下定义,所以笔者特意写这篇关于volatile的文章。先看一下GCC文档给的volatile说明:既然上述说明了volatile关键字可以避免编译器优化,那么下面笔者用2个列子来说明一下。// 没优化:int a = 10;int b = a;int c = a;int

2022-10-27 20:21:10 2121

原创 布隆过滤器的浅入浅出

物有本末,事有终始,知其先后,则近道矣。首先,我们需要明白,布隆过滤器是什么呢?为什么要存在布隆过滤器?而布隆过滤器又解决了一些什么问题呢?布隆过滤器的弊端是什么呢?一言以蔽之,用bit位(因为1字节 = 8bit,所以称为bit数组)用其中某一位来表示某个值是否存在(建立映射,1代表已经映射,0代表还未映射)。

2022-10-17 23:06:20 470

原创 Linux内核中__u16、__u32、__u64和size_t的理解

​写在前面:文章选用版本信息:Linux内核2.6.0版本、x86架构。__u系列为什么会出现__u系列的宏定义呢?原因很简单,内核需要帮你适配不同cpu架构、cpu位数。因为在32位系统中,int和long都是32位4字节的大小。而在64位系统中,int是32位4字节、long是64位8字节。在32位机中表示64位需要写成long long,这样打包运行在不同位数的机器上,就会出现未知的问题。所以内核就帮开发者适配不同机器位数的大小,如下图所示,各个平台不同位数的cpu内核都已完成适配。在

2022-08-19 12:30:23 7227 2

原创 汇编层面来理解C语言的值传递和引用传递的区别

​写在前面:突然心血来潮,想给读者写一篇关于汇编层面来理解值传递和引用传递的区别的帖子。版本信息:Linux系统(centos7)、x86汇编、32位系统、gcc 4.8.5.c语言代码如下:#includeint add_value(int a,int b){ int c = a; int d = b; return c + d;};int add_reference(int *a,int *b){ int *c = a; int *d = b...

2022-08-18 23:23:24 570

空空如也

空空如也

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

TA关注的人

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