- 博客(74)
- 资源 (3)
- 收藏
- 关注

原创 细说Java 引用(强、软、弱、虚)和 GC 流程(一)
JDK1.2中引入了ReferenceWeakCacheFinalizerfinalize()前面三种引用我们编码时可以使用,也是我们所熟知的和是由 JVM 使用的,下面图片显示了类修饰符并非public。除此而外,平常编程使用new创建的对象均为。
2025-02-19 14:48:47
933

原创 Linux之【文件系统】前世今生(一)
extfs,即Linux扩展文件系统,Ext2就代表第二代文件扩展系统,Ext3/Ext4以此类推,它们都是Ext2的升级版,只不过为了快速恢复文件系统,减少一致性检查的时间,增加了日志功能,所以Ext2被称为索引文件系统。
2025-01-17 21:24:16
1408

原创 深入理解计算机中的补码、反码、原码
为了使用加法替代加法,我们先后引入了补数、模、原码、补码、反码圆盘代表数字是有范围的,该范围的大小即为模,并且会首尾相连。计算机1 Byte、4Byte、8Byte天然会限定数据的范围。数据范围限定后,数据一直累计下去一定会产生数据溢出(即进位丢失),从而结束当前轮回,开始下一轮回;圆盘内的数字是原码,圆盘外的数字是补码,补码也是模内的无符号整数。注意,反码 + 1只是求得补码的一种方式,并非补码的定义;原码为0和正数时,原码等于反码等于补码;原码为负数时,反码为原码数据位按位取反。
2025-01-03 22:20:47
1402
原创 Java对象的内存分布(二)
本文深入探讨了Java对象的内存分布细节,重点介绍了Java对象实例的内存布局、对象头和Klass指针的结构。文章详细解析了32位和64位机器下对象头的MarkWord布局,包括HashCode、GC年龄和锁标识等信息。同时,文章还涉及指针压缩、Klass指针的详细解释,如Java引用的大小、HashCode、垃圾收集器及内置锁synchronized的实现等。通过这些内容,读者可以更全面地理解Java对象在内存中的存储方式和相关机制。
2025-05-11 17:24:04
303
原创 JAVA 锁—— synchronized
偏向锁适用于只有一个线程加锁且没有竞争的情况。偏向锁在JDK 6到15中默认开启,但从JDK 15开始默认关闭,JDK 18中彻底移除。偏向锁不会释放,解锁后markWord保持不变。
2025-05-11 12:01:01
583
原创 MYSQL 快速解析
mysql 页大小默认为16KB,linux操作系统页大小为默认4KB,所以 mysql 页刷盘需要4次才可以完成。问题来了:这4次刷盘必须为原子操作,使用DWB可以保证原子性。DWB 是磁盘文件,采用连续存储,顺序写,故而性能很高。
2025-05-08 14:26:18
875
原创 Redis ZSet 实现原理与跳表选择原因
Redis 的 ZSet 通过 压缩列表和 跳表+哈希表的混合结构,在内存效率与操作性能之间取得平衡。跳表因其 实现简单、范围查询高效、动态扩展性强的特点,成为 ZSet 的核心数据结构,尤其适合需要高频范围操作和高并发的场景。
2025-05-05 11:44:24
904
原创 RR(Repeatable Read)级别如何防止幻读
在 MySQL 数据库事务隔离级别中,RR(可重复读) 通过 MVCC(多版本并发控制)和锁机制的组合策略来避免幻读问题。
2025-05-04 20:00:53
691
原创 HTTP 快速解析
HTTP请求和响应报文由以下部分组成(以请求报文为例):HostAccept响应报文结构:状态行(含状态码)、响应头、空行、响应主体。
2025-04-30 11:53:48
1312
原创 ArrayBlockingQueue VS LinkedBlockingQueue
LBQ 的链表结构天然适合双锁:数据独立性:链表的入队(尾部追加)和出队(头部移除)操作无共享内存冲突,双锁可完全隔离读写竞争。动态节点分配:链表节点的动态创建和销毁允许更灵活的内存管理,而数组的固定内存分配限制了并发优化空间。
2025-04-28 15:34:20
720
原创 HTTPS实现安全的关键方法及技术细节
HTTPS的安全性依赖于证书验证、加密算法组合、协议设计及配置优化的协同作用。实际部署中需定期更新证书、禁用弱加密算法,并结合HSTS、OCSP Stapling等技术增强防护。同时,需关注协议演进(如TLS 1.3)和新型攻击手段(如量子计算威胁),持续优化安全策略。
2025-04-14 16:02:03
855
原创 分布式锁和事务注解结合使用
事务注解与分布式锁的协同实现了 本地事务原子性 与 全局资源协调 的双重保障。在云原生架构下,推荐采用 Redisson注解化锁 + Seata事务 的组合方案,既能通过声明式编程降低开发复杂度,又能支撑百万级 QPS 的分布式场景。关键是通过合理的锁粒度控制和监控体系,在一致性、性能、复杂度之间取得平衡。
2025-04-11 18:31:33
875
原创 redis cluster 的通信机制
Redis Cluster 通过 Gossip 协议 实现去中心化通信,结合Cluster Bus 高效传输元数据,保障了高可用与动态扩展能力。客户端通过智能路由与重定向机制直接与集群交互,无需代理层,兼顾性能与灵活性。理解其通信机制是优化集群稳定性与性能的关键。
2025-04-11 18:19:11
552
原创 分布式锁 + 本地事务 VS 分布式事务
分布式锁与本地事务的组合可在最终一致性允许的场景中替代传统分布式事务,降低复杂性和提升性能。但在跨多库写入、资金操作等强一致性要求场景,仍需采用标准的分布式事务框架(如Seata)或TCC模式。主流架构建议将两种方案结合使用,通过服务网格(Service Mesh)实现自动化的方案切换与流量控制。
2025-04-08 09:18:34
1025
原创 Redis 大 Key 的核心影响与场景分析
大 Key 是 Redis 性能的 “隐形杀手”,其影响贯穿内存、网络、持久化及集群架构。通过定期扫描、业务设计规避和合理拆分,可有效降低风险。在极端场景下(如电商秒杀),建议结合本地缓存(如 Caffeine)与 Redis 分层存储,进一步提升系统鲁棒性。
2025-04-08 09:01:33
833
原创 Redis 数据结构解析
Redis 的 数据类型(对象) 与 底层数据结构 是解耦的,同一数据类型在不同场景下可能采用不同的底层结构。例如,List 类型在元素较少时使用压缩列表(ZipList),元素较多时则切换为双向链表或 QuickList。
2025-04-07 11:40:24
887
原创 Redis 与 Java HashMap 扩容负载因子差异解析
Redis 的负载因子设计不同于 Java HashMap,核心原因是其渐进式扩容机制和内存敏感性。动态调整策略使其在高并发、持久化场景下更高效,而 Java 的固定 0.75 则是通用场景下的最优实验值。两者设计目标不同,无需强求一致。
2025-04-07 11:28:10
914
原创 Redis 哈希槽(Hash Slot)与一致性哈希环(Consistent Hashing)核心对比
一致性哈希环:适合动态性强、节点频繁变动的场景(如缓存层),通过虚拟节点降低数据迁移成本。哈希槽:适合强调数据强一致性与集群管理的场景,通过槽位分片实现高效扩缩容。
2025-04-03 14:56:15
1182
原创 Spring 中使用代理的注解及机制分析
代理触发条件:需确保目标类被 Spring 管理(如 @Component 扫描或手动注册)。同类调用问题:通过 AopContext.currentProxy() 或重构代码解决。代理类型选择:优先 JDK 动态代理(接口实现),强制 CGLIB 需配置 proxyTargetClass=true。
2025-03-17 11:08:22
1563
原创 Spring 扩展点总结与分析
明确阶段:根据业务需求选择最靠近目标阶段的扩展点(如修改 Bean 定义用 BeanFactoryPostProcessor 而非 BeanPostProcessor)。避免副作用:确保扩展逻辑不影响 Spring 原生生命周期(如 BeanPostProcessor 中避免过早初始化其他 Bean)。性能优先:高频扩展点(如 BeanPostProcessor)应减少阻塞操作,必要时采用懒加载或异步处理。兼容性:自定义扩展需考虑 Spring 版本差异(如 ApplicationContextIni
2025-03-16 17:28:45
1046
原创 spring 创建单例 Bean 源码分析
Spring Boot 2.6+ 默认禁止循环依赖以提升代码质量,开发者应优先通过设计消除依赖闭环。若需临时兼容,可通过配置文件或代码显式开启,但需明确此操作仅为过渡方案。
2025-03-15 16:26:05
1030
原创 Java 中 getCanonicalName、getSimpleName、getName、getTypeName 的区别
getName() 关注 JVM 内部表示,getTypeName() 提供开发者友好的类型名(尤其对数组)。getCanonicalName() 严格遵循 Java 语言规范,适合生成代码或文档。getSimpleName() 用于简洁显示类名,忽略包和内部符号。
2025-03-14 20:36:46
627
原创 Spring 中 SmartInitializingSingleton 的作用和示例
SmartInitializingSingleton 是 Spring 中用于 全局单例初始化后置处理 的关键接口,适用于依赖全量 Bean 就绪的场景。其设计弥补了 InitializingBean 在全局性、顺序控制上的不足,是框架扩展与业务初始化的高效工具。
2025-03-14 19:49:49
867
原创 Spring 中 BeanPostProcessor 的作用和示例
Spring Boot 通过内置的 BeanPostProcessor 实现了丰富的企业级功能(如 AOP、事务、异步等),开发者也可通过自定义扩展灵活控制 Bean 生命周期。理解每个处理器的作用与执行时机,是优化 Spring Boot 应用架构的关键。
2025-03-14 17:29:32
918
原创 Spring 中 BeanFactoryPostProcessor 的作用和示例
BeanFactoryPostProcessor 是 Spring 容器级别的扩展接口,在 Bean 实例化之前,对 Bean 的配置元数据(即 BeanDefinition)进行动态修改或扩展。其核心功能围绕以下两点:修改现有 Bean 的定义(如属性值、作用域、初始化方法等)。添加新的 Bean 定义(需通过子接口 BeanDefinitionRegistryPostProcessor)。
2025-03-14 16:15:09
1088
原创 Spring Boot 中 BootstrapRegistryInitializer 的作用与示例
BootstrapRegistryInitializer 为 Spring Boot 提供了启动初期扩展能力,适合需要早于容器初始化执行的底层逻辑。通过合理设计,可显著提升应用启动效率并解决模块化配置难题。
2025-03-14 14:31:00
855
原创 Spring 注解解析
@Transactional 通过 AOP 动态代理和 事务管理器实现声明式事务管理,开发者需关注传播行为、隔离级别、异常处理等核心属性,避免同类调用、非 public 方法等失效场景。在复杂场景下,结合编程式事务可提升灵活性和可控性。
2025-03-13 23:29:54
1366
原创 消息队列 Kafka、RocketMQ、RabbitMQ 对比与分析
Kafka:大数据领域事实标准,吞吐为王。RocketMQ:阿里系高可靠首选,平衡性能与功能。RabbitMQ:灵活轻量,适合协议多样化的中小系统。
2025-03-13 17:23:40
936
原创 设计模式在MyBatis中的具体应用与分析
设计模式应用场景关键实现工厂模式创建隔离复杂对象的创建逻辑,统一入口建造者模式解析XML构建对象分步处理复杂配置,支持多层级嵌套解析代理模式Mapper接口的动态代理解耦接口定义与SQL执行逻辑,实现无侵入式扩展装饰器模式缓存功能增强(LRU、日志、同步)动态扩展对象功能,避免继承导致的类爆炸问题模板方法模式SQL执行流程标准化(抽象公共逻辑,子类差异化实现具体步骤责任链模式插件机制(拦截SQL执行)通过动态代理链实现多插件的顺序执行设计模式的价值。
2025-03-13 09:59:39
843
原创 GOF设计模式在 Spring 框架中的核心应用分析
设计模式Spring中的实现核心作用工厂方法解耦对象创建与使用单例Bean作用域配置资源复用与状态共享代理AOP动态代理无侵入式功能增强适配器统一不同接口的调用方式模板方法封装通用流程,扩展细节观察者Listener松耦合的事件驱动机制策略动态切换算法实现结论:Spring框架通过灵活组合GOF设计模式,实现了高扩展性、低耦合的企业级开发框架。理解这些模式的应用场景,有助于掌握Spring的设计精髓,并在实际开发中借鉴其思想。
2025-03-12 20:56:36
895
原创 设计模式在 JDK 中的具体应用与分析
GOF 设计模式是面向对象设计中常见问题的可复用解决方案,通过 23 种经典模式 提供了一套标准化的设计思路,用于解决软件设计中反复出现的架构和交互问题。这意味着应该能够在不修改现有代码的情况下,让软件的行为发生变化(通常通过添加新代码来完成)2、使用多个隔离的接口,比使用单个接口(多个接口方法集合到一个的接口)要好。组合对象或类,形成更大结构的灵活方案,不破坏原有结构。1、上层模块不应该依赖底层模块,它们都应该依赖于抽象。2、抽象不应该依赖于细节,细节应该依赖于抽象。
2025-03-12 20:47:02
1136
原创 单点登录(SSO)中 OAuth 2.0、JWT、SAML 的对比与核心差异
OAuth 2.0是授权协议的首选,适合互联网应用和第三方集成。JWT 是轻量级令牌格式,适合无状态场景,常与 OAuth 配合使用。SAML是企业级 SSO 的成熟方案,适合复杂安全需求的内部系统。根据场景选择:开放生态用 OAuth,企业内网用 SAML,轻量级用 JWT。
2025-03-12 15:54:18
1120
原创 细说 Java 集合之 Map
ConcurrentHashMap数据节点(hash值为非负数,通过方法spread计算):Node:链表节点;TreeNode:红黑树节点;辅助节点(不存放数据,hash值固定,且均为负数):TreeBin:用于指向红黑树根节点,hash值为-2;ForwardingNode:数组扩容时使用,hash值为-1;ReservationNode:占位节点,hash值为-3,方法computeIfAbsent 和 compute中使用该节点。
2025-03-02 23:59:39
813
原创 细说 Java 线程池
线程池状态(runStateOf)和线程池中线程数量(workerCountOf)一起存在了 ctl 成员变量中,通过高位掩码提取状态(runStateOf)、低位掩码提取线程数(workerCountOf)的位运算提高效率(相较于传统条件判断或锁操作)。
2025-02-28 22:23:46
1534
原创 细说 Java GC 垃圾收集器
几十MB的内存,使用Serial+Serial Old单线程进行回收;几百MB的内存,使用Parallel Scavenge+Parallel Old多线程的GC线程来回收;几个GB的内存,多线程也忙不过来,得使用并发的CMS+ParNew收集器;几十个GB内存,传统的垃圾收集器每次GC都需要对新生代或老年代或整个堆回收,这种STW时长是无法忍受的,此时就需要使用现代垃圾收集器了(如G1, ZGC),它们将内存划分为多个Region,每次回收计算ROI较高的Region。
2025-02-27 17:37:13
945
原创 细说 Java 引用(强、软、弱、虚)和 GC 流程(二)
GC扫描实例对象时,会通过一个叫做的类(C++写的),这个类里存放了我们java类的引用类型(基本类型不会存放)的成员变量;换言之,类里存在变量X,那就可以顺藤摸瓜找到X对象,否则,X就是不可达;我们的Reference类对应的类中就跳过了变量referent;实际使用时若我们在一个java类里定义了成百上千的引用类型变量,那岂不是也得存放成百上千的引用型变量,这还了得;所以为了避免这种情况,_offset:连续实例变量中第一个实例变量位置;_count:连续实例变量个数;注意。
2025-02-23 21:46:57
1025
原创 JVM层面的JAVA类和实例(Klass-OOP)
在HotSpot中,KlassKlassOopDescOopDescJVM 使用 C++ 编写的,C++ 定义了2个类KlassOopDesc分别用来描述Java中类和对象, 所以Java中的类和对象对于C++而言,均是 C++ 创建的对象。类比注解和元注解。C++定义的Java类产生的对象就是元注解;Java代码产生的对象就是注解。1、 JAVA代码通过创建对象,图示{1};2、JVM会加载对应的class,解析生成Klass对象,图示{2}、{3};3、JVM更加加载的Klass对象,创建。
2025-02-20 20:34:52
920
原创 Linux之【网络I/O】前世今生(二)
Linux中 I/O 多路复用的具体实现有:select、poll、epoll ;kueue 是在UNIX上比较高效的IO复用技术。
2025-02-14 10:22:59
1092
ustc多核并行_上机实验报告_徐云(一共5次)
2015-07-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人