自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(97)
  • 资源 (3)
  • 问答 (1)
  • 收藏
  • 关注

原创 Spring Boot 项目通用架构搭建(包含MybatisPlus,代码生成,Swagger集成,通用配置,全局异常处理)

​ 大家好,我们现在java开发大部分项目都是使用Springcloud 和Springboot做的微服务架构,我使用SpringBoot也有很长的一段时间了,今天和大家分享一下我们在使用Springboot开发一个项目的时候的通用配置,包括接口参数的校验,数据库连接,连接池的配置,MybatisPlus的配置,使用,属性的自动插入,Swagger的集成配置,常用的配置类,全局异常的配置和处理,属性的复制方法,抽取公共属性,减少代码开发,提高我们的开发效率等等。也欢迎大家提出宝贵的意见,互相学习。好了,废

2022-07-30 11:50:38 1308 3

原创 MYSQL 5.7 Global Status的全面讲解

此文档是基于MySQL5.7版本进行编写,请大家注意自己的版本,不同版本可能执行出错或者执行结果不一致。本文档主要是讲解GlobalStatus的内容,但是在讲解过程中会涉及到一些其他的知识与其相关的需要解释的也会说一下,感兴趣的同学可以自行百度或者与我探讨。对于想要相关稳当的同学请移步下载下载。1.SHOWSTATUS提供服务器状态信息。此语句不需要任何特权。它只需要能够连接到服务器。使用GLOBAL修饰符,该语句将显示全局状态值。...

2022-07-24 18:02:02 2577

原创 LINUX上的通用的springboot项目脚本(启动,停止,重启)

文章目录前言一、脚本中常用命令介绍二、编写脚本0.变量介绍1.使用说明2.检查程序是否运行3.启动4.停止5.重启6.运行状态6.参数输入三、完整脚本和使用完整脚本脚本执行前言springboot项目一般都是打一个jar然后放在我们的Linux服务器上边进行部署,一般我们都会写一个java启动脚本,方便我们进行项目的启动,停止,重启,提高部署效率。今天我们就写一个简单的linux下的springboot项目的脚本。一、脚本中常用命令介绍ps 命令:查看进程。假如我们要查看java进程,使用命令

2021-11-24 19:06:39 2544 2

原创 线程池相关介绍和底层原理

线程池相关介绍和底层原理一、为什么使用线程池二、常用的线程池FixedThreadPoolSingleThreadExecutorCachedThreadPool三、线程池的七大参数四、线程池的底层原理五、线程池的拒绝策略六、线程池在工作中的使用结尾一、为什么使用线程池线程池的工作主要是控制运行的线程数量,处理过程中将任务放入队列。然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等其他的线程执行完毕,再从队列中取出任务执行。线程池的主要特点是:线程复用,控制最大并发数

2021-10-26 17:33:08 290

原创 CountDownLatch/CyclicBarrier/Semaphore介绍

untDownLatch的作用就是保证其他的线程都执行完毕,主线程才会执行,只要有一个线程没有执行完毕,主线程都需要等待此线程执行完毕后才能执行。

2021-08-17 17:51:33 130

原创 JAVA锁机制详解(上)

JAVA锁机制详解

2021-08-12 19:08:18 114

原创 CAS底层原理和源码分析

CAS底层原理什么是CASCAS底层原理UnsafeCASCAS的缺点ABA问题原子类引用ABA问题解决总结什么是CASCAS 的英文是compare and set,也就是比较并交换。首先介绍一下比较重要的三个概念:initialValue(初始值),expect(期望值),update(更新值)。初始值就是变量最初的值期望值就是线程在操作变量之前锁期望的值更新值就是线程要将变量修改成什么值为了便于理解,首先大概介绍一下JAVA的内存模型。也可以看一下我之前写的一篇文章:Java关键字vola

2021-08-09 14:19:34 1777 7

原创 Java关键字volatile全面解析和实例讲解

Java关键字volatile全面解析和实例讲解简介java内存模型JMM介绍——可见性volatile——可见性volatile——不保证原子性volatile——不保证原子性问题解决volatile——指令重排双重锁式单例模式总结简介volatile是JVM提供的一种轻量级的同步机制。相比于synchronized关键字volatile更轻量级(乞丐版的synchronized),因为它不会引起线程上下文的切换和调度。但是volatile 变量的同步性较差(有时它更简单并且开销更低),而且其使用也更

2021-08-03 17:21:41 685

原创 HashMap底层原理源码分析(JDK8)

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

2021-07-21 18:37:55 321 2

原创 nacos架构和原理(十一)——鉴权插件

