摘要:
1.找到慢SQL 通过启用慢查询日志,记录超过指定时间的SQL查询。 或者使用show processlist; 命令查看当前正在执行的SQL语句,找到执行时间较长的SQl 或者业务基建中加入对慢SQL的监控,常见方案有 字节码插桩 连接池扩展 ORM框架扩展 2. 然后使用explain 查看慢S
阅读全文
posted @ 2025-05-23 11:14
kuki'
阅读(27)
推荐(0)
摘要:
1. 慢SQL定义 MySQL中有一个叫long_query_time的参数,执行时间超过该参数的SQL就是慢SQL,会被记录到慢查询日志中。
阅读全文
posted @ 2025-05-23 11:06
kuki'
阅读(42)
推荐(0)
摘要:
当我们执行一条Select语句时,MySQL并不会直接去磁盘读取数据,而是经过6个步骤来解析,优化,执行,然后再返回结果。 客户端发送SQL查询语句到 MySQL服务器。 MySQL服务器的 连接器 开始处理这个请求, 跟客户端建立连接,获取权限,管理连接。 解析器 对SQL语句进行解析,检查语句是
阅读全文
posted @ 2025-05-20 19:19
kuki'
阅读(26)
推荐(0)
摘要:
binlog在服务层,负责记录SQL语句的变化。 它记录了所有对数据库进行更改的操作,用于数据恢复、主从复制等。
阅读全文
posted @ 2025-05-20 17:40
kuki'
阅读(11)
推荐(0)
摘要:
MySQL采用分层架构,主要包括连接层,服务层,和存储引擎层。 连接层 负责客户端连接的管理,包括验证用户身份、权限检验、连接管理等 可以通过数据库连接池来提升连接的处理效率 服务层 是MySQL的核心,主要负责查询解析、优化、执行等操作。 这一层,SQL语句会经过解析、优化器优化,然后转发到存储引
阅读全文
posted @ 2025-05-20 17:36
kuki'
阅读(13)
推荐(0)
摘要:
SQL语法树解析是将SQL查询语句转换成抽象语法树- AST的过程,是数据库引擎处理查询的第一步,也是防止SQL注入的重要手段。 第一阶段 语法分析:拆解SQL语句,识别关键字、表名、列名 [select] [id] 第二阶段 语法分析:检查SQL是否符合语法规则,并构建抽象语法树 大概就是构建语法
阅读全文
posted @ 2025-05-20 16:25
kuki'
阅读(60)
推荐(0)
摘要:
先执行From确定主表,再执行join连接,然后where进行过滤,接着group by进行分组, having过滤聚合结果,select选择最终列,order by排序,最后limit限制返回结果 where先执行是为了减少数据量,having只能过滤聚合结果,order by必须在select之
阅读全文
posted @ 2025-05-19 21:49
kuki'
阅读(19)
推荐(0)
摘要:
blob 用于存储二进制数据,比如图片,音频,视频,文件等。 实际开发中,会把这些文件存储到OSS或者文件服务器上。 然后在数据库中存储文件的URL text 用于存储文本数据,比如文章,评论,日志等
阅读全文
posted @ 2025-05-19 21:21
kuki'
阅读(29)
推荐(0)
摘要:
通过内连接inner join,外连接outer join, 交叉连接 cross join来合并多个表的查询结果。 什么是内连接 内连接用于返回两个表中有匹配关系的行。 假设有两张表,用户表和订单表,想查询有订单的用户 select users.name, orders.order_id from
阅读全文
posted @ 2025-05-19 21:11
kuki'
阅读(20)
推荐(0)
摘要:
可能是SQL查询使用了全表扫描 也可能是查询语句过于复杂,如多表JOIN或嵌套子查询。 也有可能是单表数据量过大 通常情况,加索引能解决大部分性能问题。 对于热点数据,还可以通过增加Redis缓存,减轻数据库的访问压力。
阅读全文
posted @ 2025-05-19 20:31
kuki'
阅读(24)
推荐(0)
摘要:
-Xms 设置JVM堆的初始大小 -XMx 设置JVM堆的最大大小 -Xmn 设置新生代(Young Generation) 的大小。 -XX:NewSize: 设置新生代最小空间大小 -XX:MaxNewSize : 设置新生代 最大空间大小 -XX:MaxPermSize: 设置永久代(Perm
阅读全文
posted @ 2025-05-19 14:18
kuki'
阅读(25)
推荐(0)
摘要:
Java类加载器采用的一种类加载策略 该机制的核心:如果一个类加载器收到了类加载请求 默认先将该请求委托给父类加载器处理, 只有父级加载器无法加载该类时,才会尝试自行加载。 在JVM中,有三种类型的类加载器 启动类加载器(Bootstrap ClassLoader):负责加载 %JAVA_Home%
阅读全文
posted @ 2025-05-19 13:44
kuki'
阅读(26)
推荐(0)
摘要:
类加载机制是Java虚拟机(JVM)在运行Java程序时负责将类加载到内存中的过程。包括以下步骤: 1. 加载(Loading) 在此阶段,类加载器负责查找类的字节码文件,并将其加载到内存中。 字节码可以来自文件系统、网络等位置。 加载阶段不会执行类中的静态初始化代码。 2. 连接(Linking)
阅读全文
posted @ 2025-05-19 12:56
kuki'
阅读(11)
推荐(0)
摘要:
1. G1收集器-标记整理算法 JDK1.7 后全新的回收器,用于取代CMS收集器。 G1收集器的优势 独特的分代垃圾回收器,分代GC:分代收集器,同时兼顾年轻代和老年代。 使用分区算法,不要求Eden,年轻代或年老代的空间连续 并行期:回收期间,可由多个线程同时工作,利用多核cpu 空间整理:回收
阅读全文
posted @ 2025-05-18 22:02
kuki'
阅读(22)
推荐(0)
摘要:
Serial Old 收集器-标记整理算法 Serial Old是Serial收集器的老年代版本,它同样是一个单线程(串行)收集器,使用标记-整理算法。 这个收集器的主要意义在于给Client模式下的虚拟机使用。 如果在Server模式下,2大用途 在JDK1.5及之前的版本中与Parallel S
阅读全文
posted @ 2025-05-18 21:49
kuki'
阅读(10)
推荐(0)
摘要:
Serial串行收集器-复制算法 Serial收集器是新生代单线程收集器,优点是简单高效,是最基本的收集器 它在进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集完成。 Serial收集器是虚拟机运行在Client模式下默认新生代收集器 ParNew 收集器-复制算法 ParNew 收集器是新生
阅读全文
posted @ 2025-05-18 21:06
kuki'
阅读(15)
推荐(0)
摘要:
新生代的收集器包括 Serial PraNew Parallel Scavenge(觅食) 老年代的收集器包括 Serial Old Parallel Old CMS 回收整个Java堆(新生代和老年代) G1收集器
阅读全文
posted @ 2025-05-18 20:13
kuki'
阅读(6)
推荐(0)
摘要:
1. 垃圾回收算法 1. 标记清除 标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。 在标记阶段,首先通过根节点(GC Roots),标记所有从根节点开始的对象, 未被标记的对象就是未被引用 的垃圾对象。 然后清除阶段,清除所有未被标记的对象。 适用场合: 存活对象较多的情况下比较高效 适
阅读全文
posted @ 2025-05-18 20:10
kuki'
阅读(34)
推荐(0)
摘要:
1. 引用计数法 给对象中添加一个引用计数器 每当有一个地方引用它,计数器就+1. 当引用失效,计数器就减1 任何时候计数器为0的对象不可能再被使用 有问题:不能解决循环引用的问题。 2. 可达性分析算法 基本思想:通过一系列的称为"GC Roots"的对象作为起点 从这些节点开始向下搜索,节点所走
阅读全文
posted @ 2025-05-18 18:48
kuki'
阅读(23)
推荐(0)
摘要:
四种引用,是Java中用来描述对象生命周期的概念,分别是强引用,软引用,弱引用和虚引用。他们在垃圾回收过程中的行为不同,允许程序员更精细地控制对象的生命周期。 1. 强引用(Strong Reference): 强引用是Java中最常见的引用类型, 如果一个对象具有强引用。 即使系统内存不足,垃圾回
阅读全文
posted @ 2025-05-18 16:46
kuki'
阅读(126)
推荐(0)
摘要:
组成部分 类的加载器 运行时数据区域 执行引擎 本地库接口 作用 首先通过类加载器 ClassLoader 将java代码转为字节码。 运行时数据区 Runtime Data Area 再把字节码加载到内存中。 而字节码只是JVM的一套指令规范,并不能直接交给底层操作系统执行。需要特定命令解析器执行
阅读全文
posted @ 2025-05-17 21:50
kuki'
阅读(13)
推荐(0)
摘要:
堆运行时确定内存大小,栈编译时即可确定内存大小 堆内存由用户管理(java中由jvm管理),栈内存会被自动释放。 栈实现方式采用数据结构中的栈实现,具有先进后出的顺序特点,堆为一块一块的内存。 栈由于其实现方式,在分配速度上比堆快的多,分配一块栈内存不过是简单的移动一个指针。 栈为线程私有,而堆为线
阅读全文
posted @ 2025-05-17 21:38
kuki'
阅读(9)
推荐(0)
摘要:
BIO(Blocking I/O),NIO(Non-blocking I/O), AIO(Asynchronous I/O) (异步)是java中用于处理不同I/O操作的不同模型。 1. 概念 BIO (Blocking I/O) BIO(Blocking I/O)BIO指的是同步阻塞进行I/O操作
阅读全文
posted @ 2025-05-17 21:28
kuki'
阅读(112)
推荐(0)
摘要:
volatile被誉为 轻量级的synchronized,也是java编程中比较重要的一个关键字。 和synchronized不同, volatilze是一个变量修饰符,只能用来修饰变量 无法修饰方法及代码块。 被volatile修饰的共享变量,就具有了以下两点特性 保证了不同线程对该变量操作的内存
阅读全文
posted @ 2025-05-17 20:58
kuki'
阅读(25)
推荐(0)
摘要:
ReentrantLock 是java.util.concurrent.locks包下 Lock接口的一个具体实现 可重入性: synchronized和ReentrantLock都是可重入的,即同一个线程可以多次获取同一个锁 公平性 synchronized的锁是非公平的,即锁的获取顺序是不确定的
阅读全文
posted @ 2025-05-17 17:41
kuki'
阅读(4)
推荐(0)
摘要:
Java中,synchronized是一种关键字,用于实现线程同步 当一个方法/代码块被synchronized修饰时,它将成为一个临界区,同一时刻只能由一个线程访问,其他线程必须等待当前线程退出临界区才进入。确保多个线程在访问共享资源时不会产生冲突。 synchronized可用于方法/代码块。
阅读全文
posted @ 2025-05-17 17:12
kuki'
阅读(12)
推荐(0)
摘要:
1. 阻塞同步 使用锁实现,具体采用什么锁,有两种选择: 内置锁也就是synchronized 关键字 JUC下具体锁的实现 2. 非阻塞同步 使用锁带来的问题 频繁的线程阻塞、唤醒操作以及用户态,内核态的切换带来的性能问题。 可能这些额外的操作带来的时间消耗远大于线程自身业务执行时间 所以引入非阻
阅读全文
posted @ 2025-05-17 16:47
kuki'
阅读(6)
推荐(0)
摘要:
锁的名词 公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲观锁 分段锁 偏向锁/轻量级锁/重量级锁 自旋锁 这些分类并不是全是指锁的状态,有的指锁的特性,有的指锁的设计 1. 公平锁/非公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁 非公平锁是指多个线程获取锁的顺序并不是按
阅读全文
posted @ 2025-05-16 21:23
kuki'
阅读(48)
推荐(0)
摘要:
在Java多线程中,run方法和start方法的区别在于 run方法是线程的执行体,包含线程要执行的代码,直接调用run方法时,它会在当前线程中执行,而不是创建新的线程。 start方法用于启动一个新的线程,并在新线程中执行run方法的代码。 调用start方法会为线程分配系统资源,并将线程置于就绪
阅读全文
posted @ 2025-05-16 20:05
kuki'
阅读(37)
推荐(0)
摘要:
进程时系统运行程序的基本单位。 在Java中,当我们启动main函数,其实就是启动了一个JVM的进程,而main函数所在的线程就是这个进程中的一个线程,也称主线程。 线程是进程中的一个执行单元 一个进程可以包含多个线程。 这些线程共享进程的内存空间和系统资源。 线程是操作系统调度的最小单位,它负责执
阅读全文
posted @ 2025-05-16 19:41
kuki'
阅读(12)
推荐(0)
摘要:
1. 线程安全性 HashMap不是线程安全的 ConcurrentHashMap是线程安全的, 2. 同步机制 HashMap在实现上没有明确的同步机制,需要在外部进行同步,例如使用Collections.synchronizedMap方法 ConcurrentHashMap内部使用了一种更细粒度
阅读全文
posted @ 2025-05-16 17:32
kuki'
阅读(34)
推荐(0)
摘要:
如果不需要线程安全性,更关注性能,通常会选择使用HashMap。 如果需要线程安全性,考虑使用HashTable,或者使用ConcurrentHashMap HashMap和HashTable的区别 1. 同步 HashTable是同步的,即它的方法是线程安全的。 通过在每个方法上添加同步关键字实现
阅读全文
posted @ 2025-05-16 17:03
kuki'
阅读(41)
推荐(0)
摘要:
ConcurrentHashMap 在JDK1.8中使用数组+ 链表 + 红黑树的方式实现。。 它通过CAS或者synchronized来保证线程安全的, 缩小了锁的粒度,查询性能也更高。
阅读全文
posted @ 2025-05-16 16:22
kuki'
阅读(61)
推荐(0)
摘要:
为了实现线程安全的HashMap,有以下几种方式: 使用Collections.synchronizedMap()方法,synchronized是同步的意思。 可以通过Collections.synchronizedMap()方法创建一个线程安全的HashMap 该方法返回一个同步的Map包装器,使
阅读全文
posted @ 2025-05-16 12:29
kuki'
阅读(56)
推荐(0)
摘要:
因为它的操作不是原子的, 即在多个线程同时进行读写操作时,可能会导致数据不一致性或抛出异常。 并发修改: 当一个线程进行写操作(插入、删除等)时, 另一个线程进行读操作,可能会导致读取到不一致的数据, 甚至抛出Concurrent ModificationException异常。 非原子性操作:Ha
阅读全文
posted @ 2025-05-16 12:20
kuki'
阅读(29)
推荐(0)
摘要:
我们只看JDK1.8的扩容 生成新数组 遍历老数组中的每个位置的链表或红黑树 如果是链表,则直接将链表中的每个元素重新计算下标,添加到新数组中去。 如果是红黑树,则先遍历红黑树,计算出红黑树中的每个元素对应在新数组中的下标位置。 统计每个下标位置的元素个数; 若该位置下的元素个数超过了8,则生成一个
阅读全文
posted @ 2025-05-16 12:06
kuki'
阅读(19)
推荐(0)
摘要:
判断数组是否为空 为空,进行初始化 不为空,计算key的hash值, 通过(n-1)&hash 计算应当存放在数组中的下标index。 查看table[index]是否存在数据, 没有数据,就构造一个Node节点存放在table[index]中。 存在数据,说明发生了hash冲突(存在两个节点key
阅读全文
posted @ 2025-05-16 11:56
kuki'
阅读(7)
推荐(0)
摘要:
哈希表为解决冲突,可以采用开放地址法和链地址法来解决问题。 开放地址法(再散列法) 链地址法(数组+链表) Java中 的HashMap使用链地址法。
阅读全文
posted @ 2025-05-15 21:20
kuki'
阅读(15)
推荐(0)
摘要:
读 在最佳情况下,直接通过数组下标访问数据,O(n)还是O(1)
阅读全文
posted @ 2025-05-15 21:00
kuki'
阅读(13)
推荐(0)
摘要:
不追求绝对的平衡,插入/删除节点时,允许有一定的局部不平衡。 红黑树是一种自平衡的二叉搜索树,插入和删除的时间复杂度是O(log n); 红黑树和二叉搜索树、AVL树有什么区别? 红黑树:节点颜色为红色或黑色 根节点和叶子节点为黑色; 任意一个红色节点的子节点是黑色。 插入和删除操作的时间复杂度都是
阅读全文
posted @ 2025-05-15 20:48
kuki'
阅读(34)
推荐(0)