自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 用户态与内核态:计算机系统的“权力的游戏”

《计算机特权等级的硬件法则》揭示了现代计算机系统严格的权限隔离机制。CPU通过硬件级设计将系统划分为特权态(Ring0)和用户态(Ring3),前者拥有至高权限,后者受限执行普通指令。这种隔离由CS寄存器的身份标记和MMU内存管理单元共同保障,任何越权操作都会触发异常终止。用户程序必须通过系统调用(SYSCALL)这一唯一通道请求内核服务,经历完整的提权、执行和返回流程。该机制确保所有Ring3程序(包括root权限进程)都必须遵守硬件强制实施的权限规则,恶意代码无法直接访问内核资源,构建了计算机系统最基础

2025-12-23 23:14:55 305

原创 CPU RAM(内存) 是什么?一篇文章搞定入门!

本文详细解析了CPU执行程序和操作系统管理内存的核心机制。CPU通过程序计数器依次读取指令,经控制单元解析后交由运算单元或内存执行,形成指令周期循环。现代Linux系统启动经历UEFI、GRUB到内核加载的接力过程,程序执行采用ELF格式和内存映射技术。内存管理方面,操作系统通过虚拟内存实现进程隔离,采用分页机制解决碎片问题,配合多级页表和TLB缓存优化性能。Linux采用扁平模型弱化分段机制,构建了高效安全的内存管理体系。

2025-12-21 16:29:05 519

原创 jdk1.8 是如何解决死循环问题的?

JDK1.8对HashMap扩容机制进行了重大优化:1)采用尾插法替代头插法,保持链表顺序不变,从根本上避免了环形链表的产生;2)引入本地指针(loHead/loTail和hiHead/hiTail)进行链表分类打包,最后一次性写入新数组,大幅减少共享内存写入次数;3)通过位运算(e.hash&oldCap)快速判断节点新位置,避免重新计算hash值。这些改进显著提升了扩容效率,解决了JDK1.7中存在的并发死循环问题,虽然HashMap仍非线程安全,但扩容过程更加健壮可靠。

2025-12-21 10:44:08 766

原创 jdk1.7 在多线程下扩容可能导致的死循环问题

JDK1.7 HashMap扩容机制分析:采用头插法实现元素迁移,会导致链表顺序反转(如A→B→C变为C→B→A)。设计初衷是热点数据优先访问,但在多线程环境下存在严重问题。当两个线程同时扩容时,可能出现循环引用:线程1挂起时保留旧链表状态(e=A,next=B),线程2完成扩容后链表变为B→A。线程1恢复后继续处理,导致A和B互相指向,形成死循环。这是JDK1.7 HashMap在多线程环境下可能产生死循环的根本原因。

2025-12-17 09:41:37 219

原创 为什么IP层会分片,TCP还要分段?

TCP分段与IP分片的核心区别在于数据包的处理机制。TCP分段时,每个小包都是独立完整的IP包,IP层直接透传给TCP层,TCP负责缓存和排序,丢失部分只需重传缺失包。而IP分片时,所有分片共享同一ID,IP层必须重组完整数据包才能提交给TCP层,若丢失任一分片,已收到的分片也会被丢弃,导致TCP层完全收不到数据。这种差异源于IP层对分片包和独立包的不同处理逻辑:前者必须完整重组,后者可直接透传。因此TCP分段能实现更高效的部分重传机制。

2025-12-11 14:06:21 857

原创 Redission限流器是如何实现限流的?

摘要:Redisson的RRateLimiter采用令牌桶算法实现分布式限流,通过两个Redis键存储令牌数和更新时间戳。核心流程通过Lua脚本原子执行:1)计算当前应补充的令牌数;2)更新桶内令牌数(不超过最大容量);3)判断是否满足请求数量。整个过程模拟水桶模型,以固定速率补充令牌(最大容量为rate),请求时扣除相应数量。脚本保证了操作的原子性,支持阻塞/非阻塞获取令牌,适用于多级限流场景。参数设置后续优化为Duration形式,简化配置。

2025-11-27 09:37:03 193

原创 RabbitMQ之可靠性全面方案