为了 Nacos 提升安全能力,更好满足生产要求,需要设计账号权限体系,又要能兼容云上和阿里 内部场景。避免后续代码无法融合。 这块的挑战是要做好抽象,不然没法和不同账号权限体系打通。 默认我们提供⼀个简单的实现,当有类似于 RAM 这样的权限体系后,直接对接即可。目前用的比较多的是 ABAC 和 RBAC 体系。目前阿里云采用 ABAC 体系,阿里内部采用 RBAC 体系。无论哪个体系,最终都是让账号有有限资源的权限,已达到访问控制的目的。不同的是关联 的方法,相同的都是抽象好 Nacos 的 Resou

2023-03-21 13:53:17 1332 1

原创 nacos架构和原理(十)——⾼可⽤设计

Nacos 历经 10 多年双十⼀考验,经历过多次断网,节点全挂,存储不可用各种故障,因此充分面 对失败设计,沉淀了非常多的经验。

2023-03-21 10:29:56 588

原创 nacos架构和原理(九)——配置管理之配置⼀致性模型

Nacos 配置管理⼀致性协议分为两个大部分,第⼀部分是 Server 间⼀致性协议,⼀个是 SDK 与 Server 的⼀致性协议,配置作为分布式系统中非强⼀致数据,在出现脑裂的时候可用性高于⼀致性, 因此阿里配置中心是采用 AP ⼀致性协议。

2023-03-21 10:26:07 623

原创 nacos架构和原理(八)——服务发现模块之健康检查机制

在上文中,我们介绍了 Nacos 注册中心中的服务数据模型,说明了服务、实例以及集群的内容, 关系及它们的生命周期。期间健康检查是⼀个被反复提及的词语,这是由于注册中心不应该仅仅提 供服务注册和发现功能,还应该保证对服务可用性进行监测,对不健康的服务和过期的进行标识或 剔除,维护实例的生命周期,以保证客户端尽可能的查询到可用的服务列表。因此本文将详细介绍 Nacos 注册中心中的健康检查机制。

2023-03-21 10:17:23 480

原创 nacos架构和原理(七)——服务发现模块之注册中心服务数据模型

在 Nacos 中,服务的定义包括以下几个内容: 命名空间(Namespace):Nacos 数据模型中最顶层、也是包含范围最广的概念,用于在类似 环境或租户等需要强制隔离的场景中定义。Nacos 的服务也需要使用命名空间来进行隔离。

2023-03-15 14:58:44 373

原创 nacos架构和原理(六)——服务发现模块之注册中心的设计原理

nacos架构和原理(六)——服务发现模块之注册中心的设计原理数据模型数据⼀致性负载均衡健康检查性能与容量集群扩展性数据模型注册中心的核心数据是服务的名字和它对应的网络地址,当服务注册了多个实例时,我们需要对不 健康的实例进行过滤或者针对实例的⼀些特征进行流量的分配,那么就需要在实例上存储⼀些例如 健康状态、权重等属性。随着服务规模的扩大,渐渐的又需要在整个服务级别设定⼀些权限规则、 以及对所有实例都生效的⼀些开关,于是在服务级别又会设立⼀些属性。再往后,我们又发现单个 服务的实例又会有划分为多个子集

2023-03-15 14:29:50 618 1

原创 nacos架构和原理(五)——Nacos 内核设计之寻址机制

目前,Nacos 的集群节点管理,还都是属于人工操作,因此,未来期望能够基于寻址模式,实现集 群节点自动管理的功能,能够实现新的节点上线时,只需要知道原有集群中的⼀个节点信息,就可 以在⼀定时间内,顺利加入原有 Nacos 集群中;因此这就带来⼀个问题,该以何种方式去管理集群 内的 Nacos 成员节点信息,而这,就是 Nacos 内部的寻址机制。因此,通过地址服务器这种模式,大大简化了 Nacos 集群节点管理的成本,同时,地址服务器是 ⼀个非常简单的 web 程序,其程序的稳定性能够得到很好的保障。

2023-03-15 10:10:43 356

原创 nacos架构和原理(四)——Nacos 内核设计之通信通道

 短连接和长链接负载均衡的异同:在短连接中,因为连接快速建立销毁,“随机,hash,轮询, 权重”四种方式大致能够保持整体是均衡的,服务端重启也不会影响整体均衡,其中“最小连接 数,最快响应速度”是有状态的算法,因为数据延时容易造成堆积效应; (当前实现版本)人工管控方案:集群视角的系统负载控制台,提供连接数,负载等视图(扩展新增 连接数,负载,CPU 等信息,集群间 report 同步),实现人工调节每个 Server 节点的连接数, 人工触发 reblance,人工削峰填谷。

