自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 深入理解 Java 反射机制:原理、使用场景与性能分析

反射(Reflection)是 Java 语言提供的一种强大机制,它允许程序在运行期间动态地获取类的信息、创建对象、调用方法以及访问字段。通过反射,我们可以突破编译期的限制,在运行时“窥探”并操作任意一个类的内部结构。反射让程序具备在运行时检查和操作自身结构的能力。这种能力是很多框架(如 Spring、MyBatis、JUnit)实现“黑魔法”的底层基石。优点缺点动态获取类信息,灵活性强性能开销大支撑框架、动态代理等核心能力破坏封装,降低可维护性简化通用性代码的编写。

2026-11-06 17:13:55 333

原创 Prometheus 与 Grafana 原理详解:从数据采集到可视化监控

Prometheus 和 Grafana 之所以成为黄金组合,根本原因在于它们各司其职、边界清晰Prometheus 解决“数据从哪来、怎么存、怎么查”的问题。它的拉取模型、多维标签、TSDB 存储和 PromQL 查询语言,共同构成了一个高效、易用的时序监控底座。Grafana 解决“数据怎么看、怎么探索、怎么分享”的问题。它的数据源插件机制、面板渲染引擎和模板变量,让复杂的监控数据变得直观、可交互。理解这些原理之后,再回头去看日常的配置和排障,你会发现每一个参数、每一个查询背后都有章可循。

2026-11-01 11:52:09 324

原创 深入理解 JVM:从内存模型到垃圾回收的完整指南

JVM(Java Virtual Machine,Java 虚拟机)是 Java 平台的核心组成部分,它屏蔽了底层操作系统和硬件的差异,使得「一次编译,到处运行」成为可能。对于开发者来说,日常写的.java源文件会被编译成.class字节码文件,而真正负责加载并执行这些字节码的,就是 JVM。源代码(.java) --> 字节码(.class) --> JVM 解释/编译执行 --> 操作系统理解 JVM 不仅能帮助我们写出更健壮的代码,也是排查内存溢出、CPU 飙高、频繁 GC 等线上问题的基本功。

2026-10-29 11:06:37 121

原创 写时复制(Copy-on-Write)原理详解

写时复制是一种延迟复制策略。多个对象在创建初期共享同一份资源,只要大家都只读取,就绝不复制;一旦某个对象要修改这份资源,系统才为它复制一份私有副本,让它修改自己的副本,不影响其他共享者。读时共享:多个使用者可以同时读取同一份数据;写时复制:第一个尝试修改的使用者触发复制,获得私有副本后再写入。它与“普通深拷贝”最大的区别是:普通深拷贝在创建那一刻就付出完整复制成本,而写时复制把成本推迟到“真正写入”的那一次,甚至如果始终没有写入,成本就是零。先共享只读数据,真正写入时再私有化。

2026-10-26 00:20:07 206

原创 Seata 分布式事务实战:从原理到落地

除 AT 模式外,Seata 还提供三种模式,应对不同业务形态。刚上手或业务简单:优先选择 AT 模式,零侵入、开发成本最低;性能敏感、能接受一定开发量:选择 TCC 模式;流程长、涉及异构系统:选择 SAGA 模式;强一致要求、并发低:选择 XA 模式。在实际落地中,还需要结合团队技术栈、数据库选型、性能要求等因素综合评估。希望本文能帮助你快速理解 Seata 的原理并完成第一套分布式事务的接入。

2026-10-24 00:42:30 270

原创 WebSocket 从原理到实战:一文搞懂实时通信

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,由 HTML5 标准定义,协议标识符为ws(明文)或wss(加密)。全双工通信:客户端和服务端可以随时互相发送数据,无需等待对方请求。持久连接:一次握手后连接保持打开状态,避免反复建立连接的握手损耗。低延迟:数据无需携带大量 HTTP 头部,传输开销小,适合高频、小数据量场景。跨域友好:WebSocket 握手基于 HTTP,天然支持跨域通信。

2026-10-19 21:57:07 135

原创 epoll 详细原理:从 IO 模型到内核实现

红黑树:高效管理所有被监听的 fd;就绪队列:epoll_wait 只取就绪事件,不扫描全局;回调机制:事件由内核主动上报,而非用户态轮询。在此基础上,LT 与 ET 的选择决定了你的程序是"简单可靠"还是"极致性能"。对于大多数高并发 Linux 服务(如 Nginx、Redis),epoll 配合 ET 非阻塞 IO 是标准答案。希望本文能帮助你建立起对 epoll 的完整认知。建议你把文中的示例代码跑一遍,再尝试把 LT 模式改为 ET 模式观察行为差异,这样才能真正内化这些原理。

