自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(79)
  • 收藏
  • 关注

原创 【线上问题】记一次公司日志基础组件SPI使用不当导致业务中断

嗯~,很好,有很多的异常,看来有的看了。然后15分钟后,不出意料的找到了异常的根因,这次告警有好几处异常,本文只分析、描述跟业务无关的异常。它主要用于可以插拔的组件之间的解耦。load方法完成ServiceLoader对象的创建,其中需要我们关注的是在ServiceLoader构造器的中会调用一个reload方法,此方法会进行迭代器类的创建,此类是SPI最核心的实现类。本文不对hasNextService()方法里面的各种处理去做详细的分析,但是有一个点需要我们知道的是,这个方法没有进行并发场景下的处理。

2024-03-17 15:22:11 931 1

原创 【线上问题】CompletableFuture与线程池使用不当导致服务整个挂掉

(内心慌的一批🌝)他开始滔滔不绝地说了一大堆是如何排查问题的(技术人的特性,对于解决问题非常热忱),虽然我当时一直保持着很认真的神态,但其实心里非常煎熬(是谁的代码导致的一直没有说!现在暂时不去分析代码,先描述现象。出现问题的那个晚上,有一波突刺流量,由于我们没有针对接口的请求失败做短信告警(虽然有钉钉异常告警群,但是大家都不是很关心群里消息🌞),因此一开始出现问题的接口出现大面积的请求超时而我们都没有感知到,直到最终服务出现不可用,值班同事才发现这个问题(经过此事件,我们很自然地加上请求失败告警🌦️)。

2024-01-21 13:10:14 997 1

原创 微服务之服务器缓存

In the difficult employment situation, we need to set a good goal and then do our own thing参考书籍:“凤凰架构”缓存在分布式系统是可选,在使用缓存之前需要确认你的系统是否真的需要缓存,因为从开发角度来说,引入缓存会提高系统复杂度,因为你要考虑缓存的失效、更新、一致性等问题(硬件缓存也有这些问题,只是不需要由你去考虑,主流的 ISA 也都没有提供任何直接操作缓存的指令);从运维角度来说,缓存会掩盖掉一些缺陷,让问题

2023-07-09 14:39:16 2969 19

原创 微服务之负载均衡

I wish the students of the college entrance examination can win the gold toad and win the title of the gold list参考书籍:“凤凰架构”现代高流量网站必须以快速可靠的方式处理来自用户或客户端的数十万(如果不是数百万)并发请求并返回正确的文本、图像、视频或应用程序数据。为了经济高效地扩展以满足这些高容量,现代计算最佳实践通常需要添加更多服务器。但是添加更多服务器也会带来一系列问题,对于用户来说系统

2023-06-11 17:53:24 1807 3

原创 微服务之流量控制

不过,由于请求总是有超时时间的,所以缓冲区大小也必须是有限度的,当注水速度持续超过出水速度一段时间以后,水池终究会被灌满,此时,从网络的流量整形的角度看是体现为部分数据包被丢弃,而在信息系统的角度看就体现为有部分请求会遭遇失败和降级。同样还是用开头的例子来解释这个问题,按照上面的几种处理方案,三个人通过合理的安排使用热水器大家都可以在合理的时间内满足各自的洗澡需求,现在我们假设你人缘特好,有那么一天有20个朋友想来你家做客,这个时候你该如何是好?在编程世界里面,热水器可以类比是系统,人看作是流量。

2023-05-28 18:10:54 947 1

原创 微服务之服务容错

Share a sentence that I think is very reasonable, as long as you can know the underlying logic of anything, you can hold it without fear参考书籍:“凤凰架构”在 Martin Fowler 与 James Lewis合写的文章《Microservices: A Definition of This New Architectural Term》中列举了微服务的九个核心的

2023-05-14 18:39:25 1224 14

原创 微服务之事务处理

因此,在事务需要回滚的场景中,三段式的性能通常是要比两段式好很多的,但在事务能够正常提交的场景中,两者的性能都依然很差,甚至三段式因为多了一次询问,还要稍微更差一些。为了能够顺利地完成崩溃恢复,在磁盘中写入数据就不能像程序修改内存中变量值那样,直接改变某表某行某列的某个值,而是必须将修改数据这个操作所需的全部信息,包括修改什么数据、数据物理上位于哪个内存页和磁盘块中、从什么值改成什么值,等等,以日志的形式——即仅进行顺序追加的文件写入的形式(这是最高效的写入方式)先记录到磁盘中。此行为可能导致两个问题。

2023-05-02 18:41:56 1498 8

原创 微服务之异步消息通信

Gregor Hope 和 Bobby Woolf 在一书中 定 义 了一 种 有 用 的 消 息 传 递 模 型。在这个模型里面,消息实体是通过消息通道进行交换的。发送方(应用程序或服务)将消息写入通道,接收方(应用程序或服务)从通道读取消息。

2023-04-22 17:58:28 1492 5

原创 微服务系列之远程服务调用

上面就是java中方法调用的核心执行过程,放在同一个JVM里面,这个过程是没有问题的,但是我们思考一下,如果是在不同的JVM里面调用会有什么问题,不难想到,此时至少面临两个直接的障碍:首先,第二步和第五步所做的传递参数、传回结果都依赖于栈内存的帮助,如果Caller与Callee分属不同的进程,就不会拥有相同的栈内存,将参数在Caller进程的内存中压栈,对于 Callee 进程的执行毫无意义。以上 RPC 中的三个基本问题,全部都可以在本地方法调用过程中找到相对应的操作。

2022-12-25 20:04:53 1484 6

原创 微服务系列之微服务架构

他发现了人类行为的一大法则,那就是,为了要使一个大人或小孩极想干某样事情,只需要设法把那件事情弄得不易到手就行了----《汤姆·索亚历险记》参考书籍:在了解微服务架构之前,我们有必要了解一下从SOA架构到微服务架构风格的演进的过程,以及这两种架构风格的关系网上很多文章对于SOA架构的定义都有不同,像Gartnet把它定义为一种软件的设计方法、百度百科把它定义为一个组件模型等等。从另一个角度来看,SOA其实是拆分复杂单体应用的一种尝试,这种尝试在架构的历史长河中不止一次,像在SOA演进过程中的烟囱式架构(

2022-12-04 21:04:57 1452 9

原创 微服务系列之初探“微服务架构”

计算机系统的软件架构是构建这个系统所需要的一组结构,包括软件元素 、它们之间的关系以及两者的属性Bass 等注 < Documenting Software Architectures: Views and Beyond>上面是卡耐基梅隆大学软件工程研究所的Les Bass及其同事对于软件架构的定义,上述的定义是非常抽象的以至于理解起来会比较吃力,那么我们应该怎么去理解这句话呢?下面是个人对于这个定义的一些见解:软件架构可以类比于“土木工程”(土木老哥:没想到这里也可以cue到我,真的是会蟹!

2022-11-27 21:47:01 513 4

原创 微服务系列之单体架构

它由业务逻辑组成,业务逻辑外面是实现用户界西的适配器和与外部系统的接口,例如移动应用程序,支付、消息和电子邮件的云服务等(这种应用层面的架构设计是没有什么问题的,符合高内聚、低耦合等软件设计理念,可以称得上一个好的设计)。但是需要知道的是,在微服务架构出现之前,基本所有的公司都用的单体架构,如果单体架构那么不堪,怎么可能会有那么多企业的架构师会选择采用单体架构进行项目的开发呢?听到这里,大家对这个系统应该是有一个比较直观的感受就是:如果系统业务非常的复杂,这个系统后期的war肯定非常的滴大。

2022-11-20 18:47:57 2142 9

原创 JVM垃圾回收系列之垃圾收集器二

G1(Garbage First)是一款面向服务器应用的垃圾收集器,主要针对配备多核CPU及大容量内存的机器,以极高概率满足GC停顿时间的同时,还兼具高吞吐量的性能特性。在JDK1.7版本正式启用,移除了Experimental标识,是JDK 9以后的默认垃圾回收器,取代了CMS回收器以及Parallel+ParallelOld组合。被Oracle官方称为“全功能的垃圾收集器”。与此同时,CMS已经在JDK 9中被标记为废弃(deprecated)。

2022-11-06 21:20:18 386 5

原创 JVM垃圾回收系列之垃圾收集器一

现在都不是单核的了。看上图,大家可能会有一个问题,为什么虚拟机提供了这么多的垃圾收集器,那这里需要大家明确一个观点:虽然我们是在对各个收集器进行比较,但并非为了挑选出一个最好的收集器,因为直到现在为止还没有最好的收集器出现,更加没有万能的收集器,所以我们选择的只是对具体应用最合适的收集器。这个收集器是一个单线程的收集器,但它的“单线程”的意义不仅仅说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是它进行垃圾收集时,必须暂停其他所有的工作线程,知道它收集结束(Stop The World)

2022-10-30 18:54:46 1160 9

原创 JVM垃圾回收系列之GCRoot算法实现

在 HotSpot的实现中,是使用一组称为OopMap的数据结构来达到这个目的的,在类加载完成的 时候,HotSpot就把对象内什么偏移量上是什么类型的数据计算出来,在JIT编译过程中,也 会在特定的位置记录下栈和寄存器中哪些位置是引用。在OopMap的协助下,HotSpot可以快速且准确地完成GC Roots枚举,但一个很现实的问题随之而来:可能导致引用关系变化,或者说OopMap内容变化的指令非常多,如果为每一条指令都生成对应的OopMap,那将会需要大量的额外空间,这样GC的空间成本将会变得很高。

2022-10-09 13:10:01 822 10

原创 JVM垃圾回收系列之垃圾收集算法

现在的商业虚拟机都采用这种收集算法来回收新生代,IBM公司的专门研究表明,新生代中的对象98%是“朝生夕死”的,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor[1]。为了解决效率问题,一种称为“复制”(Copying)的收集算法出现了,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块(也就是堆内存中的两个survivor区,在以前的堆系列文章中有过介绍)。依次反复,直到垃圾收集完成。

2022-09-25 17:03:38 752 12

原创 JVM垃圾回收系列之对象垃圾判别

以常量池中字面量的回收为例,假如一个字符串“abc”已经进入了常量池中,但是当前系统没有任何一个String对象是叫做“abc”的,换句话说,就是没有任何 String对象引用常量池中的“abc”常量,也没有其他地方引用了这个字面量,如果这时发生内存回收,而且必要的话,这个“abc”常量就会被系统清理出常量池。在每个java对象中都有引用计数器,这个计数器的作用是每当有一个引用指向这个对象,那么这个计数器就会加一,反之,每减少一个引用指向这个对象,这个计数器就会减一。判定效率高,回收没有延迟性。

2022-09-12 12:38:46 178 13

原创 JVM系列之语法糖的味道

Java语言中的泛型则不一样,它只在程序源码中存在,在编译后的字节码文件中,就已经替换为原来的原生类型(Raw Type,也称为裸类型)了,并且在相应的地方插入了强制转型代码,因此,对于运行期的Java语言来说,ArrayList< int >与ArrayList< String >就是同一个类,所以泛型技术实际上是Java语言的一颗语法糖,Java语言中的泛型实现方法称为类型擦除,基于这种方法实现的泛型称为伪泛型。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口和泛型方法。......

2022-08-28 16:32:18 463 13

原创 JVM系列之synchronized锁优化

每年“金三银四、金九银十”都是投简历的好时机,博主会在这些阶段去投递简历,看看市面上的互联网公司的要求,再调整自己技术栈学习的顺序,在最近的投递的互联网公司(包含一线、超一线、中小型)对于java开发岗位的要求基本离不开“分布式/微服务开发”、“精通java”、“jvm”、“sql调优”、“常见中间件”、“springboot开发”、“算法和数据结构”、“计算机网络”。看了这些个要求,内心浮现出了几个大字:“我顶你个肺”生活还是要继续,抱怨完就业情形,我嘎嘎就更新了jvm系列文章参考书籍:“深入理解Jav

2022-08-15 10:09:52 506 12

原创 JVM系列之java虚拟机与线程

“少年读书,如隙中窥月;中年读书,如庭中望月;老年读书,如台上玩月。皆以阅历之深浅,为所得之深浅耳”参考书籍:“深入理解Java虚拟机”个人java知识分享项目——gitee地址个人java知识分享项目——github地址线程出现的场合一般都会有数据并发安全,而如何保证数据并发安全又是java程序员必备的一项技能,今天这篇文章我们就从java虚拟机的角度去了解线程的底层原理。let’s go!!我们知道,线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既

2022-08-08 09:00:00 430 9

原创 JVM内存模型之深究模型特征

“人生当自强,人的一生,总会遇见挫折磨难,但人生没有过不去的坎,走过了,便是一种收获,便会让自己成长起来”参考书籍:“深入理解Java虚拟机”个人java知识分享项目——gitee地址个人java知识分享项目——github地址Java内存模型要求lock、unlock、read、load、assign、use、store、write这8个操作都具有原子性,但是对于64位的数据类型(long和double),在模型中特别定义了一条相对宽松的 规定:允许虚拟机将没有被volatile修饰的64位数据的读写

2022-07-30 15:05:09 257 7

原创 JVM内存模型之Volatile关键字

当一个变量定义为Volatile之后,它将具备两种特性,第一是保证此变量对所有线程的可见性,这里的“可见性”是指当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的。总结地说就是volatile变量在各个线程的工作内存中不存在一致性问题(在各个线程的工作内存中,volatile变量也可以存在不一致的情况,但由于每次使用之前都要先刷新,执行引擎看不到不一致的情况,因此可以认为不存在一致性问题),但是Java里面的运算并非原子操作,导致volatile变量的运算在并发下一样是不安全的。...

2022-07-24 10:53:23 264 11

原创 我的创作纪念日

当时心里觉得啥也不会,学校已经开设过C、C++、Java、Python等跟语言相关的课程,学校老师竭尽全力教我们,奈何当时只想在球场上驰骋,所谓是“人在教室,心在球场”。不知不觉,从开始写博客到如今已经两年,真是时间如白驹过隙。还依稀记得当时第一篇博客是疫情原因在家上课的时候发布的“android学习之手势的创建和识别!”,这篇文章算是在CSDN开始写作的第一步,现在回头看看这篇文章真是简陋的让我羞愧(不过还是要感谢当时的自己能够鼓起勇气去发布这篇博客(^ω^))。两年内达到高级开发!...

2022-07-15 10:41:00 518 9

原创 JVM内存模型系列之初探内存模型与线程

开心周末配上JVM系列文章更加的美味!🇨🇳🇨🇳🇨🇳🇨🇳(^ω^)

2022-07-09 11:42:56 412 8

原创 JVM系列之对象的创建

“学而不厌,诲人不倦”参考书籍:“深入理解java虚拟机”个人java知识分享项目——gitee地址个人java知识分享项目——github地址案例代码:反编译(javap -c ApplicationContextStarter.class)得到的结果:通过案例去解析整个对象的创建过程,分析main方法中的字节码指令(ApplicationContextStarter()是构造器方法,我们这里不去过多关注):1.当java虚拟机遇到字节码new指令时,首先会去检查这个指令的参数是否能在常量池(方法区)

2022-07-03 11:34:48 538 15

原创 JVM系列之对象深度探秘

jvm的内存布局深入解析

2022-06-26 10:23:49 439 14

原创 JVM系列之执行引擎

经典栏目如期而至。之前我们已经了解到了JVM的类加载过程和运行时内存区的基础相关内容,今天我们来了解“执行引擎”。参考书籍:“深入理解java虚拟机”JVM的主要任务是负责装载字节码到其内部,但字节码并不能直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅是一些能够被JVM所识别的字节码指令、符号表、以及其他辅助信息。那么,如果想要让一个java程序运行起来,执行引擎的任务就是将字节码指令解释/编译为对应平台相应的本地机器指令才可以。简单来说,JVM的执行引擎充当了将高级语

2022-06-05 17:21:20 182 5

原创 JVM运行时内存区系列之方法区

JVM运行时内存区系列之堆

2022-05-29 09:53:38 186 2

原创 JVM运行时内存区系列之栈

起步哟西,一星期一更的系列闪亮登场!参考书籍:“深入理解java虚拟机”经常有人把java内存区域笼统地划分为堆内存(Heap)和栈内存(Stack),这种划分方式直接继承自传统的C、C++程序的内存布局结构,在Java语言里就显得有些粗糙,实际的内存区域划分要比这更复杂。栈:线程独占的内存区域(按照线程划分内存区域的方式),它可以细分为程序计数器、Java虚拟机栈、本地方法栈这三块区域。程序计数器程序计数器(Program Counter Register)是一块较小的内存空间,它可

2022-05-10 18:06:16 445

原创 JVM运行时内存区系列之堆

起笔今年的五一,大家可能无法领略到“优美逶迤”的山岭和享受“沁人心脾”的山间泉水。但是可以看到博主的“JVM系列的文章”也不算是虚度了五一嘛!(哈哈🎉🎉✨✨✨🎉✨大家五一节快乐!!!)参考书籍:“深入理解java虚拟机”Java堆Java堆是虚拟机所管理的内存中最大的一块,且所有的对象示例以及数组都应当在堆上分配Java堆是所有的线程共享的的一块内存区域,在虚拟机启动的时候创建。此内存区域的唯一目的就是存放对象示例。从垃圾回收的角度上来看,堆又可以细分为“新生代”(新生代中包含Eden区

2022-05-01 11:05:42 268 13

原创 JVM类加载系列之初始化过程

引言一星期一更的节目可能会迟到,但永远不会缺席!!!参考书籍:“深入理解java虚拟机”初始化(Initiallization)初始化阶段,简言之,为类的静态变量赋予正确的初始值。具体描述:类的初始化是类装载的最后一个阶段,如果前面的步骤都没有问题,那么表示类可以顺利装载到系统中。此时,类才会开始执行Java字节码。(即:到了初始化阶段,才真正开始执行类中定义的Java程序代码。)初始化阶段的重要工作是执行类的初始化方法:clinit()方法该方法仅能由Java编译器生成并由JVM调

2022-04-25 20:21:38 929 11

原创 JVM类加载系列之链接过程

起笔经过一个星期的面试,拿了几个offer,碰到了很多的面试官,感觉最好的是“泛微”。然后稍微总结一下面试官都会问的一个重点:javase的熟练程度 (集合、并发…)spring (IOC、AOP)数据库 (主要是索引和事务)redis(需要比较熟练)jvm(这块有些公司不会问很深入)上面的总结是我个人的一个面试过程总结,不适合所有人,毕竟每个人面试的公司不同,碰到的面试官不同,那么侧重点肯定就会不同(跟部门有关)上面中的几个重点内容中,我个人对于redis的内容是了解不够深入的,所以

2022-04-17 11:30:44 705 2

原创 JVM类加载机制系列之加载过程

引言最近在面试的过程中,很多稍微大一点的公司都会问你跟jvm有关的相关知识点,所以就想通过文章的形式将学习jvm的一些经验发表出来,对自己也算是一个复习的效果。参考书籍:“深入理解java虚拟机”虚拟机类加载机制java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型。类加载的时机一个类从被类加载器加载到虚拟机内存中,到卸载出内存中为止,它的整个生命周期会经历加载(Loading)、验证(Verification

2022-04-11 21:14:21 1189 2

原创 Spring系列之AOP工作过程详解二

引言还是一星期一更的经典栏目,如约而至上回我们说到了AOP的xml解析过程,今天这篇文章,我们来讲解“代理子类生成”入口代理子类的生成的核心类AspectJAwareAdvisorAutoProxyCreator,这个类是在解析“proxy-target-class”这个属性的时候进行注册,也就是ConfigBeanDefinitionParser的configureAutoProxyCreator方法中注册:public static void registerAspectJAutoProxy

2022-04-05 22:21:51 1067

原创 “步步高”二面面经

引言今天下午进行了“步步高”二面,然后在这里稍微复盘一下“咱就是说,咱啥也不是”哈希索引和b+树索引的区别B+Tree首先是有序结构,为了不至于树的高度太高,影响查找效率,在叶子节点上存储的不是单个数据,提高了查找效率(为了加快查找效率,将树变得更扁平); 为了更好的支持范围查询,B+树在叶子节点冗余了非叶子节点数据,为了支持翻页,叶子节点之间通过指针相连;哈希索引的话是基于哈希算法做的,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需要一次hash算法即可立即定位到相应的位置,速度

2022-04-01 00:11:44 1091

原创 通过Dump文件分析OOM产生的原因

起笔:文章的源起在于本人想向道哥(导演)拿一份公司Dump文件。问题描述本地模拟可能产生OOM的几十种不同的方法(自由发挥),然后通过类随机去调用方法,通过Dump文件分析是哪个方法导致程序的OOM代码实现:代码分析工具:Jprofile(mac版本) 提取码:vvwn 过程:第一步 :设置jvm参数-Xmx20m -Xms20m -XX:+HeapDumpOnOutOfMemoryError第二步:启动程序,生成Dump文件public static void main(

2022-03-26 21:09:27 1862

原创 Spring系列之AOP工作过程详解一

引言spring的IOC系列已经正式完结了,这一个星期一直在想着接下来更新什么系列,想了想,面试里面不就是IOC和AOP考的最多吗?那么就索性接下来开始更新AOP系列的文章,就非常的河狸aop:configaop部分的解析器由AopNamespaceHandler注册,其init方法:@Overridepublic void init() { registerBeanDefinitionParser("config", new ConfigBeanDefinitionParser());

2022-03-26 18:15:18 1002 2

原创 Spring系列之IOC容器初始化过程十

refresh中的destroyBeans、cancelRefresh方法没错,我又更新spring系列的文章了,IOC系列文章到这篇文章就结束了。接下来会开始新的系列,有可能是多个系列同时更新,希望大家可以关注之后博主的动态。destroyBeans用于销毁此上下文管理的所有 bean 的模板方法。默认实现在此上下文中销毁所有缓存的单例,调用DisposableBean.destroy()和/或指定的“destroy-method”。可以重写以在标准单例销毁之前或之后添加特定于上下文的 bea

2022-03-20 17:08:35 638 2

原创 Spring系列之IOC容器的初始化过程九

refresh方法中的finishRefresh方法闲话先不聊,咱们直接开始今天的主题,今天我们讲解的是refresh方法中的finishRefresh方法finishRefresh发布相应事件完成此上下文的刷新,调用 LifecycleProcessor 的 onRefresh() 方法并发布ContextRefreshedEventprotected void finishRefresh() { // Initialize lifecycle processor for this c

2022-03-19 17:19:14 225

原创 Spring系列之IOC容器初始化八

refresh方法中的finishBeanFactoryInitialization方法一星期一更的springIOC容器博文还是如期而至,随着Spring系列的不断更新,不知不觉已经三个月了,IOC容器初始化理解博文已经快到结尾的阶段。写SpringIOC容器系列的文章的初衷是为了加深自己对SpringIOC的理解同时也是对SpringIOC容器内容的笔记,但随着自己文章的更新,我发现自己已经慢慢地爱上了写博文!!!意气风发的时候更需要注意“谦卑”finishBeanFactoryInitia

2022-03-13 17:50:53 1555

空空如也

空空如也

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

TA关注的人

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