2023-03-14 16:24:10 572

原创 nacos架构和原理(三)——Nacos 内核设计之Distro 协议

作为⼀种有状态 的中间件应用的内嵌协议,Distro 保证了各个 Nacos 节点对于海量注册请求的统⼀协调和存储。Distro 协议作为 Nacos 的内嵌临时实例⼀致性协议,保证了在分布式环境下每个节点上面的服务 信息的状态都能够及时地通知其他节点,可以维持数十万量级服务实例的存储和⼀致性。对于⼀个已经启动完成的 Distro 集群,在⼀次客户端发起写操作的流程中,当注册非持久化的实例 的写请求打到某台 Nacos 服务器时,Distro 集群处理的流程图如下。

2023-03-14 15:00:06 270

原创 nacos架构和原理(二)——Nacos 内核设计之一致性协议

对于强⼀致性共识算法,当前工业生产中,最多使用的就是 Raft 协议,Raft 协议更容易让人理解, 并且有很多成熟的工业算法实现,比如蚂蚁金服的 JRaft、Zookeeper 的 ZAB、Consul 的 Raft、 百度的 braft、Apache Ratis;

2023-03-14 14:41:45 968 1

原创 nacos架构和原理(一)——nacos简介和配置架构

在系统开发过程中通常会将⼀些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配 置文件的形式存在。目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物 理运行环境进行适配。配置管理⼀般包含在系统部署的过程中,由系统管理员或者运维人员完成这 个步骤。配置变更是调整系统运行时的行为的有效手段之⼀。

2023-03-14 11:34:37 1194

原创 SpringIOC源码解析

从今天开始,我将会和大家一起学习Spring的高级知识和源码相关内容。这部分内容面向的是会使用Spring框架的同学,并且想要深度学习,或者从源码层面进行学习Spring更高级的知识。所以对于Spring基础不好的或者不会使用的同学先去学习一下Spring的基本使用再来看效果会更加好。作为Java开发,是肯定会用到Spring的,在面试的时候也会问到很多关于Spring的相关问题,可见Spring的重要性。所以学习好Spring是相当有必要的。

2023-02-24 16:33:21 500

原创 JVM(二十三)—— 垃圾回收器(三)G1垃圾回收器

应用程序所应对的业务越来越庞大,复杂,用户越来越多,没有GC就不能保证应用程序正常运行,而经常赞成STW的GC又跟不上十几的需求,所以才会不断地尝试对GC进行优化。G1(Garbage First)垃圾回收器在JDK7引入的一个新的垃圾回收器,也是在JDK9中默认垃圾收集器,是当今收集器技术发展最前沿成果之一。同时,为了适应现在不断扩大的内存和不断增加的处理器数量,进一步降低暂停时间,同时兼顾良好的吞吐量。官方给G1设定的目标是在延迟可控的情况下获得尽可能高的吞吐量。

2022-11-14 20:27:03 978

原创 JVM(二十二)—— 垃圾回收器(二)CMS垃圾回收器

尽管CMS收集器采用的是并发回收(非独占式),但是在其初始化标记和在此标记这两个阶段中仍然需要执行STW机制暂停程序中的工作线程,不过暂停时间并不会太长,因此可以说明目前所有的垃圾收集器都做不到完全不需要STW,只是尽可能缩短暂停时间。CMS作为老年代的收集器,却无法与JDK4中已经存在的新生代收集器Parallel Scavenge配合工作,所以在JDK5中使用CMS 来收集老年代的时候,新生代只能选择ParNew或者Serial 收集器中的一个。CMS收集器的垃圾收集算法采用的是。

2022-11-13 15:18:48 455

原创 JVM(二十一)—— 垃圾回收器(一)

这个收集器是一个单线程的收集器,但它的单线程的意义并不仅仅说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是它在进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。在程序吞吐量优先的应用场景中,Parallel Scavenge和Parallel Old收集器的组合,在Server模式下的内存回收性能很不错,在JDK8中默认是此垃圾收集器。虽然我们会对各个收集器进行比较,但并非为了挑选一个最好的收集器,没有一个任何场景都适用的完美收集器存在,也没有万能的收集器。

2022-11-13 14:08:15 377

原创 JVM(二十)——引用介绍

