自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(42)
  • 收藏
  • 关注

原创 ReentrantLock

如果state=0即代表锁没有被其他线程占用,则设置当前锁的持有者为当前线程,该操作用CAS完成。如果不存在则直接将锁的所有者设置成当前线程,且更新状态state.= 0则代表锁正在被其他线程占用,执行第三步。如果state = 0即代表锁没有被其他线程占用,执行第二步。如果是0,代表刚好线程释放了锁,此时将锁的持有者设为自己。ReentrantLock有两种模式,一种是公平锁,一种是非公平锁。如果是,则给state + 1,获取锁。如果不是0,则查看线程持有者是不是自己。如果是则更新状态state的值。

2025-03-26 23:32:56 269

转载 数据库 MVCC

(2)事务A执行第一次查询操作,先生成 readView ,我们姑且称之为 readView_1,还未开始查询操作,事务B率先执行了更新操作,将数据进行了修改并提交,事务B结束,此时事务A第一次查询开始,但由于事务A已经生成了 readView_1 ,所以它不会读取到事务B修改过后的数据,读取到的是 readView_1 中事务B修改之前的数据,解决了脏读的问题;四个事务在对数据进行增删改查的时候,数据库就会给这四个事务的隐藏字段 trx_id 以自增的方式赋值,这里 假设分别赋值为 1,2,3,4。

2025-03-25 17:22:52 10

原创 JVM方法逃逸

根据对象逃逸的范围,可以分为方法逃逸和线程逃逸。当对象被方法外部的代码引用,生命周期超出了方法的范围,那么对象就必须分配在堆中,由垃圾收集器管理。比如说创建的对象被返回,那么这个对象就逃逸出当前方法了。再比如说,对象被另外一个线程引用,生命周期超出了当前线程,那么对象就必须分配在堆中,并且线程之间需要同步。对象被另外一个线程引用了,发生了线程逃逸。

2025-03-23 21:55:50 436

原创 InnDB的Buffer Pool

在调优方面,我们可以设置合理的 Buffer Pool 大小(通常为物理内存的 70%),并配置多个 Buffer Pool 实例(通过 innodb_buffer_pool_instances)来提升并发能力。Buffer Pool 是 InnoDB 存储引擎中的一个内存缓冲区,它会将数据以页(page)的单位保存在内存中,当查询请求需要读取数据时,优先从 Buffer Pool 获取数据,避免直接访问磁盘。通常采用改良的 LRU 算法来管理缓存页,也就是将最近最少使用的数据移出缓存,为新数据腾出空间。

2025-03-21 11:57:42 128

原创 跳表skiplist

Redis选择跳表而非B+树,核心原因在于‌内存场景下的性能平衡跳表以低实现复杂度、高效动态操作和内存友好性,完美适配Redis的高并发、高频更新需求‌。B+树的磁盘优化特性(如节点紧凑、减少I/O)在内存场景中无实际收益,反而因复杂逻辑降低性能‌。‌因此,B+树无法替代跳表在Redis ZSet中的作用‌。

2025-03-20 22:20:16 326

原创 Arrays.asList()问题

当你尝试执行这段代码时,会抛出 ‌UnsupportedOperationException‌ 异常。

2025-03-20 13:28:41 192

原创 RocketMq消息队列之保证消息不丢失问题

消息丢失可能存在的阶段有三个:生产阶段、存储阶段、消费阶段。

2025-03-18 22:30:25 296

转载 原子操作增强类LongAddr解析

LongAdder的基本思路就是分散热点,将value值分散到一个Cell数组中,不同线程会命中到数组的不同槽中,各个线程只对自己槽中的那个值进行CAS操作,这样热点就被分散了,冲突的概率就小很多。sum()会将所有Cell数组中的value和base累加作为返回值,核心的思想就是将之前AtomicLong一个value的更新压力分散到多个value中去,从而降级更新热点。base变量:非竞态条件下,直接累加到该变量上,Cell[]数组:竞态条件下,累加个各个线程自己的槽Cell[i]中。

2025-03-18 22:03:26 18

原创 JVM中STW解析

STW是JVM垃圾回收的核心机制,其设计平衡了内存回收的准确性与应用性能。通过选择并发收集器、优化堆参数及安全点策略,可显著降低STW对系统的影响‌。

2025-03-18 21:49:30 322

原创 CAS存在的问题以及解决方案

CAS 存在三个经典问题,ABA 问题、自旋开销大、只能操作一个变量等.ABA 问题指的是,一个值原来是 A,后来被改为 B,再后来又被改回 A,这时 CAS 会误认为这个值没有发生变化。可以使用版本号/时间戳的方式来解决 ABA 问题。比如说,每次变量更新时,不仅更新变量的值,还更新一个版本号。CAS 操作时,不仅比较变量的值,还比较版本号。Java 的 AtomicStampedReference 就增加了版本号,它会同时检查引用值和 stamp 是否都相等。