摘要:本文详细介绍了RabbitMQ消息可靠性的完整解决方案,包括生产者确认机制(ConfirmCallback和ReturnCallback)、消息持久化配置、消费者幂等处理以及重试机制。重点展示了"可靠发送"的实现方法,通过消息预存储、异步补偿和定时任务重试确保消息100%不丢失。同时提供了消费者端的本地重试+延迟重试策略,采用双队列设计实现业务逻辑与重试逻辑解耦,并给出完整的队列配置、监听器实现和补偿任务示例。最后还介绍了延迟消息的两种实现方式和MQ高可用部署方案,形成了一套从生产

2025-11-26 00:21:25 903

原创 Java21推出虚拟线程后,传统线程于虚拟线程如何选择?

虚拟线程是Java为解决传统线程并发问题提出的创新方案,它通过轻量级任务对象模拟线程行为,实现高并发与高吞吐。其核心原理是将大量虚拟线程映射到少量OS线程上,当遇到I/O阻塞时自动挂起并释放资源,仅CPU计算时占用OS线程。应用场景明确:I/O密集型任务默认使用虚拟线程(如Executors.newVirtualThreadPerTaskExecutor()),CPU密集型任务需使用有界线程池,混合任务则需隔离CPU计算部分。关键要避免在虚拟线程中直接执行长时间CPU计算,否则会导致系统性能崩溃。这种设计既

2025-11-24 23:21:56 311

原创 一张图搞定 Spring 启动流程

Spring 启动流程图解

2025-11-11 22:10:36 98

原创 从执行流程入手掌握Redis核心知识

Redis采用混合持久化机制:客户端命令先被IO多路复用接收,主线程执行内存操作后触发持久化。在AOF重写时,先生成RDB快照写入新AOF文件头部,期间命令存入重写缓冲区;RDB完成后,缓冲区命令追加到文件末尾。最终用新AOF文件替换旧文件,实现高效的数据持久化。

2025-11-02 22:15:40 125

原创 六种认证与授权方式+面试场景题

本文介绍了六种常见的认证与授权实现方式,包括BasicAuth、Session+Cookie、Token、JWT、SSO和OAuth2.0授权码模式。每种方式都通过Java代码示例展示了工作原理,并分析了其特点和适用场景。文章还针对分布式系统迁移、认证方式切换、微服务间认证等10个典型场景问题,提供了详细的解决方案和面试回答要点。特别强调了在系统演进过程中需要注意的安全问题,如会话共享、token撤销、CSRF防护等,并给出了JWT安全加固的实用建议。这些内容涵盖了现代系统开发中认证授权的核心知识和技术要点

2025-10-13 11:15:27 717

原创 计算机中的「数据」和「存储」

计算机数据存储的核心在于利用物理介质的两种稳定状态表示二进制信息。内存、硬盘和SSD分别通过电容电荷、磁化方向和浮栅电子来存储0和1。数据本质是物理状态与解释规则的结合:硬件状态赋予二进制意义,CPU通过执行指令调度这些数据。存储容量受限于物理单元的稳定性,超限会导致错误。整个计算机系统实质是CPU不断执行指令、调度硬件资源的过程,所有操作最终都依赖于CPU的处理能力。从点击文件到显示内容,每一步都是CPU在驱动硬件完成数据存取和处理。

2025-09-28 22:03:11 643

原创 哈希表简单入门!!

哈希表是一种基于哈希函数实现快速查找的数据结构思想,通过将键映射到数组下标实现O(1)访问。其核心包括哈希函数、桶数组和冲突解决机制。实际应用中可分为数组哈希(适合连续key)、HashSet(去重)和HashMap(键值映射)。JDK8的HashMap采用数组+链表/红黑树结构,优化了哈希扰动函数和链表转红黑树机制,提升性能至平均O(1)。关键特性包括:使用局部变量优化访问、支持null键值、非线程安全,通过扩容和树化保持高效。不同哈希结构适用于不同场景,但都遵循"数组+哈希+冲突处理&quot

2025-09-25 18:02:32 279

原创 一个例子入门 CompletableFuture 多线程优化

