- 博客(34)
- 收藏
- 关注
原创 Redis面试题总结
Redis(Remote Dictionary Server) 是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库。它主要的特点是把数据放在内存当中,相比直接访问磁盘的关系型数据库,读写速度会快很多,基本上能达到微秒级的响应。
2026-03-26 00:31:13
378
原创 Java面试题
JDK中包含JRE,JDK中有一个名为jre的目录,里面包含两个文件夹bin和lib,bin就是JVM,lib就是JVM工作所需要的类库。JRE(Java Runtime Environment),Java运行环境。JDK(Java Development Kit),Java开发工具包。如果重写了equals方法,equals比较的是对象的内容。如果没有重写equals,equals就相当于==;对于引用类型,==比较的是堆中内存对象的地址;对于基本类型,==比较的是栈中的值;
2025-12-11 17:15:25
346
原创 CAS&Atomic原子操作类详解
Atomic::cmpxchg这个函数最终返回值是exchange_value,也就是说,如果cmpxchgl执行时compare_value和dest指针指向内存值相等则会使得dest指针指向内存值变成exchange_value,最终eax存的compare_value赋值给了exchange_value变量,即函数最终返回的值是原先的compare_value。也就是说,输出的eax是%0,输入的exchange_value、compare_value、dest、mp分别是%1、%2、%3、%4。
2025-10-01 17:31:07
857
原创 导致JVM内存泄露的ThreadLocal详解
现在我们开发应用一般都采用三层结构,如果我们控制事务的代码都放在DAO(DataAccessObject)对象中,在DAO对象的每个方法当中去打开事务和关闭事务,当Service对象在调用DAO时,如果只调用一个DAO,那我们这样实现则效果不错,但往往我们的Service会调用一系列的DAO对数据库进行多次操作,那么,这个时候我们就无法控制事务的边界了,因为实际应用当中,我们的Service调用的DAO的个数是不确定的,可根据需求而变化,而且还可能出现Service调用Service的情况。
2025-09-30 17:29:47
1145
原创 JDK17新特性
“你发任你发,我用 Java8”。虽然业界现在对于 JDK8 后每半年更新一次的 JDK 新版本都保持着比较谨慎的态度,但是 JDK17是一个 Java 程序员不得不去关注的新版本。最直观的原因是,作为现代 Java 应用基石的 Spring 和 SpringBoot ,都在新版本中走出了抛弃 JDK8,支持 JDK17 的这一步。 你或许不一定需要像技术极客一样去紧追 JDK 各种令人眼花缭乱的最新特性,但是 JDK17 却是每个 Java 程序员必须走出的下一个里程碑。
2025-09-28 17:33:33
1007
原创 JVM调优实战及常量池详解
这些常量池现在是静态信息,只有到运行时被加载到内存后,这些符号才有对应的内存地址信息,这些常量池一旦被装入内存就变成运行时常量池,对应的符号引用在程序加载或运行时会被转变为被加载到内存区域的代码的直接引用,也就是我们说的动态链接了。在编译期其字符串常量的值就确定下来,故上面程序最终的结果都为true。分析:JVM对于字符串引用,由于在字符串的"+"连接中,有字符串引用存在,而引用的值在程序编译期是无法确定的,即"a" + bb无法被编译器优化,只有在程序运行期来动态分配并将连接后的新地址赋给b。
2025-09-23 19:18:27
693
原创 JVM调优工具详解及调优实战
这个因为之前已经大概知道Young GC的频率,假设是每5分钟一次,那么可以执行命令 jstat -gc pid 300000 10 ,观察每次结果eden,survivor和老年代使用的变化情况,在每次gc后eden区使用一般会大幅减少,survivor和老年代都有可能增长,这些增长的对象就是每次Young GC后存活的对象,同时还可以看出每次Young GC后进去老年代大概多少对象,从而可以推算出老年代对象增长速率。尽量减少Full GC的频率,避免频繁Full GC对JVM性能的影响。
2025-09-23 19:07:22
620
原创 垃圾收集器G1&ZGC详解
XX:G1HeapWastePercent(默认5%): gc过程中空出来的region是否充足阈值,在混合回收的时候,对Region回收都是基于复制算法进行的,都是把要回收的Region里的存活对象放入其他Region,然后这个Region中的垃圾对象全部清理掉,这样的话在回收过程就会不断空出来新的Region,一旦空闲出来的Region数量达到了堆内存的5%,此时就会立即停止混合回收,意味着本次混合回收就结束了。ZGC的停顿时间是在10ms以下,但是ZGC的执行时间还是远远大于这个时间的。
2025-09-23 18:55:17
654
原创 垃圾收集器ParNew&CMS与底层三色标记算法详解
垃圾收集算法当前虚拟机的垃圾收集都采用分代收集算法,这种算法没有什么新的思想,只是根据对象存活周期的不同将内存分为几块。一般将java堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。比如在新生代中,每次收集都会有大量对象(近99%)死去,所以可以选择复制算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集。而老年代的对象存活几率是比较高的,而且没有额外的空间对它进行分配担保,所以我们必须选择“标记-清除”或“标记-整理”算法进行垃圾收集。
2025-09-23 18:51:22
667
原创 深⼊理解 JVM 执⾏引擎
在一般应用中,完全不会逃逸的局部对象和不会逃逸出线程的对象所占的比例是很大的,如果能使用栈上分配,那大量的对象就会随着方法的结束而自动销毁了,垃圾收集子系统的压力将会下降很多。当一个方法被调用时,虚拟机会先检查该方法是否存在被即时编译过的版本,如果存在,则优先使用编译后的本地代码来执行。当解释器遇到一条回边指令时,会先查找将要执行的代码片段是否有已经编译好的版本,如果有的话,它将会优先执行已编译的代码,否则就把回边计数器的值加一,然后判断方法调用计数器与回边计数器值之和是否超过回边计数器的阈值。
2025-09-23 18:34:23
825
原创 JVM对象创建与内存分配机制
大量的对象被分配在eden区,eden区满了后会触发minor gc,可能会有99%以上的对象成为垃圾被回收掉,剩余存活的对象会被挪到为空的那块survivor区,下一次eden区满了后又会触发minor gc,把eden区和survivor区垃圾对象回收,把剩余存活的对象一次性挪动到另外一块为空的survivor区,因为新生代的对象都是朝生夕死的,存活时间很短,所以JVM默认的8:1:1的比例是很合适的,让eden区尽量的大,survivor区够用即可,而在JAVA中对象就是可以被进一步分解的聚合量。
2025-09-23 18:15:26
1021
原创 JVM内存模型深度剖析与优化
对象在堆内部挪动的过程其实是复制,原有区域对象还在,一般不直接清理,JVM内部清理过程只是将对象分配指针移动到区域的头位置即可,比如扫描s0区域,扫到gcroot引用的非垃圾对象是将这些对象复制到s1或老年代,最后扫描完了将s0区域的对象分配指针移动到区域的起始位置即可,s0区域之前对象并不直接清理,当有新对象分配了,原有区域里的对象也就被清除了。-XX:MaxMetaspaceSize: 设置元空间最大值, 默认是-1, 即不限制, 或者说只受限于本地内存大小。-Xss:每个线程的栈大小。
2025-09-21 23:13:40
960
原创 JAVA类加载机制
JAVA类加载机制是JVM的⻔户,我们编写的Class⽂件都需要经过JDK提供的类加载器加载到JVM中,才能执⾏。今天就跟⼤家⼀起全⾯梳理类加载机制能够给我们的业务编码带来哪些帮助。⼀、快速梳理JAVA类加载机制三句话总结JDK8的类加载机制:1.类缓存:每个类加载器对他加载过的类都有⼀个缓存。2.双亲委派:向上委托查找,向下委托加载。3.沙箱保护机制:不允许应⽤程序加载JDK内部的系统类。1JDK8的类加载体系左侧是JDK中实现的类加载器,通过。
2025-09-20 16:47:10
387
原创 JVM内存模型详解
本章节内容:1、一个Java类是如何在JVM中执行的2、Class文件规范解读3、类加载机制4、JVM执行引擎解读5、GC垃圾回收器介绍6、GC日志分析实例。
2025-09-19 14:31:07
239
原创 RocketMQ核心编程模型
在消息需要重试时,会先移动到对应的重试Topic中。但是,这里还是会造成一种分裂,消息最终是由Consumer来处理,但是消息却是由Broker推送过来的,也就是说,Consumer无法确定自己将要处理的是哪些消息。这时,就可以创建另外一个新的消费者组,并通过ConsumerFromWhere属性指定这个消费者组的消费起点,从而让这个新的消费者组去消费之前发送过的历史消息。因此,在复杂业务场景下,不建议使用msgId来作为消息的唯一索引,而建议采用下面的key属性,自行指定业务层面上的唯一索引。
2025-09-15 01:51:31
842
原创 RocketMQ核心概念详解
MQ:MessageQueue,消息队列。是在互联网中使用非常广泛的一系列服务中间件。这个词可以分两个部分来看,一是Message:消息。消息是在不同进程之间传递的数据。这些进程可以部署在同一台机器上,也可以分布在不同机器上。二是Queue:队列。队列原意是指一种具有FIFO(先进先出)特性的数据结构,是用来缓存数据的。对于消息中间件产品来说,能不能保证FIFO特性,尚值得考量。但是,所有消息队列都是需要具备存储消息,让消息排队的能力。
2025-09-15 00:37:52
972
原创 Redis7底层数据结构解析
Redis有上层的应用类型,也有底层的数据结构。那么这些上层数据类型和底层数据结构是怎么对应的呢?OKstring"embstr"这就是一种对应关系。也就是说,在应用层面,我们操作的是string这样的数据类型,但是Redis在底层,操作的是embstr这样一种数据结构。但是,这些上层的数据类型和底层的数据结构之间,是不是就是简单的一一对应的关系呢?
2025-09-14 20:26:14
1009
原创 Redis Stack扩展功能
比如在分布式场景下做用户登录功能,我们就可以将用户信息以JSON字符串的形式保存到Redis中,来代替单体应用中的Session,从而实现统一的登录状态管理。桶Busket中并不实际保存数据本身,而是保存数据的指纹(可以认为是压缩后的数据,实际上是数据对象的几个低位数据)。这样就极大的减少了数据迁移带来的麻烦。通常使用的 keys * 这样的指令,在生产环境一般都是直接禁用的,因为这样会产生严重的线程阻塞,影响其他的读写操作。所以,在布隆过滤器的初始化过程中,通常只需要指定过滤器的容量和误判率,就足够了。
2025-09-13 19:12:52
1695
原创 Redis高并发分布式锁&缓存性能优化
问题场景:问题:只适用于单机服务,如果部署多个tomcat,1个tomacat就是一个JVM进程,只在本jvm的tomacat进程中适用,在分布式或高可用场景下依然无法解决超卖问题。:基于Redis的分布式锁实现1、使用setnx(set if not exists)实现分布式锁setnx的作用是:当目标key不存在时才会设置成功,否则设置失败。这样的话当多个进程同时尝试set同一个key时,同一时刻只能有一个成功。这种方式存在一个。
2025-09-10 23:44:42
1667
原创 Redis数据安全性分析
Redis的所有数据是保存在内存当中的,得益于内存高效的读写性能,Redis的性能是非常强悍的。但是,内存的缺点是断电即丢失,所以,在实际项目中,Redis一旦需要保存一些重要的数据,就不可能完全使用内存保存数据。因此,在真实项目中要使用Redis,一定需要针对应用场景,对Redis的性能进行估算,从而在数据安全性与读写性能之间找到一个平衡点。Redis提供了压测脚本redis-benchmark,可以对Redis进行快速的基准测试。
2025-09-10 03:46:43
1029
原创 深入理解Redis线程模型
Redis,全称Remote Dictionary Server,远程字典服务,是一个完全开源的,高性能的Key-Value数据库。官网地址:。数据结构复杂。Redis相比于传统的K-V型数据库,能够支撑更更复杂的数据类型。这意味着Redis已经远远超出了缓存的范围,可以实现很多复杂的业务场景。并且还在不断发展更多的业务场景。数据保存在内存,但是持久化到硬盘。数据全部保存在内存,意味着Redis进行数据读和写的性能非常高。是集中式缓存的不二之选。
2025-09-08 02:06:40
454
原创 Redis核心数据结构浅析
没有配置类,redis也能使用,项目启动后springboot会通过IOC注入一个默认的RedisTemplate实例,但是默认的RedisTemplate存在中文乱码问题。返回的信息,包括,语法结构、作用描述、从哪一个版本的redis开始生效的。redis有五种基本数据结构:String(字符串)、List(列表)、Hash(哈希)、Set(集合)、Zset(有序集合)用于统计集合中不重复元素的个数(基数统计),适合大数据量场景(如 UV 统计)。他的效率非常高,适合大数据量场景下的统计。
2025-09-08 00:52:05
1026
原创 Redis7安装部署
数 据的复制是单向的,只能由主节点到从节点。当主观下线的节点是主节点时,此时该哨兵3节点会通过指令sentinel is-masterdown-by-addr寻求其它哨兵节点对主节点的判断,当超过quorum(选举)个数,此时哨兵节点则认为该主节点确实有问题,这样就客观下线了,⼤部分哨兵节点都同意下线操作,也就说是客观下线。c)负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应⽤连接主节点,读Redis数据时应⽤连接从节点),分担服务器负载;
2025-09-06 23:16:53
917
原创 Mysql8.0高可用集群架构
MySQL Group Replication,简称MGR,是MySQL的主从同步高可用方案,包括数据同步及角色选举Mysql Shell 是InnoDB Cluster的管理工具,用来创建和管理集群Mysql Router 是业务流量入口,支持对MGR的主从角色判断,可以配置不同的端口分别对外提供读写服务,实现读写分离MySQL Router与组复制和MySQL Shell高度整合,只有将其与组复制和MySQL Shell共同使用,才能够称为InnoDB Cluster。
2025-09-06 18:14:30
1113
原创 MySQL 8.0 主从复制原理分析与实战
MySQL 复制(Replication) 是官方提供的主从复制(源到副本的复制)方案,用于将一个 MySQL 的实例同步到另一个实例中。这是使用最广泛的容灾方案。复制(Replication)什么是复制官网:https://dev.mysql.com/doc/refman/8.0/en/replication.htmlMySQL Replication是官方提供的主从同步方案,也是用的最广的同步方案。
2025-09-06 14:18:45
1153
原创 Mysql全局优化与Mysql 8.0新特性简述
本文主要简述MySQL8.0的一些新特性,以及相较于5.7版本的一些不同之处。从上图可以看出SQL及索引的优化效果是最好的,而且成本最低,所以工作中我们要在这块花更多时间。补充一点配置文件my.ini或my.cnf的全局参数:CPU:32核内存:64G下面参数都是服务端参数,默认在配置文件的 [mysqld] 标签下。
2025-09-06 11:43:03
929
原创 Mysql日志机制与Innodb底层原理浅析
在 MySQL 中,Redo Log(重做日志) 是 InnoDB 存储引擎实现事务持久性(ACID 中的 D) 的核心机制,同时也通过 “预写日志(Write-Ahead Logging, WAL)” 策略提升了数据写入性能。它记录的是数据页的物理修改操作(非 SQL 逻辑),用于在数据库崩溃后恢复未持久化到磁盘的数据,避免数据丢失。
2025-09-04 23:13:18
718
原创 Mysql事务隔离级别、锁机制及MVCC底层原理剖析
我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。这些问题的本质都是数据库的多事务并发问题,为了解决多事务并发问题,数据库设计了事务隔离机制、锁机制、MVCC多版本并发控制隔离机制,用一整套机制来解决多事务并发问题。接下来,我们会深入讲解这些机制,让大家彻底理解数据库内部的执行原理。
2025-09-03 01:19:51
603
原创 Explain详解与索引最佳实践
点击链接Explain可以理解为Mysql提供给sql编写人员的调试工具,使用Explain关键字可以模拟优化器执行sql语句,分析查询语句或结构的性能瓶颈。使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或结构的性能瓶颈。在 select 语句前面增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL。
2025-09-01 02:38:31
1117
原创 Mysql体系架构浅析
Mysql官方文档:https://dev.mysql.com/doc/refman/8.0/en/installing.html1.1 查询操作:1. 客户端:可以是控制台,Navacat,发送sql请求。2. 连接器:负责身份验证病建立连接,通常建议使用长连接,以减少资源消耗,但需注意可能导致内存溢出的风险。3. 查询缓存:检查是否有缓存结果,但MySQL 8.0 已移除。4. 分析器:先词法分析(查找关键字例如select、update、delete等,表、字段),语法分析(判断sql语句是否正确)。
2025-08-29 23:19:11
219
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
1