2025-03-18 21:24:15 162

原创 InnoDB的Buffer Pool

在调优方面,我们可以设置合理的 Buffer Pool 大小(通常为物理内存的 70%),并配置多个 Buffer Pool 实例(通过 innodb_buffer_pool_instances)来提升并发能力。Buffer Pool 是 InnoDB 存储引擎中的一个内存缓冲区,它会将数据以页(page)的单位保存在内存中,当查询请求需要读取数据时,优先从 Buffer Pool 获取数据,避免直接访问磁盘。通常采用改良的 LRU 算法来管理缓存页,也就是将最近最少使用的数据移出缓存,为新数据腾出空间。

2025-03-18 21:17:37 130

原创 transient关键字

transient是控制对象序列化行为的关键工具,适用于敏感数据保护、性能优化及资源管理场景。需注意其与静态变量的兼容性问题,必要时通过自定义序列化逻辑实现灵活控制‌。

2025-03-17 16:19:33 152

原创 volatile关键字

假如有两个线程,线程 1 执行 update 方法将 i 赋值为 100,一般情况下线程 1 会在自己的工作内存中完成赋值操作,但不会及时将新值刷新到主内存中。这个时候线程 2 执行 get 方法,首先会从主内存中读取 i 的值,然后加载到自己的工作内存中,此时读到 i 的值仍然是 50,再将 50 赋值给 j,最后返回 j 的值就是 50 了。原本期望返回 100,结果返回 50,这就是可见性问题,线程 1 对变量 i 进行了修改,线程 2 并没有立即看到 i 的新值。

2025-03-17 15:12:45 697

原创 实现ArrayList线程安全的方法

通俗的讲,CopyOnWrite 就是当我们往一个容器添加元素的时候,不直接往容器中添加,而是先复制出一个新的容器,然后在新的容器里添加元素,添加完之后,再将原容器的引用指向新的容器。多个线程在读的时候,不需要加锁,因为当前容器不会添加任何元素。,它是线程安全的 ArrayList,遵循写时复制的原则,每当对列表进行修改时,都会创建一个新副本,这个新副本会替换旧的列表,而对旧列表的所有读取操作仍然在原有的列表上进行.内部是用过synchronized关键字加锁来实现的,也可以直接使用。

2025-03-16 11:12:30 166

原创 ‌CAP 理论详解