本文摘要: 通过一个查询分类标签的代码案例,分析了串行IO操作的性能问题,并提出了使用CompletableFuture进行多线程优化的方案。详细介绍了CompletableFuture的核心用法、常用场景及其相比Thread/Future的优势,将其形象比喻为"网约车"模式。同时梳理了JDK8到JDK21的并发编程演进路线,指出JDK8的CompletableFuture长期是主力方案,而JDK21的虚拟线程和结构化并发提供了更简洁的替代方案。最终建议根据场景选择:复杂异步编排用Com

2025-09-17 10:04:10 982

原创 ❤写给吉吉的 最大子序和 教程❤

本文介绍了使用动态规划求解最大子数组和问题的五步法:1)定义dp数组存储以每个元素结尾的最大子数组和;2)递推公式为dp[i]=max(dp[i-1]+nums[i],nums[i]);3)初始化dp[0]=nums[0];4)从前向后遍历,同时更新全局最大值;5)通过示例推导验证。最终给出JavaScript和Java实现代码,时间复杂度O(n),空间复杂度O(n)。该方法通过动态规划将问题分解为子问题,高效地找到连续子数组的最大和。

2025-09-11 19:22:43 522

原创 为什么需要代理对象?直接把增强逻辑直接放进去不行吗?

摘要:本文介绍了AOP中的核心概念,包括代理对象、织入方式和增强逻辑。重点对比了三种织入方式(编译时、类加载时、运行时)的特点和应用场景,分析了代理对象与直接织入的技术差异。Spring默认采用运行时代理方式,因其具备开发体验好、灵活零侵入、维护性高等优势。文章指出,对于增强逻辑少且性能敏感的场景可考虑直接织入,而业务迭代频繁的场景则更适合代理对象方案,体现了"无侵入增强"的核心思想。

2025-09-10 19:34:00 262

原创 JDK动态代理与CGLIB动态代理区别详解

摘要:JDK动态代理和CGLIB是Java中两种常见的动态代理方式。JDK代理要求目标对象必须实现接口,通过InvocationHandler拦截方法调用并增强;CGLIB则通过生成目标类的子类来代理,使用MethodInterceptor拦截方法并调用父类方法实现增强。主要区别在于JDK代理基于接口实现,CGLIB基于类继承,且JDK不能代理无接口类,CGLIB不能代理final类/方法。性能上CGLIB生成字节码开销较大但调用更快,JDK代理则稍慢。两者本质区别在于调用原始方法的方式不同。

2025-09-09 10:49:46 244

原创 Java初学者:“Serializable接口是啥,为什么要实现它?”

序列化(Serialization):把对象转成字节流,以便网络传输或持久化存储。反序列化(Deserialization):把字节流恢复成对象。→ 告诉 JVM 这个对象可以被序列化/反序列化。→ 控制序列化版本,避免类改动导致反序列化失败。在实际开发中:简单 JSON 交互:可以不写。分布式/缓存/消息/Session:强烈推荐实现并指定。当然,我们也可以自定义序列化器,不走原生JDK默认序列化方式,这也是常见的方式。

2025-09-07 12:13:54 374

原创 为什么高并发下瓶颈常常出在数据库而不是 Controller?

SpringMVC基于Tomcat线程池实现并发处理,控制器方法可被多线程同时调用(默认200线程)。关键点:1)Controller需保持无状态以避免线程安全问题;2)实际瓶颈常在下游资源(如数据库连接池),因数据库操作耗时远超内存计算。解决方案包括调优线程池、异步处理、引入缓存及限流等。本质是Web层并发能力远高于数据库,需通过架构设计保护关键资源。

2025-09-03 10:52:12 528

原创 Spring Boot 项目 Docker 化部署与 CI/CD 自动化全流程指南

本文介绍了三种SpringBoot项目的Dockerfile模板,从简单开发版到生产优化版,并详细对比了它们的优缺点。开发版适合学习和小项目,生产版优化构建速度和镜像体积,轻量级版则适合有CI/CD的场景。文章还讲解了CI/CD的核心概念和实现流程,通过GitLab CI/CD示例展示了从代码提交到自动部署的完整链路。最后,将Dockerfile构建、部署脚本和CI/CD流程串联起来,形成了一个完整的SpringBoot自动化部署方案。

2025-09-01 22:23:14 923

空空如也

空空如也

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

TA关注的人

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