2026-10-19 14:09:32 283

原创 Feign 与 OpenFeign 底层原理深度剖析:从动态代理到请求执行的完整链路

Feign 是内核,OpenFeign 是增强:前者提供声明式 HTTP 客户端的基础能力,后者负责与 Spring 生态深度整合。动态代理是入口:Feign 通过 JDK 动态代理拦截接口方法调用,将方法分发到对应的。Contract 负责翻译:把接口方法上的注解解析成元数据。MethodHandler 是编排核心:负责构建请求模板、执行业务参数填充、发起请求、解码响应、处理异常与重试。Encoder/Decoder 与 Client 可插拔。

2026-10-18 00:19:00 327

原创 Java 反射机制:从原理到实战详解

反射是 Java 提供的一把「万能钥匙」:它让我们可以在运行时窥探和操作任何类,从而支撑起框架化、配置化、插件化的现代软件开发范式。但正如钥匙能开锁也能破门,反射带来灵活性的同时,也牺牲了编译期安全、封装性和运行性能。理解反射的关键,是理解Class对象以及MethodField这一套运行时元信息 API。掌握它们之后,再去阅读 Spring、MyBatis 的源码,你会发现自己看到的底层逻辑豁然开朗。写一个通用的对象拷贝工具,通过反射实现两个对象属性拷贝;

2026-10-13 18:09:24 291

原创 讲透 Spring IOC/AOP 原理:Bean 生命周期全景与 AOP 动态代理两种实现

控制反转(IOC):不再由程序本身 new 对象,而是由外部容器负责创建、组装、管理对象。依赖注入(DI,Dependency Injection):IOC 的一种具体实现方式,容器在创建对象时,自动把该对象依赖的其他对象"注入"进来。常见注入方式有构造器注入、setter 注入、字段注入。// 传统方式:自己 new,自己管理依赖// IOC 方式:只声明依赖,由容器注入@Component@Autowired在 IOC 模式下,不再关心UserDao。

2026-10-13 01:17:45 362

原创 深入理解 AQS:Java 并发编程的基石

AQS 的全称是,它是一个用来构建锁或其他同步器的基础框架。简单来说,AQS 解决的核心问题是:当多个线程竞争同一个共享资源时,如何以低开销、高可靠性的方式,把暂时无法获得资源的线程管理起来。用 int 类型的 state 表示共享资源的状态。不同的同步器对 state 有不同的解读,例如中 state 表示重入次数,Semaphore中 state 表示剩余许可数量。用 FIFO 双向队列管理等待线程。当线程抢不到资源时,会被封装成 Node 节点放入队列尾部,并通过挂起;

2026-10-11 22:11:10 335

原创 【无标题】

场景锁状态单线程反复进入同步块偏向锁多线程交替进入,无真正竞争轻量级锁多线程同时竞争同一把锁重量级锁调用了notify()直接升级为重量级锁需要特别注意的是:一旦调用wait()notify()等方法,锁会直接膨胀为重量级锁,因为偏向锁和轻量级锁都不支持这些方法。偏向锁:适用于单线程反复获取锁的场景,开销几乎为零。轻量级锁:适用于多线程交替获取锁、竞争不激烈的场景,通过 CAS 避免阻塞。重量级锁:适用于多线程真正竞争的场景,依赖操作系统互斥量,可靠但开销大。

2026-10-10 00:20:17 201

原创 内核态与用户态:从 CPU 特权级到系统调用

内核态和用户态的区别

2026-10-09 00:29:08 270

原创 Redis 跳表(Skiplist)底层原理深度解析

本文深入解析Redis 7.0中跳表(Skiplist)的设计与实现。跳表是Redis有序集合(Sorted Set)的核心数据结构,通过多级索引实现O(log N)的查询效率。文章详细介绍了跳表的两个核心结构体zskiplist和zskiplistNode,剖析了其score排序、层数随机生成等特性,并通过流程图展示了跳表的多层结构。重点分析了插入(zslInsert)和删除(zslDelete)操作的实现逻辑,包括随机层数生成、跨度和指针调整等关键步骤。最后对比了跳表与平衡树的优劣,指出跳表在内存数据库

2026-08-09 09:03:33 318

原创 Redis网络模型

