- 博客(65)
- 收藏
- 关注
原创 可达性分析算法
这个算法的基本思路就是通过一系列称为“GC Roots”的根对象作为起始点,从这些节点开始根据引用关系向下搜索,搜索过程所走过的路径称为引用链,当一个对象到任何GC Roots都没有引用链相连时,则证明此对象是不可用的,可以被回收。搜索过程中走过的路径即为“引用链”。如果一个对象无法通过任何路径连接到 GC Roots,哪怕它持有循环引用,也会被判定为“垃圾”。考虑整个堆内存中的对象是否会被瞬间全部回收,包括正在使用的核心对象。的节点(如栈中引用的对象、静态属性)作为起点,进行。
2026-02-05 23:09:15
109
1
原创 堆内存分区
Eden 区负责接纳新对象,一旦满载,触发 Minor GC。存活对象被复制到 Survivor 区,Eden 区直接清空。这种“以空间换时间”的策略,保证了 GC 的高效。对象在新生代经历多次“洗礼”(默认15次)仍未消亡,即被视为“长期资产”,晋升至老年代。这里空间大但回收频率低,一旦空间耗尽,将触发昂贵的 Full GC。Java堆内存设计的核心理论基础是“弱分代假说”,该假说的具体内容是什么?如果系统中的所有对象都变成了“长生不老”的长期对象,堆内存会发生什么?:绝大多数对象都是朝生夕死的。
2026-02-03 21:55:18
153
2
原创 JVM定义
JVM(Java虚拟机)是Java实现跨平台的基石。程序运行时,JVM对字节码文件进行逐行解释,翻译成机器码指令,并交给对应的操作系统去执行。它通过引入“字节码”这一中间形态,解耦了高级语言与底层硬件的强绑定关系。编译器只负责将源代码翻译为通用的字节码,而针对不同平台安装的特定 JVM,负责在运行时将字节码“解释”或“即时编译(JIT)”为该平台专属的机器码。JVM 屏蔽了不同操作系统指令集的差异,为上层应用提供了统一的运行接口。所谓的“一次编译,到处运行”,实际上是“
2026-01-27 23:11:12
251
1
原创 Docker Compose
Docker Compose 是什么Docker 官方提供的容器编排与管理工具用于管理多个 Docker 容器的应用核心特点:通过配置文件(YAML)管理容器,简化多容器部署。
2026-01-02 10:42:09
1027
原创 Docker 知识练习题
A) 镜像是一个运行实例 B) 镜像是只读模板,用于创建容器 C) 镜像是容器间的通信桥梁 D) 镜像是Docker的配置文件。编写命令:后台运行一个名为"my_app"的容器,使用nginx镜像,映射宿主机8080端口到容器的80端口。编写命令:从容器"my_mysql"中复制/etc/mysql/my.cnf文件到当前目录。运行nginx容器(加入网络,别名"web",端口映射)运行MySQL容器(设置密码,加入网络,别名"db")编写命令:停止名为"my_mysql"的容器。
2026-01-01 21:46:25
777
原创 Docker
一个容器化平台,可将应用程序及其依赖打包成轻量级、可移植的容器。:只读模板,用于创建 Docker 容器,包含运行应用程序所需的代码、运行时、系统工具和库。:镜像的运行实例,是一个隔离的进程空间,包含应用程序及其运行环境。:存储和分发镜像的地方(如 Docker Hub)
2026-01-01 20:39:46
783
原创 MySQL索引数据结构:B+树 vs 哈希索引
这是一个重要的扩展点。它不是由用户创建的,而是InnoDB的内部优化机制,用于加速缓冲池中热点数据页的访问,完美结合了B+树的持久化优势和哈希的内存检索速度。:InnoDB会监控表上的查询模式,如果发现某些索引值被频繁用于等值查询,它会在内存中自动为这些热点数据页建立一个哈希索引,以加速访问。的联合哈希索引,查询条件必须包含所有列(或精确匹配哈希计算时的组合),仅查询。(如MySQL的Memory引擎),数据常驻内存,追求极致点查速度。当查询所需列全部包含在索引中时,无需回表,直接在索引中完成查询。
2025-12-29 21:48:44
1068
原创 MyBatis 与 Hibernate 对比
在 MyBatis 基础上提供了类似 JPA 的通用 Mapper 和 ActiveRecord 支持,在保持 SQL 可控性的同时,大幅提升了简单 CRUD 的开发效率。因其灵活轻便,在中国高速发展的互联网生态中(如阿里、腾讯等大厂推动)迅速成为事实标准,并形成了强大的社区和最佳实践(如 PageHelper、MyBatis-Plus)。:在 Hibernate 之上提供了更简洁的 Repository 抽象,进一步提升了简单 CRUD 的开发效率,是 Hibernate 的“现代化包装”。
2025-12-29 21:42:10
595
原创 MyBatis插件(拦截器)
args = {Connection.class, Integer.class}) // 指定方法参数类型,用于精确匹配重载方法。// 接收来自配置文件(mybatis-config.xml)中传入的属性,可用于插件配置化。@Component // 交由Spring管理,也可在mybatis-config.xml中配置。// 2. (核心)将参数与SQL合并,生成可直接在数据库客户端执行的SQL字符串。// MyBatis提供的标准方法,用于包装目标对象,创建代理。
2025-12-28 21:30:05
793
原创 慢SQL分析与优化实战
根据业务逻辑(如用户ID、时间)将数据分布到多个数据库或表中。自动记录所有执行时间超过阈值的SQL语句及相关信息(执行时间、锁时间、扫描行数等),是分析的根本依据。拿到一条慢SQL后,不要盲目猜测,应进行系统化诊断。有时将一个大查询拆成多个小查询,在应用层组合,反而比数据库内复杂。常见失效场景:对索引列进行函数计算、类型隐式转换、使用。避免在区分度低的字段(如“性别”)上建单列索引。将包含不常用大字段(如文章详情)的列拆分到子表。更高效(利用了应用服务器的扩展性)。(定义“慢”的阈值,如2秒),
2025-12-28 21:19:26
795
原创 慢SQL分析与优化实战
根据业务逻辑(如用户ID、时间)将数据分布到多个数据库或表中。自动记录所有执行时间超过阈值的SQL语句及相关信息(执行时间、锁时间、扫描行数等),是分析的根本依据。拿到一条慢SQL后,不要盲目猜测,应进行系统化诊断。有时将一个大查询拆成多个小查询,在应用层组合,反而比数据库内复杂。常见失效场景:对索引列进行函数计算、类型隐式转换、使用。避免在区分度低的字段(如“性别”)上建单列索引。将包含不常用大字段(如文章详情)的列拆分到子表。更高效(利用了应用服务器的扩展性)。(定义“慢”的阈值,如2秒),
2025-12-26 23:26:01
998
原创 数据库索引设计
操作的成本(需要维护索引树),并占用磁盘/内存空间。区分度指该列不同值的数量占表总行数的比例。比例越高,索引筛选效果越好。),可以只对前N个字符建立索引。N的选取应能保证足够高的前缀区分度。对于值频繁变更的列,维护索引的代价可能超过其查询收益。不出现在查询条件中的列,创建索引通常是无意义的。),避免使用冗长的UUID(除非分布式场景必需)。(如配置表),全表扫描更快,索引反而成为负担。)、类型(区分度低,可能只返回大量数据)。,且遵循最左前缀原则,则仍有价值。(应使用前缀索引或全文索引)。
2025-12-26 23:25:06
455
原创 索引的原理
如果有,则访问索引结构,利用其高效的查找算法(如在B+树中进行二分查找、在哈希表中直接计算地址)快速找到键值。(如B+树、哈希表)进行组织,形成一个独立的索引文件。:字典中所有的汉字及其解释(相当于数据库表中的所有行)。:数据库提取指定列(或列组合)的值,并根据特定的。最后,通过指针直接定位并读取磁盘上的完整数据行。,并且会在数据增删改时引入额外的维护开销。,找到“zhang”对应的页码范围,或者查。),数据库优化器会先判断是否有可用的索引。,找到“弓”部对应的页码。及其对应的数据行指针。
2025-12-25 21:08:45
786
原创 Spring Bean自动装配(Autowiring)模式详解
- Spring会自动寻找类型为 Person 的Bean,注入到customer的person属性中 -->在基于Java配置和注解的现代Spring开发中,自动装配主要通过以下注解实现,它比XML的。:像组装一台台式电脑,你需要自己购买并连接CPU、内存、硬盘等每一个部件。:像购买一台笔记本电脑,厂家已经根据标准配置,帮你把所有的硬件都组装好了。:当存在多个同类型候选Bean时,标记为首选Bean,解决。配合使用,在按类型匹配的基础上,,精确指定要注入的Bean。属性更强大、更精确。
2025-12-25 20:58:10
392
原创 Spring Boot自动配置
这些Bean被注册到Spring IOC容器中,从而完成了整个应用上下文的自动组装。的自动配置类,才会被真正加载到Spring容器中。,让开发者专注于业务逻辑,而非繁琐的框架配置。因为引入了Starter,这些类都在类路径下,:类路径下存在指定的类时才生效。文件,其中声明了自己的自动配置类,例如。但并非所有类都会生效。最终生效的自动配置类本身就是一个标准的。,而不会使用自动配置提供的默认Bean。:当指定的配置属性满足条件时才生效。自动配置是Spring Boot的。时,数据源相关的自动配置才生效)。
2025-12-24 20:45:02
1054
1
原创 Docker容器化部署实战
echo "95%响应时间:$(awk '{print $NF}' ${NGINX_LOG_DIR}/access.log | sort -n | awk 'NR==int(NR*0.95)')s"echo "平均响应时间:$(awk '{sum+=$NF} END {print sum/NR}' ${NGINX_LOG_DIR}/access.log)s"printf "%-15s %-6s %-30s %-4s %-6s\n", "IP", "方法", "URL", "状态", "时间"
2025-12-23 11:09:01
1069
原创 Docker容器化部署实战:命令详解与网络通信
docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}\t{{.Size}}" # 格式化输出。docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 # 带环境变量。docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" # 格式化输出。
2025-12-22 09:10:53
1106
原创 Docker:容器化技术核心概念与实践
echo "测试命令:docker run --rm ubuntu:20.04 echo 'Hello Docker!docker images --filter "dangling=true" # 显示悬空镜像。docker rmi -f $(docker images -q) # 强制删除所有镜像。"metrics-addr": "127.0.0.1:9323", # 监控指标。docker stats --no-stream # 单次快照。
2025-12-22 09:10:41
961
原创 Redis多实例部署与主从架构
echo "时间: ${elapsed}s | 请求数: ${request_count} | 命中数: ${hit_count} | 命中率: ${hit_rate}%""description": "实例 {{ $labels.instance }} 内存使用率: {{ $value }}%""description": "实例 {{ $labels.instance }} 命中率: {{ $value }}%""legendFormat": "{{instance}} 内存使用(MB)"
2025-12-21 20:38:43
746
2
原创 Redis高级特性与生产环境部署
SUNION setA setB # 并集: 1,2,3,4,5,6。SINTER article:100:tags article:101:tags # 共同标签: "数据库"SRANDMEMBER tags:article:100 2 # 随机获取2个元素。SINTER user:1001:following user:1002:following # 共同关注。
2025-12-21 20:37:54
472
原创 Redis:安装配置、核心概念与实践应用
APPEND message " world" # 追加 => "hello world"SETRANGE message 6 "Redis" # 替换 => "hello Redis"LINSERT comments:post:100 BEFORE "评论2" "评论1.5" # 在元素前插入。SISMEMBER tags:post:100 "编程" # 判断元素是否存在 => 1。
2025-12-20 21:49:32
1024
原创 Nginx负载均衡策略详解与Session一致性解决方案
无论请求被Nginx分发到哪台Tomcat,都能从Redis中读取到统一的Session数据,实现无缝的登录状态保持。使用同一客户端IP多次访问应用,观察Nginx访问日志或后端Tomcat日志,确认请求被固定转发到同一台Tomcat。策略下,用户登录(POST请求)成功后,跳转首页(GET请求)时被提示未登录或再次跳转到登录页。,因为同一用户的不同请求(如登录、首页)的URI不同,会被分配到不同服务器。
2025-12-20 21:33:33
880
原创 企业级Nginx反向代理与负载均衡实战
Tomcat-1:8080] [Tomcat-2:8081] ... (应用服务器集群)server backend2.example.com weight=3;容器化技术,将Tomcat、Nginx等组件容器化,实现更高效、一致的环境管理。
2025-12-19 08:50:32
902
原创 企业级多项目部署与Tomcat运维实战
当在同一服务器启动多个Tomcat时,默认端口(8080, 8005, 8009)冲突是必然问题。:记录了客户端IP、时间、请求方法、URI、协议、状态码、返回字节数等。:理解访问日志是性能分析和业务监控的“金矿”,并学会基础的分析命令。作为反向代理和负载均衡器,处理静态资源、SSL卸载、限流等。:识别异常访问模式(如来自单一IP的暴力破解登录尝试)。:认识到容器化部署是解决环境一致性和隔离性的更优方案。:监控异常状态码(如4xx, 5xx)的请求。:统计特定接口(如登录)的日调用量。
2025-12-19 08:47:40
772
原创 企业级Web应用部署实战:Tomcat + MySQL
用户 (Browser/App) <--[HTTP]--> **Tomcat (Web层)** <--[JDBC]--> **MySQL (数据层)**,让开发者专注于业务逻辑,而非底层技术实现(如网络协议解析、线程池管理、连接复用等)。:编写Shell脚本自动化完成安装、配置、启动、停止等操作,提高效率,减少人为错误。:部署后,配置对Tomcat进程、端口、应用关键接口、数据库连接池等的监控和告警。:对所有安装包(Tomcat, JDK)、配置文件、SQL脚本进行版本管理。或编写脚本循环检查,自动重启。
2025-12-18 08:49:23
1313
原创 Linux环境下MySQL 5.7安装与配置完全指南
上传包 → 解压 → 按序安装 → 启动服务 → 找临时密码 → 改密码 → 设远程权限 → 配防火墙 → 验证。innodb_buffer_pool_size = 1G # 缓冲池大小,建议为物理内存的50%-70%systemctl stop firewalld # 临时关闭(重启失效)innodb_flush_log_at_trx_commit = 2 # 平衡性能与安全性。如需远程(如从Windows Navicat)连接,需授权。)上传至Linux服务器的任意目录,例如。
2025-12-18 08:49:01
1019
原创 Web与APP前端性能测试详解
苹果官方开发套件,用于分析iOS/macOS应用性能,功能极为全面(Time Profiler, Allocations, Energy Log等)。:通过JavaScript(JS)异步调用后端API(RESTful/gRPC等)获取的JSON/XML数据。:在开发者工具的Network面板中,可调节网络节流(Throttling),模拟3G等慢速网络。:HTML、CSS、JavaScript、图片、字体、图标等。前端性能知识帮助你构建更完整的性能视野。这是性能测试工程师的主要战场,也是本课程的核心。
2025-12-17 08:45:59
829
原创 性能测试深度解析:并发、TPS与系统能力的本质
理解并发数的“虚实”,认清TPS作为性能核心指标的地位,并始终关联硬件资源瓶颈进行分析,是从“执行压测工具”到“进行专业性能工程”的关键跨越。说明小红的系统性能更好。恰恰相反,这是因为小红处理能力低下,单个请求占用的CPU时间片很短(大部分时间在“等待”或“缓慢处理”),从而“腾出”资源处理更多并发请求。:请求在公网中传输,受物理距离、网络拥堵、路由器跳数影响,到达服务器的时间存在差异(北京用户可能10ms到达,海南用户可能50ms到达)。:仅看“同时接待客户数”,小红(100并发)远超小美(1并发)。
2025-12-17 08:45:42
453
原创 性能测试实战:混合场景与稳定性测试详解
只有亲手操作,才能深刻理解细节(如脚本配置、结果分析、问题排查),并积累真正的“项目经验”,以应对未来的面试和工作挑战。:通过系统化的性能测试,不仅能回答“系统能跑多快”(TPS),还能回答“系统能承受多少用户”(并发),以及“系统能否持续稳定运行”(稳定性),从而为系统优化、容量规划和架构决策提供坚实的数据支撑。:从小并发(如10)开始,逐步增压(10→20→50→100...),观察TPS和响应时间的变化趋势。:例如,测试“用户列表”(接口A)和“用户登录”(接口B),假设生产比例为。
2025-12-16 00:18:40
1040
原创 性能测试实战:目的、策略与执行详解
(如错误率上升、响应时间激增),从而完整展示从“最佳并发”到“最高并发”的整个探测过程。并发数 ↗ -> TPS ↗ (线性增长期) -> TPS → (性能瓶颈期) -> TPS ↘ (性能衰退期)的并发数,系统以较高的吞吐量和可接受的延迟运行。:使用固定或较低并发,持续运行数分钟,获取稳定的TPS和响应时间数据。:可以更细致地观察系统性能随压力变化的趋势,精准定位拐点。:在预估的日常压力(如平均TPS的80%)下持续运行。(如并发+10,TPS+50%):说明系统远未达瓶颈,
2025-12-16 00:18:25
783
原创 MyBatis中 #{} 与 ${} 的区别
- 转换为:SELECT * FROM user WHERE name = '张三' -->因为它直接进行字符串替换,如果用户传入恶意参数,该参数会成为SQL语句的一部分并被数据库执行。对于同构SQL(结构相同,参数不同),数据库服务器只需编译一次,后续执行效率高。-- 错误:如果name是字符串,替换后SQL语法错误 -->-- 或者传递的参数值本身包含引号: `"'张三'"` -->-- 正确:需要在值中或外围加上引号 -->-- 传入 name = '张三' -->-- 实际执行(危险!
2025-12-15 07:06:14
1024
原创 Spring Boot Starter机制
每个功能模块对应一个Starter,使得应用像搭积木一样简单。技术栈的升级或替换(如将Tomcat换成Undertow)变得异常容易。:Starter提供了最合理的默认配置。只有当默认值不满足需求时(如数据库URL),开发者才需要覆盖。一个标准的Starter通常包含三个核心部分,共同协作实现“开箱即用”。(类路径下确实有MyBatis相关类),则执行配置类中的。中手动添加多个相关的JAR包,并处理版本兼容性问题。轻松覆盖,实现了配置的集中管理和环境隔离。依赖,相关的JPA Bean才会被创建。
2025-12-14 10:32:12
571
原创 Spring事务传播机制
A和B可能都有事务,传播机制决定它们是共用同一个事务,还是各自独立,或是其他协调方式。解决的核心问题是:当一个事务方法(A)调用另一个事务方法(B)时,两者的。:B不参与事务,A的事务会被暂停,等B非事务执行完再恢复。:B“随波逐流”,A有事务就一起事务,A没事务就非事务。:如果当前存在事务,则加入事务;:如果当前存在事务,则加入事务;如果当前没有事务,则新建一个事务(行为同。如果当前存在事务,则挂起该事务。如果当前存在事务(A的事务),则。A有事务 → B加入A的事务(A无事务 → B新建事务。
2025-12-14 10:31:27
701
原创 Spring Boot、Spring MVC、Spring 三者核心区别
Spring Framework的IoC容器来管理其控制器(Controller)和服务层(Service)等Bean。使用Spring Boot开发Web应用,你依然在使用Spring MVC,只是省去了大量繁琐的XML或Java配置。:没有Spring Framework,就没有后续的Spring MVC和Spring Boot。,它是在Spring Framework(包括Spring MVC)之上的一层。它们代表了Spring生态中三个不同层次和定位的概念,关系是层层递进的。
2025-12-13 15:24:16
717
原创 JMeter分布式压测完整指南与故障排查
文件下载到本地,用JMeter GUI的“查看结果树”组件打开,即可详细分析每一个失败请求的具体原因(断言失败、状态码、响应内容等)。所有压力机(主、从)的JMeter版本、安装路径、依赖库(如JDBC驱动JAR)需完全一致。分布式压测的难点在于环境准备和初次配置,严格按照步骤操作并善用日志排查,是成功的关键。:会显示连接的从机信息,且总并发数 = 主控机脚本线程数 × (从机数+1)。的系统资源(CPU、内存、网络IO),确保压力机自身不是瓶颈。运行测试脚本(.jmx),并发送指令给从机。
2025-12-13 14:34:52
850
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