MySQL的锁
MySQL锁 全局锁: flush tables with read lock,执行此条命令,整个数据库处于只读状态 unlock tables, 释放全局锁,会话断开时,也会自动释放全局锁 一般用来全库逻辑备份 表级锁:MySQL 里面表级别的锁有这几种: 表锁:通过lock tables 语句可以对表加表锁,表锁除了会限制别的线程的读写外,也会限制本线程接下来的读写操作。 元数据锁:当我们对数据库表进行操作时,会自动给这个表加上 MDL,对一张表进行 CRUD 操作时,加的是 MDL 读锁;对一张表做结构变更操作的时候,加的是 MDL 写锁;MDL 是为了保证当用户对表执行 CRUD 操作时,防止其他线程对这个表结构做了变更。 意向锁:当执行插入、更新、删除操作,需要先对表加上「意向独占锁」,然后对该记录加独占锁。意向锁的目的是为了快速判断表里是否有记录被加锁。 行级锁:InnoDB 引擎是支持行级锁的,而 MyISAM 引擎并不支持行级锁。 记录锁(Record Lock) 锁住某行记录,分为读写锁,事务提交后自动释放,例如select * from...
垃圾收集器(CMS-G1-ZGC)与垃圾回收算法
垃圾收集器(CMS-G1-ZGC) CMS 垃圾收集器 JDK1.5时引入,JDK9被标记弃用,JDK14被移除 CMS(Concurrent Mark Sweep,并发标记清除)收集器是以获取最短回收停顿时间为目标的收集器(追求低停顿),它在垃圾收集时使得用户线程和 GC 线程并发执行,因此在垃圾收集过程中用户也不会感到明显的卡顿。 初始标记:Stop The World,仅使用一条初始标记线程对所有与 GC Roots 直接关联的对象进行标记。 并发标记:使用多条标记线程,与用户线程并发执行。此过程进行可达性分析,标记出所有废弃对象。速度很慢。 重新标记:Stop The World,使用多条标记线程并发执行,将刚才并发标记过程中新出现的废弃对象标记出来。 并发清除:只使用一条 GC 线程,与用户线程并发执行,清除刚才标记的对象。这个过程非常耗时。 并发标记与并发清除过程耗时最长,且可以与用户线程一起工作,因此,总体上说,CMS 收集器的内存回收过程是与用户线程一起并发执行的。 CMS...
类加载机制与类加载器
类加载机制/类加载器 类加载的完整流程(生命周期) 类从加载到卸载经历 5 个阶段,其中加载、验证、准备、初始化、卸载的顺序是固定的,解析阶段可能与初始化交叉进行: 1. 加载(Loading) 任务:通过类的全限定名(如com.example.User)获取其字节码数据,并生成Class对象。 来源:字节码可来自本地文件、网络、数据库、动态生成(如 CGLib)等。 关键组件:类加载器(ClassLoader)负责此阶段。 2. 验证(Verification) 任务:确保字节码符合 JVM 规范,避免恶意或无效字节码危害虚拟机安全。 验证内容 文件格式验证(魔数、版本号等) 元数据验证(类继承关系、字段方法合法性) 字节码验证(指令逻辑正确性) 符号引用验证(常量池引用有效性) 3. 准备(Preparation) 任务 :为类的静态变量分配内存并设置 初始默认值 (非显式赋值)。 例如:public static int a = 10;在准备阶段a的值为0(int...
MySQL的MVCC
MVCC多版本并发控制 MVCC 的目标:让读操作尽量不阻塞写操作,写操作也尽量不阻塞读操作。 核心机制: MVCC主要依赖以下机制实现: 数据库行记录中的隐藏字段:最近修改本行数据的事务id、回滚指针指向本行数据的上个版本(其实是指向undo,通过undo计算上一个版本) •undo log:回滚日志,在insert、delete、update时产生,记载了与操作相反的操作,比如delete操作对应了一条insert日志 •readview:快照读SQL执行时产生的读视图,生成的一个快照,记录了以下字段,用于数据的可见性判断:◦ 当前活跃的事务id集合◦ 最小活跃事务id◦ 预分配事务id,即应该分配的下一个事务id◦ readview创建者id,即本事务id ...
SpringMVC执行流程
SpringMVC执行流程 请求先到 DispatcherServlet(前端控制器),它负责调度 HandlerMapping → HandlerAdapter → Controller → ViewResolver → View。 Spring MVC 采用前端控制器模式,所有请求先进入 DispatcherServlet。DispatcherServlet 通过 HandlerMapping 找到对应的 Controller,再通过 HandlerAdapter 调用方法执行。Controller 返回结果后,如果是视图名则交给 ViewResolver 解析并渲染视图;如果是 @ResponseBody,则通过 HttpMessageConverter 转换为 JSON 返回给客户端。
MySqL事务特性,隔离级别
MySqL事务隔离级别 事务的特性: 原子性:事务要么全部提交成功要么全部失败 一致性:事务操作前和操作后具有完整性约束,数据库保持一致性状态 隔离性:事务执行时相互隔离互不影响,可以防止多个事务并发执行由于交叉执行导致的不一致 持久性:事务操作结束后修改是永久性的,即使关机故障也不会消失 MySQL InnoDB 引擎通过什么技术来保证事务的这四个特性的呢? 持久性是通过 redo log (重做日志)来保证的; 原子性是通过 undo log(回滚日志) 来保证的; 隔离性是通过 MVCC(多版本并发控制) 或锁机制来保证的; 一致性则是通过持久性+原子性+隔离性来保证; 事务的隔离级别有哪些? 读未提交 最低的隔离级别, 会导致脏读、幻读或不可重复读。 读已提交 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。这是大多数数据库(如 Oracle, SQL Server)的默认隔离级别。 ...
Redis的ziplist到ListPack
Redis的压缩列表ziplist到紧凑列表listpack ziplist 的结构(老版本用的) 大概长这样: 12345[zlbytes][zltail][zllen][entry1][entry2]...[entryN][0xFF]● *zlbytes*,记录整个压缩列表占用对内存字节数;● *zltail*,记录压缩列表「尾部」节点距离起始地址由多少字节,也就是列表尾的偏移量;● *zllen*,记录压缩列表包含的节点数量;● *0xFF*,标记压缩列表的结束点,固定值 0xFF(十进制255)。 每个 entry 里: 1[prevlen][encoding][data] prevlen:前一个 entry 的长度(1 或 5 字节) encoding:当前 entry 是字符串还是整数,长度是多少 data:真正的数据 listpack 的结构(新版本用的) 大概长这样: 1234[total_bytes][count][entry1][entry2]...[entryN][0xFF]total_bytes:整个 listpack...
HotSpot 垃圾收集器
HotSpot 垃圾收集器 HotSpot 虚拟机提供了多种垃圾收集器,每种收集器都有各自的特点,虽然我们要对各个收集器进行比较,但并非为了挑选出一个最好的收集器。我们选择的只是对具体应用最合适的收集器。 新生代垃圾收集器 Serial 垃圾收集器(单线程) 只开启一条 GC 线程进行垃圾回收,并且在垃圾收集过程中停止一切用户线程,即 Stop The World。 一般客户端应用所需内存较小,不会创建太多对象,而且堆内存不大,因此垃圾收集器回收时间短,即使在这段时间停止一切用户线程,也不会感觉明显卡顿。因此 Serial 垃圾收集器适合客户端使用。 由于 Serial 收集器只使用一条 GC 线程,避免了线程切换的开销,从而简单高效。 ParNew 垃圾收集器(多线程) ParNew 是 Serial 的多线程版本。由多条 GC 线程并行地进行垃圾清理。但清理过程依然需要 Stop The World。 ParNew 追求“低停顿时间”,与 Serial 唯一区别就是使用了多线程进行垃圾收集,在多 CPU 环境下性能比 Serial...
AIO BIO NIO区别?
AIO BIO NIO区别? BIO(同步阻塞 I/O) BIO 是传统的 I/O 模式,全称为 Block I/O,也叫同步阻塞 I/O。在 BIO 模式下,当我们执行 I/O 操作时,比如读取文件或者网络请求,程序会 阻塞,直到 I/O 操作完成后,才能继续执行后面的代码。也就是说,当一个线程在等待 I/O 完成时,它是处于阻塞状态的,不能做其他事情。 NIO(同步非阻塞 I/O) 一个线程管理多个连接 NIO 是对传统 BIO 的改进,它全称是 Non-blocking I/O(非阻塞 I/O)。在 NIO 模式下,I/O 操作不是阻塞的,可以同时处理多个 I/O 请求。与 BIO 不同的是,NIO 使用了 Channel(通道) 和 Buffer(缓冲区) 来进行数据读写,并且它支持 多路复用,这意味着多个 I/O 操作可以共享一个线程来处理,从而大大提高了并发性能。 AIO(异步非阻塞 I/O) AIO 是 NIO 的进一步升级,叫做 Asynchronous I/O(异步非阻塞 I/O)。在 AIO 模式下,I/O 操作是完全异步的,不需要线程阻塞等待...
Redis网络模型
Redis网络模型(io多路复用) 阻塞IO(Blocking IO) 假设服务端只开启一个线程处理请求,第一个请求到来,开始调用内核read函数,然后就会发生阻塞,第二个请求到来时服务端将无法处理,只能等第一个请求读取完成。这种方式的缺点很明显,每次只能处理一个请求,无法发挥cpu多核优势,性能低下。 为了解决这个问题,我们可以引入多线程,这样就可以同时处理多个请求了,但服务端可能同时有成千上万的请求需要处理,随之而来的是线程数膨胀,频繁创建、销毁线程带来的性能影响,当然我们可以使用线程池,但服务能处理的总体数量就会受限于线程池线程数量。 非阻塞IO(NON-Blocking...