Redis采用单线程核心逻辑+多路I/O复用的网络模型,通过epoll等机制实现高效事件监听,避免线程切换开销。6.0版本引入多线程仅处理网络I/O,核心命令执行仍保持单线程,确保线程安全。该设计具有高性能、低延迟、简单可靠的特点,单线程避免锁竞争,多路复用支持高并发连接,非阻塞I/O实现微秒级响应。关键优势在于单线程处理核心逻辑的同时,利用多路复用技术高效管理大量连接请求。

2026-03-19 23:46:31 168

原创 java: java.lang.ExceptionInInitializerError

今天在编译java项目的时候遇到如下问题400ExternalJavacProcessjava30atorgjetbrainsjpsjavacExternalJavacProcess1.runExternalJavacProcessjava264atjavabasejavautilconcurrentTh。

2026-03-16 22:35:22 366

原创 关于黑马点评中无法开启负载均衡的问题

在做黑马点评项目时,在使用分布式锁的时候,遇到无法开启负载均衡的问题,在nginx配置之后,请求无法到达第二台服务器。

2025-12-24 23:18:03 201

原创 黑马点评项目jmeter请求无法到达后端

黑马点评项目使用jemeter发送请求时,请求无法到达到后端。

2025-12-22 00:33:10 274

原创 黑马点评中无法登录

黑马点评中每次登录redis中都会生成一个全新的token。每次登录都会直接返回登录界面,无法登录,找了半天问题终于找到了。

2025-12-15 10:21:13 249

原创 bug记录

然后我查找了链接库里面,我根本就没添加这个“libboost_filesystem-vc143-mt-gd-x64-1_78.lib”文件,我添加的是“libboost_filesystem-vc142-mt-gd-x64-1_78.lib”。猜测是MSVC版本要和附加链接库中的版本一致,然后安装了MSVC v142。同时在项目属性中修改MSVC版本为142,再次运行程序,编译成功。后来发现是因为安装VS2022默认用的是MSVC v143。

2025-10-04 18:04:40 139

原创 c++中的段错误

在使用c++写一个线程池的时候,一直报一个Segmentation Fault的错误,(Segmentation Fault,简称"segfault",是指当程序在访问内存时,操作系统检测到非法的内存访问行为,例如试图读取或写入非法的内存地址,或者试图访问没有权限的内存区域时,操作系统会强制终止程序的执行,并生成一个Segmentation Fault错误信号),一直找不到报错的原因。

2025-02-14 23:54:08 188

原创 奇怪的bug

例如:用c语言写了一个线程池编译的时候遇到了如下报错:检查了很久代码也没有发现错误在哪,感觉是编译错误,想起项目名称加了括号去掉项目名称的括号之后再编译即可编译通过在给项目取名称的时候尽量不要使用中文和带有括号。去掉括号编译通过

2025-02-11 23:07:10 179

原创 BUG记录

项目场景:使用visual studio 2022远程连接linux编写代码时出了一个很奇怪的错误问题描述在编译运行程序的时候总是报这样一个错误,但是在linux环境下代码能够正常编译运行。我复制这个报错搜变全网也没有找到解决方案。原因分析:然而在我检查我的设置的时候我突然想起来我自己添加了一个依赖的库我在库依赖项这里乱添加了一个unistd库文件,于是我把乱添加的库文件去掉之后,就能正常编译了。总结:编写代码时一定别随意改动设置,不然就回报一些奇奇怪怪的错误。

2024-11-26 17:33:15 225

原创 使用QT遇到的一些小问题

在QT的ui设计窗口中添加了一个新的Label标签,然而在写代码调用它的时候却发生了找不到该标签的情况。

2024-10-11 00:09:32 252

原创 自己实现set容器中仿函数遇到的bug

关于set容器使用自己实现的仿函数的一个小问题。

2024-09-21 00:17:58 611

原创 构造函数能放在private关键字中吗

今天在写c++类的构造函数时遇到了一个小小的bug。

2024-09-17 20:19:46 708

原创 关于c++模板类<<运算符的重载方法

关于模版函数运算符重载的问题

2024-09-17 00:07:59 1055

原创 【关于c++模版类的报错问题】

通常在实现一个类时,会在.h头文件中声明函数,在.cpp文件中实现该函数。然而如果是模版类的话情况则会稍有不同。这是一个名为debug.h的头文件,里面包含了一个名为A的模版类类A的实现在debug.hpp中,模板类的实现一般以后缀hpp命名。

2024-09-14 16:26:49 392

空空如也

空空如也

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

TA关注的人

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