在开发中,出于性能考虑,我们会有这样的需求:当内存空间还足够时,则能保留在内存中,如果内存空间在进行垃圾收集后还是很紧张,则可以抛弃这些对象。为了解决上边的问题,Java内部也提供了不同类型的引用。分别为强引用(Strong Reference),软引用(Soft Reference),弱引用(Week Reference),虚引用(Phantom Reference)4种,这4种引用强度依次逐渐减弱。在我们面试的过程中,也经常会被问到四者的区别和应用场景。

2022-11-12 17:21:06 83

原创 JVM(十九)—— 垃圾回收(五)

当线程运行到安全区域的代码时,首先标识已经进入了安全区域,如果这段时间发生GC,JVM会忽略标识为安全区域状态的线程。当线程即将离开安全区域时,会检查JVM是否已经完成GC,如果完成了,则继续运行,否则线程必须等待直到收到可以安全离开安全区域的信号为止。**安全区域是指在一段代码片段中,对象的引用关系不会发生变化,在这个区域中的任何位置开始GC 都是安全的,**我们也可以将安全区域看做是被扩展了的安全点。并发(Concurrent):指用户线程与垃圾回收线程同时执行,但不一定是并行的,可能会交替执行。

2022-11-12 16:05:29 351

原创 JVM(十八)—— 垃圾回收(四)

比如在引用机制分析中,涉及到JVM回去尝试回收软引用指向的对象等,在java.nio.Bits.reserveMemory()方法中,我们能清楚的看到,System.gc()会被调用,以清理空间。JVM实现者可以通过System.gc()调用来决定JVM的GC行为,而一般情况下,垃圾回收应该是自动进行的,无须手动触发,否则就太麻烦了。大多数情况下,GC会进行各种年龄段的垃圾回收,实在不行了就放大招,来一次独占式的full gc操作,这时候会回收大量的内存,供应用程序仅需使用。内存泄漏也称作存储泄漏。

2022-11-12 13:43:53 365

原创 JVM(十七)—— 垃圾回收(三)

如果垃圾回收的时间过长,应用程序会被挂起很久,将严重影响用户体验或系统的稳定性,为了解决这个问题,即对实时的垃圾收集算法的研究直接导致了增量收集算法的诞生。为了更好的控制GC产生的停顿时间。将一块大的内存区域分割成多个小块,根据目标的停顿时间,每次合理的回收若干个小区间,而不是整个堆空间,从而减少一次GC所产生的停顿。使用这种方式,由于在垃圾回收过程中,间断性的还执行了应用程序代码,所以能减少系统的停顿时间,但是因为线程切换和上下文转换的消耗,会使得垃圾回收的总体成本上升,造成系统吞吐量的下降。

2022-11-12 12:32:58 271

原创 JVM(十六)—— 垃圾回收(二)

Java语言提供了对象终止(finalzation)机制来允许开发人员提供**对象被销毁之前的自定义处理逻辑**。当垃圾回收其发现没有引用指向一个对象,即垃圾回收此对象之前,总会先调用这个对象的finalize方法。

2022-11-10 20:36:12 270

原创 JVM(十五)—— 垃圾回收(一)

垃圾收集机制是Java的招牌能力,极大地提高了开发效率。如今垃圾收集几乎称为现代语言的标配,即使经过如此长时间的发展,Java的垃圾收集机制仍然在不断地演进中,不同大小的设备,不同特征的应用场景对垃圾收集提出了新的挑战,这当然也是面试人热点。

2022-11-10 18:55:50 387

原创 JVM(十四)—— StringTable

String代表不可变的字符序列,简称不可变性。当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。当调用String的replace方法修改指定字符或者字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。

2022-11-06 16:18:37 400

原创 JVM(十三)—— 执行引擎

执行引擎是Java虚拟机核心的组成部分之一。虚拟机是一个相对物理机的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接简历在处理器,缓存,指令集和操作系统层面上的,而虚拟机的执行引擎则是有软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。JVM的主要任务是负责装载字节码到其内部,但字节码不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它nebula包含的仅仅只是一些能够被JVM所识别的字节码指令,符号表

2022-11-05 21:20:40 769 1

原创 JVM(十二) —— 对象的实例化

虚拟机遇到一条new指令,首先去检查这个指令的参数能否在MetaSpace的常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载,链接,初始化。即判断类元信息是否存在,如果没有,那么在双亲委派模式下,使用当前类加载器以ClassLoader+包名+类名为key进行查找对应的class文件,如果没有找到文件,则抛出ClassNotFoundException异常,如果找到,则进行类加载,并生成对应的class类对象。

2022-11-05 11:57:20 252

原创 JVM(十一) —— 运行时数据区之方法区(二)

