- 博客(42)
- 资源 (4)
- 收藏
- 关注
原创 JVM 调优
JVM 调优并非一蹴而就,需要结合具体业务场景、内存使用模式与 GC 行为进行持续分析与调整。借助工具(如 jvisualvm、jstat、jmap)监控 JVM 状态,结合合理配置垃圾收集器、内存分区策略、JIT 编译行为与同步机制,可以显著提升 Java 应用的性能与可维护性。
2025-05-20 13:39:04
808
原创 JVM 基础知识介绍
Java 虚拟机(JVM)是 Java 技术的核心,实现了 Java 程序的跨平台运行。JVM 主要由类加载子系统、运行时数据区、执行引擎、本地方法接口和本地方法库组成。运行时数据区包括程序计数器、Java 虚拟机栈、本地方法栈、堆和方法区。类加载机制分为加载、验证、准备、解析和初始化五个阶段,采用双亲委派模型。执行引擎通过解释器和即时编译器(JIT)执行字节码。垃圾回收机制通过引用计数法和可达性分析算法管理对象生命周期,常见垃圾收集器包括 Serial、ParNew、Parallel、CMS、G1、ZGC
2025-05-20 13:36:58
836
原创 Redis 数据结构介绍
Redis 是一个高性能的内存数据库,支持多种数据结构以满足不同的存储需求。本文系统介绍了 Redis 的核心数据结构及其实现机制。简单动态字符串(SDS)通过空间预分配和惰性空间释放优化字符串操作;链表适用于列表键等场景,支持快速访问头尾节点;字典(哈希表)采用拉链法解决冲突,并通过渐进式 rehash 优化性能;跳跃表用于有序集合,提供高效的查询和范围操作;整数集合和压缩列表则分别适用于小规模整数和短字符串的存储,节省内存但插入效率较低。Redis 的对象机制通过动态编码和引用计数管理内存,支持多种数据
2025-05-18 18:08:17
888
原创 三层权限模型设计:认证 + RBAC + ABAC 三级权限控制方案
本文介绍了一个适用于现代中大型系统的三层权限模型,旨在满足安全性、灵活性与可维护性需求。该模型包括: 认证层(Authentication):通过账号密码、OAuth2、JWT等技术确认用户身份,控制用户能否访问系统。 RBAC层(Role-Based Access Control):基于用户角色控制功能访问,管理模块、菜单、按钮及接口权限,前端通过角色控制显示,后端通过拦截器或注解实现。 ABAC层(Attribute-Based Access Control):通过用户属性、数据属性及环境属性实现数据级
2025-05-18 16:34:01
610
原创 权限管理模型 - RBAC 介绍
RBAC(基于角色的访问控制)是一种通过将权限分配给角色,再将角色分配给用户来管理资源访问的权限模型。其核心在于将权限与角色绑定,而非直接赋予用户,从而提升权限管理的灵活性和可维护性。RBAC模型包括用户、角色、权限和资源四个基本组成部分,并通过会话动态控制权限激活。根据复杂度,RBAC分为四个层级:RBAC0(基础模型)、RBAC1(角色继承)、RBAC2(权限约束)和RBAC3(完整模型)。RBAC的优势在于权限集中管理、易于扩展、适合大型系统、支持最小权限原则,并能与审计日志结合。相比ACL和ABAC
2025-05-18 12:54:46
424
原创 基于 Spring Cloud 的 Java Web 应用架构设计说明
本文详细介绍了基于 Spring Cloud 的 SaaS 平台应用架构设计,涵盖了系统角色划分、前端访问入口、权限认证、API 网关、微服务群、服务注册与发现、配置中心、数据存储、消息中间件、日志与监控系统、定时任务调度、运营管理平台、开发运维平台、Nginx 网关服务、实时通信和容错机制等多个组件。通过使用 Spring Cloud 生态系统中的各种工具和技术,如 Eureka、Zuul、OAuth2、Hystrix 等,实现了系统的高可用性、高扩展性、易维护性和安全性。此外,结合 MySQL、Redi
2025-05-18 12:00:40
894
原创 基于 Spring Cloud 的 Java Web 应用架构全景介绍
本文详细解析了基于Spring Cloud技术栈的SaaS平台架构,涵盖了系统角色划分、前端访问入口、权限认证与授权、API网关服务、核心业务服务群、服务注册与发现、配置中心、数据存储层、消息中间件、日志与监控系统、定时任务与作业调度、运营管理平台、开发运维平台、Nginx网关服务、通信机制以及服务容错机制等多个方面。该架构采用微服务设计,支持前后端分离、配置集中管理、认证统一化、日志可追踪和系统易扩展,充分满足高并发、高可用的业务需求,展现了现代SaaS平台的典型设计理念。
2025-05-18 11:36:53
757
原创 对于架构设计的一点理解
PAC中,每一个组件都是独立的个体,PAC架构的应用系统就是由这些独立的组件松耦合而成,比如在例一中,控制层的组件事件派发器,这个组件是完全独立的一个组件,我们可以将该组件使用到任何其他的应用程序中,而且如果现有的组件不能满足需求,我们也可以随时将其替换,而对整体不会有任何影响。这是我们首要要解决的问题, 实际上,我们做任何事情的过程,都是遇到问题,解决问题,发现新问题,继续解决这一流程的重复迭代,而问题是永远也解决不完的,但事情总要有结束的时候,因此整个迭代会持续到现有成果达到既定目标为止。
2025-05-18 11:20:21
965
原创 Mysql 索引优化
MySQL 是 Java 开发人员常用的关系型数据库,索引优化是提升查询性能的关键。MySQL 的索引结构主要基于 B+ 树,B+ 树是一种多路平衡查找树,所有数据存储在叶子节点中,非叶子节点仅存储索引键和子节点指针。B+ 树的高度较低,减少了查找路径长度,适合大规模数据的插入、删除和查找操作。在 MySQL 中,B+ 树的每个节点对应一个磁盘页,充分利用磁盘 I/O 效率,减少查询时的磁盘访问次数。 MySQL 提供了多种索引类型,包括聚簇索引、辅助索引、单列索引、多列索引、覆盖索引和前缀索引。聚簇索引(
2025-05-17 18:58:40
554
原创 分布式系统BASE理论
BASE理论是Basically Available(基本可用)、Soft-state(软状态)和Eventually Consistent(最终一致性)的缩写,是对CAP理论中一致性(C)和可用性(A)权衡的实践总结。BASE理论强调在分布式系统中,当发生分区错误时,优先保证系统的可用性,允许数据存在中间状态,并确保最终达到一致性。基本可用通过流量削峰、延迟响应、体验降级和过载保护等方法实现;软状态允许数据在不同节点间同步时存在延时;最终一致性则通过读时修复、写时修复和异步修复等方式,确保数据最终一致。B
2025-05-16 12:46:45
492
原创 分布式系统CAP理论
分布式系统的设计遵循CAP理论,即一致性(Consistency)、可用性(Availability)和分区容错性(Partition Tolerance)。这三个原则是分布式系统必须满足的基本要求。一致性确保所有节点访问的数据是最新的;可用性保证系统能够响应用户请求;分区容错性则确保在节点离线时系统仍能提供服务。然而,CAP理论指出,在发生分区错误时,系统无法同时保证一致性和可用性,必须在两者之间做出选择。例如,Zookeeper在分区错误时优先保证一致性,符合CP原则。因此,设计分布式系统时需根据具体应
2025-05-16 12:45:12
898
原创 分布式事务:Saga 事务模型
Saga 事务模型是一种异步、最终一致性的分布式事务解决方案,适用于业务流程长、参与者包含外部系统或遗留服务的场景。Saga 由一系列本地事务(sub-transaction)组成,每个事务都有对应的补偿操作,用于撤销事务结果。Saga 的执行顺序包括正常执行、回滚和重试,并支持向后恢复(回滚)和向前恢复(重试)两种策略。Saga 不保证 ACID 中的原子性和隔离性,但最终一致性得以实现。Saga 的实现方式主要有事件驱动式和命令驱动式。事件驱动式通过消息队列实现异步通信,具有高性能和松耦合的优点,但维护
2025-05-16 12:42:15
705
原创 分布式事务:MQ 事务模型
MQ事务模型,即可靠消息最终一致性方案,是一种基于消息队列的异步事务模型,用于实现分布式系统中的事务一致性。该模型通过可靠消息服务确保消息的100%成功投递,核心流程包括上游服务投递消息、下游服务接收消息以及确保消息的可靠投递和消费。MQ事务模型依赖于消息中间件的高可用性,并采用降级机制应对MQ集群故障。其优点在于异步事务的高性能,但缺点是仅能保证最终一致性而非强一致性,且高度依赖消息中间件的可用性。
2025-05-16 12:40:26
632
原创 分布式事务:TCC 事务模型
TCC(Try-Confirm-Cancel)事务模型是一种面向服务的分布式事务编程模型,采用两阶段协议来确保数据一致性。其核心思想是通过 Try 阶段检查并预留资源,确保在 Confirm 阶段有资源可用,从而最大程度地保证事务成功。Try 阶段包括一致性检查和资源预留,Confirm 阶段执行具体业务操作,Cancel 阶段则用于回滚操作。TCC 事务模型通过乐观的进程同步机制和失败重试机制来处理并发冲突和节点故障,确保事务的强一致性。其优点包括广泛的适用性和良好的并发性能,但缺点是与业务耦合度高,且性
2025-05-16 12:37:13
451
原创 分布式事务:XA 事务模型
XA事务模型是一种分布式事务的实现规范,定义了事务管理器(TM)和资源管理器(RM)之间的接口。资源管理器负责管理系统资源并实现XA接口,而事务管理器则协调分布式事务。XA事务使用两阶段或三阶段提交协议,存在同步阻塞、单点故障、数据不一致和无法保证事务完整性等局限性。此外,XA事务主要依赖关系型数据库,限制了其应用场景,且并发性能较差。在Java中,XA事务通过JTA实现,通常用于关系型数据库的分库分表操作。
2025-05-16 12:35:45
311
原创 Hystrix 是如何工作的(Hystrix设计原理)
Hystrix 是一个用于处理分布式系统中服务依赖的库,通过断路器模式防止系统级联故障。其核心流程包括:构造 HystrixCommand 或 HystrixObservableCommand 对象,执行命令,判断响应是否缓存,检查断路器状态,评估资源可用性,执行具体命令操作,计算电路健康值,执行回退动作,并最终返回响应。断路器机制通过监控请求量和错误率,决定是否打开或关闭电路,以防止系统过载。Hystrix 提供了多种执行命令的方式,包括同步、异步和响应式,并支持自定义回退逻辑以应对服务失败。
2025-05-16 12:33:50
542
原创 Spring Security Architecture(Spring安全框架的体系结构)
本文介绍了Spring安全框架的基本概念和核心功能,重点讲解了认证(Authentication)和访问控制(Access Control)的实现机制。Spring安全框架通过AuthenticationManager接口处理用户身份验证,并使用ProviderManager管理多个认证提供者(AuthenticationProvider),支持多种认证机制。文章还展示了如何通过AuthenticationManagerBuilder配置全局或局部的认证管理器,支持内存、JDBC或LDAP等方式获取用户信息
2025-05-16 12:23:27
924
原创 Spring AOP 实现原理
面向方面编程(AOP)是一种编程范式,旨在通过将公共行为抽象出来,实现代码的复用和减少重复代码。AOP与面向对象编程(OOP)的继承不同,它关注的是横向的公共行为。Spring AOP通过代理模式实现公共行为代码和业务代码的无侵入式整合,主要采用动态代理技术,如JDK动态代理和CGLIB。Spring AOP的核心组件是AnnotationAwareAspectJAutoProxyCreator,它作为后置处理器,在Bean创建后判断是否需要增强,并生成代理对象。Spring AOP广泛应用于声明式事务管理
2025-05-16 12:17:18
655
原创 Spring IOC 实现原理
软件系统中的组件耦合问题是一个常见的挑战,通常通过消息传递机制或控制反转机制来解决。本文聚焦于Java平台中基于控制反转机制的解耦合技术,特别是Spring的IOC容器。IOC(Inversion of Control)控制反转原则通过将组件的生命周期管理权交还给组件自身,减少依赖组件的变化对上游组件的影响。Spring IOC容器结合依赖注入、工厂模式和组件定位器模式,利用元数据配置、反射机制、代理模式等技术实现组件的生命周期管理、自动装配和定位。Spring IOC通过三级缓存体系和代理模式解决循环依赖
2025-05-16 12:11:15
416
原创 SpringBoot应用启动过程
Spring Boot 是一个用于快速创建 Spring 应用的微服务框架,其核心启动引导器是 SpringApplication 类。每个 SpringApplication 实例代表一个 Spring 应用的启动类,负责应用的创建、启动和停止。Spring Boot 提供了工程创建、开发和运行环境的支持,其应用服务的抽象包括以下几个关键元素: SpringApplication:启动引导器,负责构建运行环境和上下文,并自动装配应用组件,核心是自动配置。 ConfigurableEnvironment:应
2025-05-15 17:17:50
591
原创 Java并发编程:synchronized机制
是Java中最基本的一种同步机制,是Monitor机制(监视器机制或管程机制)在JVM中的实现,使用时关联的Java对象被称为监视器对象, 而被保护的代码被称为同步代码块(或者临界代码区),同一时刻只能有一个线程执行同步代码块,原子性:被保护的代码块的执行式原子的;可见性:在同步代码块中被修改的共享变量会在锁释放之前刷新到主存当中,保证资源变量的可见性;有序性:Java允许编译器和处理器对指令进行重排序,但是指令重排并不会影响单线程的顺序,它影响的是多线程并发执行的顺序性,但是被。
2025-05-15 17:13:21
733
原创 Java并发编程:CAS操作
CAS(Compare-and-Swap)是一种原子操作,用于在多线程环境中实现无锁同步。它通过比较内存地址的当前值与预期值,如果匹配则更新为新值,否则不执行操作。CAS的优势在于减少锁的使用,提升并发性能,但其局限性包括只能操作单一内存地址、设计复杂、可能引发ABA问题。ABA问题发生在变量值经历A->B->A变化时,导致冲突检查失效。为解决ABA问题,可以使用带有版本戳的原子引用类,如AtomicStampedReference,但这会增加存储和性能开销。
2025-05-15 17:11:43
734
原创 Java引用类型
JVM的垃圾收集机制通过可达性分析算法判断对象是否存活,主要依据对象与GC Roots的引用链。Java引入了四种引用类型:强引用、软引用、弱引用和虚引用,以提供更灵活的内存管理。强引用对象不会被GC回收,而软引用和弱引用对象在内存不足时会被回收,虚引用对象则在下一次GC时被回收。这些引用类型通过java.lang.ref.Reference<T>及其子类实现,与GC协同工作,确保内存的高效使用。引用实例在JVM中有四种状态(Active、Pending、Inactive、Enqueued),状
2025-05-15 17:09:26
681
原创 Java并发编程:锁机制
在多线程编程中,数据竞争和临界区是核心问题。数据竞争发生在多个线程并发访问同一内存地址且至少有一个线程尝试写入时,导致数据不一致。避免数据竞争的方法包括使用同步机制、将共享变量变为线程私有或改变变量可视范围。临界区是线程需要互斥访问的代码区域,确保同一时刻只有一个线程执行。锁机制是实现临界区的基本同步机制,分为加锁机制、等待机制和排队机制。加锁机制可以通过系统互斥量或私有信号量配合CAS算法实现,前者适用于竞争激烈的场景,后者适用于竞争不激烈或临界区执行快的场景。同步机制分为阻塞式和非阻塞式,前者将竞争失败
2025-05-15 17:04:42
882
原创 Java集合详解:LinkedBlockingQueue
LinkedBlockingQueue 是 Java 中一种线程安全的有界阻塞队列,采用 FIFO(先进先出)原则。它通过双锁机制(入队锁和出队锁)实现高效并发操作,避免生产者与消费者之间的锁竞争。队列满时,生产者线程挂起等待;队列空时,消费者线程挂起等待。LinkedBlockingQueue 改进了传统双锁队列的两个主要问题:频繁唤醒导致的性能损失和 Java 平台下的 GC 问题。通过按需唤醒机制,减少不必要的线程唤醒,并通过打断出队节点的引用链,帮助 GC 回收内存。其核心实现包括入队(put)和出
2025-05-15 15:50:56
872
原创 Java集合详解:ConcurrentLinkedQueue
ConcurrentLinkedQueue 是 Java 中一种基于无锁算法实现的并发 FIFO 队列,采用改进的 M&S 队列算法,优化了 CAS 冲突和 GC 问题。其核心特点包括: 无锁设计:通过 CAS 操作实现并发安全,减少锁竞争。 滞后指针优化:允许 head 和 tail 指针滞后,减少 CAS 操作频率,降低冲突。 GC 优化:在更新 head 指针时,断开已出队节点的引用链,避免内存泄漏和跨代链接问题。 弱一致性:迭代操作基于队列快照,size() 方法时间复杂度为 O(n),且在
2025-05-15 15:45:46
1021
原创 Java集合详解:ConcurrentSkipListMap
ConcurrentSkipListMap 是 Java 并发包中的一种高并发、有序映射表实现,基于跳表(SkipList)数据结构。它通过键的大小进行排序,支持多线程环境下的安全操作,如插入、删除、更新和读取,平均时间复杂度为 O(log n)。ConcurrentSkipListMap 的遍历操作是弱一致性的,迭代器返回的是键值对的不可变快照。size() 方法在并发环境下不精确,批量操作如 putAll 也不保证原子性。此外,ConcurrentSkipListMap 不允许使用空键或空值。跳表通过多
2025-05-15 15:41:43
876
原创 Java集合详解:ConcurrentHashMap
ConcurrentHashMap 是 Java 中一种高效的并发哈希映射表,支持高并发的检索和更新操作。其核心设计包括高效的哈希函数、链地址法处理哈希冲突、动态扩容机制以及多种并发控制机制。哈希函数通过扰动函数减少冲突,并使用位运算快速计算哈希地址。冲突处理采用链表和红黑树结合的方式,当链表长度超过阈值时转换为红黑树以提高查找效率。动态扩容机制通过并发操作维持装填因子,确保查询性能。在并发控制方面,ConcurrentHashMap 针对不同数据结构(数组、链表、红黑树)采用了不同的同步策略,如 CAS、
2025-05-15 15:32:51
764
原创 Java集合详解:TreeMap
java.util.TreeMap 是基于红黑树实现的有序映射表,支持高效的插入、删除和查找操作,时间复杂度为 O(log n)。TreeMap 通过红黑树维护键值对的有序性,要求键必须是可比较的,可以通过实现 Comparable 接口或提供自定义比较器来实现。TreeMap 的核心成员变量包括 root(红黑树的根节点)、size(节点数量)和 modCount(结构修改次数)。TreeMap 通过中序遍历红黑树实现有序迭代,successor 方法用于查找给定节点的后继节点,确保迭代顺序的正确性。Tr
2025-05-15 15:19:03
916
原创 Java集合详解:CopyOnWriteArrayList
java.util.concurrent.CopyOnWriteArrayList 是一种采用写时复制技术(COW)实现的线程安全顺序表,适用于并发环境中。其核心思想是在写入时复制原数组的副本,并在副本上进行修改,最后将引用指向新副本,从而保证读操作的高效性和线程安全性。通过读写分离技术,CopyOnWriteArrayList 允许多个线程同时进行读操作,而写操作则通过互斥锁保证线程安全。这种设计在遍历操作远多于写入操作的场景中表现尤为高效。CopyOnWriteArrayList 的迭代器基于快照,因此
2025-05-15 15:17:00
912
原创 Java集合详解:WeakHashMap
是一种使用弱项(WeakEntry)的哈希映射表,本质上是一种特殊的HashMap,其关于哈希表部分的实现与HashMap没有什么不同,而弱项就是使用弱引用实例作为Map的表项(表元素)。
2025-05-15 15:11:01
884
原创 Java集合详解:LinkedHashMap
就是带链表的HashMap;每一种数据结构都有其优势,同时也有其劣势,这使得不同的数据结构适用于不同的应用场景,但在实际应用中,有很多复杂和动态的应用场景通常需要采用不同的数据结构来处理,这个时候就需要组合不同的数据结构来满足特定应用场景的需求,就是一种组合数据结构的实现,它组合了链表和哈希表,不仅仅具有哈希表快速的随机存取能力,同时又保持了元素的插入或者访问顺序,可以通过链表对元素按照其插入或访问顺序进行快速的遍历。组合了双向链表和哈希表,关于哈希表和HashMap可看这篇。
2025-05-15 15:08:00
912
原创 Java集合详解:HashMap
HashMap 是一种基于哈希表实现的键值对存储结构,通过哈希函数将键映射到数组下标,实现高效查找。哈希表的核心思想是通过特征值与存储位置建立直接关系,减少查找时的比较次数。实现哈希表需考虑哈希函数构造、冲突处理和装填因子调整。HashMap 使用扰动函数处理 hashCode,采用链地址法解决冲突,并在链表过长时转换为红黑树以提高效率。默认装填因子为0.75,动态扩容机制保证查找效率与空间利用率。使用 HashMap 时需注意 hashCode 的均匀分布,避免频繁扩容。HashSet 基于 HashMa
2025-05-15 15:03:39
735
原创 Java集合详解:ArrayList & LinkedList
ArrayList 和 LinkedList 是 Java 中 List 接口的两个常用实现。ArrayList 基于动态数组,支持快速随机访问,但插入和删除操作可能涉及数组元素的移动,时间复杂度为 O(n)。其扩容机制通过增加原数组容量的一半来实现,频繁扩容可能影响性能。LinkedList 基于双向链表,插入和删除操作在头部和尾部的时间复杂度为 O(1),但随机访问需要遍历链表,时间复杂度为 O(n)。两者均非线程安全,在多线程环境下可能引发 ConcurrentModificationExceptio
2025-05-15 14:58:57
812
原创 领域驱动开发(DDD)架构如何落地
对于一个软件系统,是否适合采用领域驱动的方式来进行设计,首先需要系统的整体需求是可以分区的,也就是说整体需求可以通过内部的业务或者功能边界,分成一个个独立的业务单元,这些业务单元内部是高内聚的,对外基本互不干扰,可以独立开发或者运行。有的软件系统具有非常清晰的内部业务边界,可以很轻松的划分出对应的分区,这种软件系统天然适合进行领域驱动设计开发,比如物联网应用系统,物联网系统接入的每一种设备就是一个独立的领域,业务边界非常清晰。模型实现就是实现模型的功能,模型转化成为能够对外输出能力的程序模块;
2025-04-17 23:14:55
445
原创 MinGW64编译OpenCV踩坑
打开CmakeGUI,编译器手动选择一下,不要使用默认选项,C编译器选择gcc.exe,C++编译器选择g++.exe,都在MinGW64的bin目录下面,如果使用默认选项,C++编译器会默认使用c++.exe,会导致编译报错,导致 Undefined reference to _Unwind_Resume and __gxx_personality_v0 这个错误,这个错误是因为c编译器和c++编译器不兼容导致的,gcc一定要配合g++
2023-12-26 11:21:40
305
1
原创 java中finally与return的执行顺序详解
一些准备知识: 首先为了说明白java中finally与return的执行顺序是怎样的这个问题,我们需要做一点准备工作。 java方法是在栈幀中执行,栈幀是线程私有栈的单位,执行方法的线程会为每一个方法分配一小块栈空间来作为该方法执行时的内存空间,栈幀分为三个区域: 1. 操作数栈,用来保存正在执行的表达式中的操作数,数据结构中学习过基于栈的多项式求值算法,操作数栈的
2015-05-12 21:16:16
10290
原创 Java Appeandable接口与字符串格式化
本文包含如下内容:java.lang.Appendable接口的用途,java.util.Formatter类的用途,java.lang.Appendable与java.util.Formatter类的关系,java.util.Formatter类进行字符串格式化的规则以及示例
2015-03-23 11:19:48
663
原创 Java String 字符编码原理,可以帮助理解乱码问题
在java中,字符的数据类型是char. char类型的编码是Unicode编码,因此每一个char类型数据2字节16位,对应在内存中的数据就是字符的Unicode的码值 而String类型的底层是一个char数组,因此String类型在内存中的存储形式是一系列字符对应的Unicode码值例如中文“长风几万里” 下表1是这5个中文字分别对应的GBK,Unicode,和UTF-8编码 表
2015-02-28 14:57:24
1873
算法导论中文版高清pdf版.rar
2016-03-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人