CAP 理论揭示了分布式系统的核心矛盾,指导开发者在设计时根据业务需求(如强一致性 vs 高可用性)进行合理取舍‌12。实际应用中需结合最终一致性、超时重试等机制,在动态环境中平衡 CAP 三要素‌。‌artition Tolerance)三者中,系统最多只能同时满足两项‌12。CAP 理论是分布式系统设计的核心原则,指出在一致性(‌。‌vailability)、分区容错性(‌。‌onsistency)、可用性(‌。

2025-03-15 14:31:11 479

原创 jmap命令详解

jmap(Java Memory Map)是 JDK 自带的工具,用于分析 Java 堆内存的分布和对象信息。以下是jmap。

2025-03-15 14:08:53 421

原创 jstat 命令详解

jstat(JVM Statistics Monitoring Tool)是 JDK 自带的轻量级监控工具,用于实时采集 JVM 内存、GC 事件、类加载等运行状态数据,帮助开发者快速诊断性能瓶颈‌12。值从 70% → 85% → 95% 持续上升,可能存在内存泄漏‌13。显示各内存区域的使用百分比及 GC 事件统计,适合快速查看内存压力。‌:若 Eden 区快速填满(如每秒增加 200MB),可增大。显示各内存区域的具体容量(单位:KB)及使用量。(年轻代大小)降低 GC 频率‌35。

2025-03-15 13:59:35 271

原创 常用JVM调优命令

‌:集成化诊断工具(JDK 7+ 支持),支持查询 JVM 参数、生成堆/线程快照等。‌:列出当前系统中所有 Java 进程的进程 ID 和主类名称。‌:生成 Java 进程的线程快照,用于诊断死锁或线程阻塞问题。‌:实时监控内存、类加载和垃圾回收状态。关键词,查看持有锁的线程堆栈信息。‌:生成堆内存快照和对象分布统计。

2025-03-15 13:22:10 382

原创 场景题 - 现有系统能否扛住压力暴增100倍

优化层面技术方案典型工具/框架流量管控限流熔断、异步队列、服务降级JVM优化堆内存调优、G1/ZGC算法、内存泄漏分析Arthas/JVM参数调优MySQL优化分库分表、索引优化、InnoDB参数调整缓存多级缓存(本地+分布式)通过以上综合优化,系统可逐步实现从单机到分布式、从同步到异步的改造,支撑百万级并发场景‌。

2025-03-15 11:59:01 322

原创 记录工作中优惠券系统设计

优惠券系统设计

2025-03-14 15:03:50 154

原创 并发编程学习大纲

并发编程大纲

2025-03-14 14:00:19 404

原创 JVM学习大纲记录

jvm大纲

2025-03-14 13:54:54 332

原创 项目中常用的SQL优化

这样的语句,普通索引是无法满足查询需求的。如果连接方式是inner join,在没有其他过滤条件的情况下MySQL会自动选择小表作为驱动表,但是left join在驱动表的选择上遵循的是左边驱动右边的原则,即left join左边的表名为驱动表。区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询。优化的方法如下:可以取前一页的最大行数的id,然后根据这个最大的id来限制下一页的起点。type列,连接类型。

2025-03-13 15:57:57 959

原创 网络系统之零拷贝

1.DMA技术。

2025-03-13 15:52:58 765

原创 jvm垃圾回收过程

新生代:主要采用复制算法,回收速度快,频率高,适合生命周期短的对象。老年代:主要采用标记-整理算法,回收速度相对较慢,频率低,适合生命周期长的对象。不同的垃圾回收器(如Serial、Parallel、CMS、G1等)在实现上述算法时会有一些差异,可以根据具体的应用场景选择合适的垃圾回收器。

2025-03-13 15:22:36 286

原创 垃圾回收器种类

此外,还有一些特定于新生代或老年代的收集器,如ParNew(适用于新生代,与Parallel Scavenge类似但实现有所不同,常用于需要CMS配合的场景)、●优点:注重吞吐量(即减少GC总时间),适用于后台处理任务和注重吞吐量的应用‌。○‌特点‌:支持 TB 级内存,STW 时间极短(<10ms),并发处理‌。●使用标记-复制算法(新生代)和标记-整理算法(老年代)‌。○‌适用场景‌:超大内存、超低延迟场景(如金融交易系统)‌。●并行、并发和分布式的垃圾收集器,适用于大型应用程序‌。

2025-03-13 15:02:02 245

原创 垃圾收集器应该如何选择

如果优先考虑应用程序的峰值性能,并且没有时间要求,或者可以接受 1 秒或更长的停顿时间,可以选择 Parallel 收集器。如果应用程序只需要一个很小的内存空间(大约 100 MB),或者对停顿时间没有特殊的要求,可以选择 Serial 收集器。如果响应时间比吞吐量优先级高,或者垃圾收集暂停必须保持在大约 1 秒以内,可以选择 CMS/ G1 收集器。如果响应时间是高优先级的,或者堆空间比较大,可以选择 ZGC 收集器。

2025-03-13 14:52:53 66

原创 JVM配置参数解析

【代码】JVM配置参数解析。

2025-03-13 14:43:11 192

原创 JVM可视化监控工具

Java Mission Control:JMC 最初是 JRockit VM 中的诊断工具,但在 Oracle JDK7 Update 40 以后,就绑定到了 HotSpot VM 中。VisualVM:一个基于 NetBeans 的可视化工具,在很长一段时间内,VisualVM 都是 Oracle 官方主推的故障处理工具。集成了多个 JDK 命令行工具的功能,非常友好。JConsole:JDK 自带的监控工具,可以用来监视 Java 应用程序的运行状态,包括内存使用、线程状态、类加载、GC 等。

2025-03-13 14:41:12 169

原创 分布式幂等性方案

直接在数据库上加锁的做法性能不够友好,可以使用分布式锁的方式,目前最流行的分布式锁实现是通过 Redis,具体实现一般都是使用 Redission 框架。请求接口之前,需要先获取一个唯一的 token,再带着这个 token 去完成业务操作,服务端根据这个 token 是否存在,来判断是否是重复的请求。更新逻辑,比如更新用户账户余额,可以加悲观锁,把对应用户的哪一行数据锁住。加唯一索引是个非常简单但很有效的办法,如果重复插入数据的话,就会抛出异常,为了保证幂等性,一般需要捕获这个异常。

2025-03-13 14:37:00 152

原创 分布式一致性Paxos算法

不违背以前作出的承诺的前提下,回复已经通过的提案中提案号最大的那个提案所设定的值和提案号 Mmax,如果这个值从来没有被任何提案设定过,则返回空值。Multi Paxos 算法思想,简单说就是在多个提议者的情况下,选出一个 Leader(领导者),由领导者作为唯一的提议者,这样就可以解决提议者冲突的问题。前面描述的可以称之为 Basic Paxos 算法,在单提议者的前提下是没有问题的,但是假如有多个提议者互不相让,那么就可能导致整个提议的过程进入了死循环。的一致性算法,目前公认的解决。

2025-03-13 14:31:15 815

原创 线上CPU100%及应用OOM的排查和解决过程

3.导出的堆快照信息可以看到哪里导致的OOM。2.使用命令导出pid进程相关的堆栈信息。1.检查服务器资源占用状况 命令top。

2025-03-13 14:21:24 95

原创 java设计模式之观察者模式

/ 3.如果观察者依赖于主题的状态并且主题以意外的方式更改,则观察者可能处于不一致的状态。// 1.对象之间的松耦合,使得可以轻松添加或删除观察者,而不影响主题或其他观察者。// 2.支持开放/封闭原则,允许添加新的观察者而不修改主题。// 1.主题可能发送对某些观察者不相关的通知,导致资源浪费。// 2.通知观察者的顺序可能很重要,但该模式不支持此功能。// 观察者模式允许对象在另一个对象的状态更改时得到通知。// 3.支持单一职责原则,将主题和观察者的关注点分离。

2023-04-18 11:38:22 126

原创 java设计模式之责任链模式

1.降低耦合度,将请求的发送者和接收者解耦;2.简化了对象,使得对象不需要知道链的结构;3.增强了系统的可扩展性,可以增加新的请求处理类;4.增加新的请求处理类很方便,无需修改原有代码;5.灵活性增强,可以根据需要自由组合链和具体处理类;6.可以对请求的处理顺序进行灵活的控制。:1.不能保证每个请求一定被处理;2.对于比较长的责任链,请求的处理可能涉及多个处理对象,系统性能将受到一定影响;3.责任链建立的合理性要靠客户端来保证,增加了客户端的复杂性;4.可能会造成循环调用,导致系统陷入死循环。

2023-04-18 11:29:18 145

原创 java设计模式之适配器模式

缺点:对于Java、C#等不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为抽象类,不能为具体类,其使用有一定的局限性,不能将一个适配者类和它的子类都适配到目标接口。优点:可以适配多个不同的适配者和适配目标,且适配者和适配目标之间无需继承或者实现特定的接口。同时,由于适配器和适配者之间是关联关系,所以如果适配者的接口发生改变,适配器也需要做相应的修改。优点:可以适配多个不同的适配者和适配目标,且适配者和适配目标之间无需继承或者实现特定的接口。

2023-04-18 11:22:25 153

原创 java设计模式之五种单例模式

3.双重校验锁单例模式。4.静态内部类单例模式。

2023-04-18 11:14:32 104

原创 设计模式之建造者+策略模式

2. 建造者模式将对象的创建过程与对象本身分离开来,可以使用相同的创建过程来得到不同的产品对象,也可以通过相同的产品建造过程得到不同的产品,方便扩展。* 1. 建造者模式将复杂产品的创建过程封装起来,使得用户只需要知道所需建造者的类型即可,无须关心产品对象的具体创建过程,大大降低了系统的耦合度。* 2. 策略模式将算法的使用与算法的实现分离开来,使得算法的使用方便修改和替换,也方便单元测试。* 3. 建造者模式通过组合不同的建造者和不同的零件,可以创建出更加复杂功能的产品对象。

2023-04-18 11:07:33 211

原创 java设计模式之工厂模式

/ 3. 工厂模式可以帮助我们遵循开放封闭原则,因为我们可以通过添加新的工厂方法来创建新的对象类型,而不需要修改现有的代码。// 2. 工厂模式可以帮助我们隐藏对象的创建细节,因为客户端只需要知道如何使用工厂方法来创建对象即可。// 1. 工厂模式可以帮助我们在创建对象时更加灵活,因为我们可以通过工厂方法来创建不同类型的对象。// 在工厂模式中,我们创建对象而不是直接实例化对象,这样可以帮助我们在创建对象时更加灵活。// 下面是一个简单的工厂模式示例,其中我们使用工厂方法来创建不同类型的汽车对象。

2023-04-18 11:02:53 103

原创 java常用的设计模式

职责链模式:将请求的发送者和接收者解耦,使得多个对象都有机会处理这个请求。* 适配器模式:将一个类的接口转换成客户希望的另一个接口。* 观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。* 工作中最常用的设计模式有:单例模式、工厂模式、适配器模式、装饰器模式、观察者模式、策略模式、职责链模式。* 工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。* 单例模式:确保一个类只有一个实例,并提供全局访问点。

2023-04-18 10:59:49 143 1

原创 volatile到底如何保证可见性和禁止指令重排序的

摘自《深入理解Java虚拟机》“观察加入volatile关键字和没有加入volatile关键字时所生成的汇编代码发现,加入volatile关键字时,会多出一个lock前缀指令”  lock前缀指令实际上相当于一个内存屏障(也成内存栅栏),内存屏障会提供3个功能:  1)它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成;  2)它会强制将对缓存的修改操作立即写入主存;  3)如果是写操

2022-03-09 16:11:45 294

空空如也

空空如也

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

TA关注的人

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