- 博客(61)
- 收藏
- 关注
原创 MVCC多版本并发控制机制详解
MySQL的MVCC机制通过多版本并发控制实现高并发读写。InnoDB引擎为每行数据维护隐藏字段(事务ID、回滚指针)和Undo Log存储历史版本,结合Read View实现事务隔离。读操作访问历史快照不需加锁,写操作仍需行锁但不会阻塞读。不同隔离级别下行为不同:RC每次查询生成新视图,RR整个事务复用同一视图。MVCC提高了读并发度但也带来存储开销和版本清理问题,是InnoDB实现高性能事务的关键机制。理解MVCC对调优和排查并发问题至关重要。
2025-07-31 18:44:57
876
原创 Mysql锁机制
MySQL锁机制包括乐观锁和悲观锁两种主要类型。乐观锁采用版本比对或CAS机制,适合读多写少场景;悲观锁通过SQL语句显式加锁,适合写操作频繁场景。锁按粒度分为表锁(锁定整表)、页锁(锁定数据页)和行锁(锁定单行)。InnoDB支持行级锁,但需基于索引实现,否则可能升级为表锁。锁的选择需权衡并发性能与一致性需求,乐观锁适合高并发读,悲观锁保证强一致性但性能较低。
2025-07-31 09:54:08
578
原创 Mysql事务原理
隔离级别脏读 (Dirty Read)不可重复读 (Non-Repeatable Read)幻读 (Phantom Read)MySQL InnoDB 实现特点性能可能可能可能读不加锁(可能读到未提交数据)最高不可能可能可能快照读:每个语句使用新 ReadView (看到最新提交)。当前读:使用记录锁。较高(默认)不可能不可能理论上可能,但 InnoDB 通过 MVCC (快照读) 和 Next-Key Locks (当前读) 基本解决快照读。
2025-07-28 16:01:01
825
原创 Mysql索引优化
文章摘要:本文主要探讨MySQL索引优化中的几种优化策略。通过employees表案例演示如何利用索引最左前缀原则优化排序操作,避免filesort外部排序。详细分析了单路和双路排序的区别及选择依据,指出当字段总长度小于max_length_for_sort_data时使用单路排序更高效。最后提出通过调整sort_buffer和max_length_for_sort_data配置来优化排序性能,并强调覆盖索引对减少回表操作的重要性。
2025-07-23 18:24:56
570
原创 Explain工具详解
MySQL EXPLAIN工具用于分析SQL查询性能,通过模拟优化器执行查询生成执行计划而非实际执行SQL。关键用法是在SELECT前添加EXPLAIN关键字,可显示查询计划信息,包括id、select_type、table等列。其中id反映执行顺序,select_type标识查询类型(如简单查询、子查询等),table显示访问的表。type列尤为重要,表示查询访问类型,性能从优到劣为:system>const>eq_ref>ref>range>index>ALL。通过E
2025-07-18 15:36:01
635
原创 jvm内存调优命令和实战
摘要:本文介绍了JDK提供的JVM命令行诊断工具jmap和jstack,用于分析Java进程内存和线程问题。jmap可查看堆内存对象统计、堆配置摘要及生成堆转储快照,帮助定位内存消耗问题;jstack用于捕获线程堆栈快照,诊断死锁、高CPU占用等线程问题。文章详细说明了各命令的使用方法、输出字段含义及常见应用场景,是Java开发者性能调优和问题排查的重要参考。
2025-07-07 16:15:51
726
原创 G1垃圾收集器
G1垃圾收集器是面向大内存和多核处理器的服务器端收集器,通过将堆划分为多个Region实现高效回收。它采用分代收集策略,支持Young GC和Mixed GC、Full G,平衡了停顿时间和吞吐量。G1通过并发标记、复制算法和可预测停顿时间(默认200ms)优化性能,适合8GB以上堆内存场景。关键参数包括MaxGCPauseMillis、InitiatingHeapOccupancyPercent等。使用时应合理设置停顿时间,避免频繁触发Full GC。G1的优势在于可控的停顿时间、低内存碎片和高并发性能。
2025-07-05 16:24:33
842
原创 Java垃圾回收机制和三色标记算法
文章摘要 本文详细介绍了Java垃圾回收机制,包括对象回收判断方法(引用计数法和可达性分析算法)、垃圾收集算法(标记-复制、标记-清除、标记-整理)以及常见垃圾收集器(Serial、Parallel、ParNew、CMS)。重点分析了CMS的工作流程及优缺点,并探讨了三色标记算法如何解决并发标记中的漏标问题。优化建议包括合理设置年轻代参数以减少老年代垃圾回收频率。文章为理解Java内存管理提供了系统性的技术解析。
2025-06-30 11:12:18
991
原创 JVM对象内存分配机制全解析
摘要: JVM对象内存分配过程涉及多阶段优化策略。首先通过逃逸分析和标量替换实现栈上分配,减少GC压力;大对象直接进入老年代避免复制开销;常规对象优先在Eden区分配,通过Minor GC和年龄计数器管理对象晋升;老年代采用空间担保机制防止容量不足;动态年龄判断机制提前将存活率高的对象移入老年代。该分配体系结合了栈分配、分代收集和动态调整策略,有效平衡了内存利用率和GC性能。(149字)
2025-06-20 20:48:31
704
原创 JVM对象创建全流程解析
本文详细介绍了JVM对象创建的完整流程,主要包括:1)类加载检查阶段,JVM通过new指令参数验证类是否已加载;2)内存分配环节,解释了指针碰撞和空闲列表两种分配方式,以及解决并发问题的CAS和TLAB机制;3)初始化阶段,说明对象内存空间默认零值初始化规则;4)对象头设置,详细剖析了32位系统下对象头的组成结构,包括Mark Word、类型指针等关键字段。整个流程展现了JVM如何高效地完成对象创建,并确保线程安全与内存管理的可靠性。
2025-06-17 17:41:40
771
原创 JVM内存模型
JVM内存模型解析:运行时数据区包含堆(共享)、元空间(共享)、栈(线程私有)、本地方法栈和程序计数器(线程私有)。以Calculate类为例,compute()方法执行时,JVM创建栈帧,包含局部变量表和操作数栈。执行过程:加载常量5和7到操作数栈→存入局部变量表→取出相加→乘9→返回108。对象实例存储在堆,引用存在栈。方法执行完毕后,栈帧弹出,程序返回调用位置继续执行。该过程展示了JVM内存操作的基本原理。
2025-05-30 21:49:22
622
原创 根据jvm源码剖析类加载机制
本文剖析了JVM类加载机制的核心流程和实现原理。首先描述了从执行java命令到创建JVM、初始化类加载器的完整启动过程,重点分析了Bootstrap、ExtClassLoader和AppClassLoader三级类加载器的创建与层级关系。其次详细解析了类加载的七个阶段:加载、校验、准备、解析、初始化、使用和卸载,并阐述了每个阶段的关键操作。通过代码示例展示了不同类加载器的加载路径及双亲委派机制的具体实现,包括其安全防护和避免重复加载的设计目的。最后说明如何通过继承ClassLoader并重写findClas
2025-05-28 22:30:14
1006
原创 线程池ThreadPoolExecutor,从0到0.6
ThreadPoolExecutor是JDK提供的在java.util.concurrent包中的一个用于创建线程池的工具类。
2023-03-07 17:33:25
738
原创 Apache Pulsar 云原生消息中间件之王
pulsar,消息中间件,是一个用于服务器到服务器的消息系统,具有多租户、高性能等优势。pulsar采用发布-订阅的设计模式,producer发布消息到topic,consumer订阅这些topic处理流入的消息,并当处理完成之后发送一个确认。一旦创建订阅,即使consumer断开连接,pulsar仍然可以保存所有消息,在consumer确认消息已处理成功之后才会删除消息。Pulsar 的关键特性如下:Pulsar 的单个实例原生支持多个集群,可在集群间无缝地完成消息复制。
2023-03-03 17:05:30
1576
原创 Spring Security 的前后端分离项目的权限方案,从0到0.8
思路分析①通过前面的分析,我们发现Spring Boot集成了默认的Spring Security之后虽然已经具备了认证授权的功能,但存在两个在实际项目中不适用的问题:默认的登录页面默认的用户名密码②同时,前面我们也说一般web应用的安全管理都是通过两条线完成的,Spring Security也是:认证授权③此外,我们结合前后端分离项目中常用的认证授权流程......
2022-09-01 15:17:37
2935
原创 java函数式编程、Lambad表达式、Stream流、Optional类、函数式接口、方法引用的使用,从0到0.8
java函数式编程、Lambad表达式、Stream流、Optional类、函数式接口、方法引用的使用
2022-08-05 12:08:12
1498
原创 Docker应用,从0到0.8
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。......
2022-08-03 11:05:23
537
原创 zookeeper,从0到0.4
目录一,简介1,工作机制2,数据结构3,Zookeeper集群角色(1)Leader(2)Follower(3)Observer二,集群安装1,下载2,解压3,修改配置4,启动zookeeper5,查看状态6,启动客户端7,退出客户端8,停止zookeeper三,配置文件详解四,命令行客户端使用1,命令行客户端2,查看znode节点信息3,创建znode节点4,修改znode节点的值5,删除znode节点6...
2022-03-17 10:34:45
982
1
原创 Alibaba微服务组件——Naocs配置中心,从0到0.8
Nacos为用户提供包括动态服务发现,配置管理,服务管理等服务基础设施,帮助用户更灵活,更轻松地构建,交付和管理他们的微服务平台,基于Nacos, 用户可以更快速的构建以“服务”为中心的现代云原生应用。Nacos可以和Spring Cloud、Kubernetes/CNCF、Dubbo 等微服务生态无缝融合,为用户提供更卓越的体验。
2022-02-24 11:52:40
914
原创 SpringCloud微服务组件——OpenFeign调用组件,从0到0.6
Feign是一个声明式WebService客户端。使用Feign能让编写Web Service客户端更加简单。Feign可以使HTTP请求远程服务时就像调用本地方法一样的体验。它解决了让开发者调用远程接口就像调用本地方法一样,无需关注与远程的交互细节,更无需关注分布式环境开发。
2022-01-25 17:30:09
1245
原创 Spring Cloud NetFlix微服务组件——Ribbon负载均衡器,从0到0.6
Ribbon是一个客户端负载均衡器。Ribbon客户端组件提供一系列的完善的配置,如超时,重试等。通过LoadBalancer获取到服务提供的所有机器实例,Ribbon会自动基于某种规则(轮询,随机)去调用这些服务。Ribbon也可以实现自定义负载均衡算法。
2022-01-25 10:21:21
859
原创 MyBatis,从0到0.8
学而时习之,不亦说乎?以前只是能在项目中使用,并不懂里面的弯弯绕,而且对mybatis的认识不系统、不深刻,故在此系统的学习一下,并总结下文。
2022-01-18 14:59:10
1625
1
原创 Elasticsearch全文搜索引擎,从0到0.6
一,ES简介Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-E...
2021-12-19 22:14:33
2074
1
原创 一点一滴积累23种设计模式的理解
“每一个模式秒速了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次的使用该方案而不必做重复的劳动。”一,什么是设计模式设计模式,Design Pattern,是前人在软件设计和代码开发中通过对常见问题反复试验总结出的解决方案,是解决特定问题的一系列套路或模板,给后人提供了设计、编程、解决问题的思想。软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在.
2021-12-13 21:54:18
211
原创 安卓开发要点简介(部分)
1,Service组件的用法Service和都代表可执行的程序区别:Service一直在后台运行,没有用户界面,具有自己的生命周期开发Service的步骤:先开发一个Service子类在AndroidManifest.xml文件配置该Service配置时通过元素指定它可以被哪些Intent启动Android系统本身提供了大量了Service组件Service组件时可执行的程序,有足迹的生命周期(1)创建①定义一个继承Service子类②在AndroidManifest.xml文件中配置
2021-11-04 14:01:16
293
原创 Linux的JDK、Tomcat、Mysql、Redis、Maven、Nginx安装使用
一,安装JDK1,下载所用版本的JDK官网地址:Java Downloads | Oraclehttps://www.oracle.com/java/technologies/downloads/#java8
2021-11-03 17:35:26
650
原创 Spring AOP 切面编程,从0到0.6
随着Spring框架发展至今天,介绍和讲解Spring AOP的文章、视频等已经遍地都是,本文作者依然本着自我学习之后的梳理的宗旨写下这边文章,故文章结构、逻辑、条理等方面比较随性,若读者觉得不方便阅读学习请移步其他优秀的文章,当然也希望对大家有所帮助。本文依靠Spring官方文档对AOP和Spring AOP的介绍,再加上自己的理解而展开。一,对AOP的理解AOP(Aspect-oriented Programming,面向切片编程);通过于预编译方式和运行期动态代理实现不修改源代码的情
2021-08-15 20:10:39
214
原创 Spring的全局(统一)异常处理
一,什么是全局异常处理二,try...catch的弊端三,异常处理的三种方式1,实现HandlerExceptionResolver接口2,@ExceptionHandler3,@ControllerAdvice+@ExceptionHandler四,
2021-08-12 11:04:10
14062
4
原创 java多线程,从0到1
一,创建线程的方式一——继承Thread类线程类:public class MyThread extends Thread{//1,继承Thread类 //2,重写run方法 @Override public void run() { for(int i = 0;i<20;++i) { System.out.println("id:"+this.getId()+" name:"+this.getName()+" i="+i); } }}public class
2021-07-03 19:56:22
170
1
原创 java反射(Reflection)
一,概述反射机制允许程序在运行期间获得任何类的任何内部信息,并直接操作任意对象的内部属性和方法。正是由于反射机制的存在,使java被视为准动态语言。动态编程语言(Dynamic programming Language):动态语言是指程序在运行时可以改变其结构。比如,新的函数可以被引进,已有的函数可以被删除等在结构上的变化。静态类型语言(Statically Typed Language):静态类型语言数据类型是在编译其间检查的。即是,在写程序时要声明所有变量的数据类型。Class类:
2021-06-19 22:36:58
182
原创 java的注解类型(Annotation)
一,前言注解,在java程序中经常看到的@Override、@Deprecated,在SpringBoot中经常用到的@XX。注释:书写在代码中用以辅助 人 理解代码的文字,不参与程序的运行,对代码没有任何影响。注解:①代码中的特殊标记,以“@注释名”的形式存在于代码中,用以辅助程序的理解代码代码,②程序可以读取注解,对被标注的程序(类、方法、属性等)进行限制、规定如何运行等,③也是一种类的类型(自己的理解,不一定完整准确)。注解在java中的典型应用:通过反射技术获取被注解的代码里的注解,以决定如
2021-06-16 21:16:50
1350
1
原创 简单工厂模式+工厂方法模式+反射优化的工厂模式
平时所说的工厂模式,分为简单工厂模式、工厂方法模式和抽象工厂模式,属于设计模式中的创建型模式。创建型模式是处理对象创建的设计模式,试图根据实际情况使用合适的方式创建对象。——摘自百度百科工厂模式的定义:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。——摘自C语言中文网本想通过定义来进一步理解工厂模式,但看到这个定义之后感觉…,可能理科+计算机+男同志更适合采用图和代码的方式理解知识吧,所以后面我还是通过UM
2021-06-13 22:23:57
400
原创 滑动窗口+leetCode题3
曩 ,遇到滑动窗口的题时往往条件发射似的就用滑动窗口的方法解决,也没有细想什么情况下用;今,慕然回首,发现是时候展现其真正的技术了,总结使知识更清晰牢固嘛;故,认真分析一波滑动窗口这个东西的核心内容、具体操作、应用对象,并结合了一道leetCode上的题3,在深入领悟一下我的领悟。一,滑动窗口根据我的认知知识的顺序,看到滑动窗口首先想到计算机网络中的滑动窗口,于是它的样子呈现在我脑海在中:计算机网络中的滑动窗口:1,窗口:窗口内是一段连续的子序列;2,滑动:窗口向一个方面前进,这个前进是通
2021-05-25 18:56:34
167
原创 HashMap学习总结一之从源码学习HashMap底层原理
以前对HashMap的认识仅限于使用——在遇到可以用key-value形式存储的数据并需要高效的查询效率时便使用java API中的HashMap类,对其底层也只是在阅读一些博客或观看一些视频时获得的片段性的了解。毕竟,HashMap是一个秀外慧中的容器,(外:提供了高效的查询效率,内:众多数据结构的集合,包括哈希、顺序表、单向链表和红黑树),故在此通过尝试阅读源码望对其深入理解。一,类前的注释进入定义代码定位到类定义的头部的位置。看看其提供了什么信息:它是有两个泛型的泛型类,猜测K、V各代表键和
2021-05-21 19:19:31
209
原创 oracle中多行注释“/**/”引发的问题
最近在测试一个sql脚本,出现了一个语句执行的问题。测试发现,脚本文件在PL/SQL命令窗口中执行时,执行结果正常,该文件在windows控制台中执行时,界面和执行bat文件一样非正常显示。因为,执行bat文件也是在windows控制台执行该文件,所以,不能正常显示是因为在windows控制台中执行了文件,即与执行的环境有关。经过一番周折也没有发现语句的问题。后来无意中将“/*”改成 /** 问题便得到了解决。真是奇妙!含有一个星号的/*会被windows控制台(sql plus)解释为“
2020-11-17 19:48:06
2316
原创 Android之Activity的的4中加载模式
一,概述1,为什么要想Activity指定四种加载模式?Android采用Task管理多个Activity,通过一个或多个Task来管理一个应用的每个Activity;每次按下返回键将会从栈顶移除一个Activity。但,Android没有为Task提供API,所以开发人员无法直接操作Task,此时,如果开发人员需要对每一次启动的目标Activity都创建一个新实例、或需要复用已经在栈顶的Activity实例、再或需要让每一个Activity都保存在一个栈中以方便全局复用等这些操作时怎么指定是哪种呢?
2020-10-02 19:07:51
441
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人