方法区内部包含了运行时常量池。字节码文件内部包含了常量池。要弄清楚方法区,需要理解清楚ClassFile,因为加载类的信息都在方法区。要弄清楚方法区的运行时常量池,需要理解清楚ClassFile涨的常量池。

2022-10-22 20:37:26 723

原创 JVM(十) —— 运行时数据区之方法区(一)

Java虚拟机规范中明确说明:尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。但对于HotSpot虚拟机来说,方法区还有一个别名叫做非堆,目的就是要和堆分开。所以,方法区看做是一块独立于Java对的内存空间。

2022-10-22 11:41:33 512

原创 JVM —— 运行时数据区之堆的详细介绍(汇总篇)

一个JVM实例只对应一个堆内存,对也是Java内存管理的核心区域。Java堆区在JVM启动的时候就被创建,齐空间大小也就确定了。是JVM管理的最大的一块内存空间。堆内存大小是可以调节的,使用 -Xms 和-Xmx命令进行调节,其语法和栈空间大小一致。Java虚拟机规范规定,堆可以处于物理上不连续的内存空间中,但在逻辑上他应该是被视为连续的。所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer , TLAB)。

2022-10-21 20:31:44 670 1

原创 JVM(九) —— 运行时数据区之堆的详细介绍(四)

堆区是线程共享区域,任何线程都乐意访问到堆区的共享数据。由于对象实例的创建在JVM中非常频繁,因此在并发环境下从堆区中划分内存空间是线程不安全的。为避免多个线程操作同一地址,需要使用加锁等机制,进而影响分配速度。TLAB全称Thread Local Allocation Buffer, 从内存模型的角度,对Eden区域继续进行划分,JVM为每个线程分配了一个私有缓存区域,它包含在Eden空间内,这部分就是我们所说的TLAB。

2022-10-20 21:50:29 278

原创 JVM(八) —— 运行时数据区之堆的详细介绍(三)

为新对象分配内存是一件非常严谨和复杂的任务,JVM的设计者们不仅仅需要考虑内存如何分配,在哪里分配等问题,并且由于内存分配算法与内存回收算法密切相关,所以还需要考虑GC执行完内存回收后是否会在内存空间中产生碎片。

2022-10-18 21:17:43 282

原创 JVM(七) —— 运行时数据区之堆的详细介绍(二)

ava堆用于存储Java对象实例,那么堆大小在JVM启动的时候就已经设置好了,可以通过-Xms 和-Xmx进行设置。-Xms 用于表示堆区的起始内存,等价于 -XX:InitialHeapSize-Xmx 表示堆区的最大内存,等价于 -XX:MaxHeapSize一旦堆区中的内存大小超过-Xmx所指定的最大内存时,将会抛出OutOfMemoryError异常。通常会将-Xms 和-Xmx两个参数配置相同的值,其目的是为了能够在Java垃圾回收机制清理完堆区后不需要重新分配堆区的大小,从而提升性能

2022-10-17 20:58:13 295

原创 JVM(六) —— 运行时数据区之堆的详细介绍(一)

一个Java程序运行起来是一个进程,这个进程对应着一个JVM实例,一个JVM实例对应着一个运行时数据区。而一个运行时数据区对应着一个方法区和一个堆。而一个进程中会有多个线程,这些线程会共享方法区和堆区。

2022-10-16 17:04:46 271

Xshell Plus + Xftp

xshell和xftp是连接linux的一把好手,此资源解压即用,点击绿化之后就可以免费使用。 Xshell [1] 是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。Xshell 通过互联网到远程主机的安全连接以及它创新性的设计和特色帮助用户在复杂的网络环境中享受他们的工作。 Xshell可以在Windows界面下用来访问远端不同系统下的服务器,从而比较好的达到远程控制终端的目的。除此之外,其还有丰富的外观配色方案以及样式选择。

2022-08-16

MySQL-5.7.x  Global Status全面详细介绍

此文件是基于Mysql 5.7版本的对Global Status的介绍,里边的详细的参数含义都有详细的介绍,此文件是基于mysql 的官方文档进行的编写,对于我们更透彻的了解和学习MySQL有很深远的意义。global status对于程序员和DBA进行mysql 的内部结构了解和对于mysql的调优有很大的意义,能帮助我们更好更快的进行sql的优化。

2022-07-24

mac版本 NavicatPremium15 安装包

mac版本 NavicatPremium15 安装包,解压安装即用

2022-04-20

阿里巴巴Java性能调优实战(2021华山版).pdf

阿里巴巴Java性能调优实战

2021-07-22

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

TA关注的人

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