Press "Enter" to skip to content

分类: 编程-JAVA

一次诡异的 Spring Boot 发布后 Full GC 事件排查全记录

一、事故背景:风平浪浪静下的暗流 我们有一个稳定运行的 Spring Boot 应用,日常通过监控平台观察,其 JVM 堆内存(Heap Memory)使用率一直非常平稳,老年代(Old Gen)占用率低,看不出任何内存泄漏的迹象。然而,一个诡异的问题持续困扰着我们:每次发布新版本的程序后,应用启动阶段总会触发一次甚至多次 Full GC。 这让人非常困惑,既然平时内存没问题,为什么偏偏在发布这个…

Leave a Comment

使用 Redis SETNX 实现分布式锁

在当今这个微服务架构盛行的时代,分布式系统中的并发控制显得尤y为重要。当多个服务实例需要同时访问共享资源时,如何保证数据的一致性和操作的原子性,就成了一个亟待解决的难题。分布式锁便是应对这一挑战的有效工具之一。本文将深入探讨如何利用 Redis 的 SETNX 命令,并结合 Spring Boot的一份分布式锁实现指南。 什么是分布式锁? 在单体应用中,我们通常使用 synchronized 关键…

Leave a Comment

别让MySQL事务超时毁了你的数据

为开发者,我们每天都在和数据库打交道,而事务(Transaction)是保证数据一致性的核心武器。但你是否真正了解MySQL事务在并发和异常情况下的“脾气”?一个被忽略的超时异常,可能正在悄悄地侵蚀你数据的完整性。 本文将通过几个开发者最常遇到的场景,深入探讨MySQL事务的工作细节,特别是默认配置下可能隐藏的“陷阱”。 场景一:A事务执行中,B事务更新并提交了数据,A再读时会读到什么? 这是一个…

Leave a Comment

PUT vs. PATCH:Spring Boot RPC 更新接口设计的深度思考

前言:那个令人纠结的更新接口 在日常的项目开发中,设计一个“更新”接口是再常见不过的需求了。假设我们有一个“国家”实体,它包含名称、首都、国旗等多个字段。现在需要提供一个RPC接口,根据国家代码(code)来更新其信息。 这时,一个经典的设计抉择摆在了我们面前:> 客户端在调用更新接口时,是应该传递一个包含所有字段的完整对象,还是只传递需要修改的字段(未修改的字段不传或传null)? 这两种…

Leave a Comment

Java反射:getMethods() vs getDeclaredMethods(),别再用错了!

在Java开发中,尤其是编写框架或工具类时,反射(Reflection)是一个强大但又容易混淆的工具。其中,Class 对象的 getMethods() 和 getDeclaredMethods() 方法是获取类方法的两个常用入口,但它们的行为差异巨大,经常成为初学者的困惑点。 今天,我们就来彻底厘清这两者的区别,让你在需要时能够毫不犹豫地做出正确选择。 一、核心区别速览 如果你赶时间,下面这张表…

Leave a Comment

Spring Boot 启动报错排查:从 UnsupportedClassVersionError 到 Maven 版本管理最佳实践

问题背景 在启动 Spring Boot 项目时遇到了一个看似复杂的错误,项目无法正常启动,抛出了一长串的异常堆栈信息。通过仔细分析和排查,最终发现问题的根源竟然是一个很容易被忽视的 Maven 依赖配置问题。 错误现象 项目启动时抛出以下异常: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to pr…

Leave a Comment

Spring定时任务事务管理问题解决方案

问题描述 项目中,我们实现了一个定时清理过期数据的功能。该功能使用 @Scheduled 注解每小时执行一次,通过JPA进行批量删除操作。但在运行过程中遇到了以下错误: 2025-07-10 23:30:58.801 INFO 244 — [scheduling-1] c.j.s.service.ExpiryDataCleanupService : 开始清理过期数据 2025-07-10 23…

Leave a Comment

OHC (Off-Heap-Cache):深入理解 Java 高性能堆外缓存

注意:OHC (Off-Heap-Cache) 项目官方已宣布不再维护。本文旨在作为技术学习和历史回顾资料,不建议在新的生产环境中使用。对于需要高性能缓存的 Java 项目,可以考虑 Caffeine (堆内) 或其他仍在积极维护的堆外缓存解决方案。 目录 什么是 OHC?为什么需要堆外缓存? OHC 的核心架构与特性 两种核心实现:Linked 与 Chunked 高效的淘汰算法 直接内存管理 …

Leave a Comment

主键ID vs 业务Code:一场关乎架构的经典之争

在日常的系统开发中,尤其是在使用Spring Boot和MySQL这样的技术栈时,一个看似微小却影响深远的设计决策常常引发团队内部的讨论:我们应该用数据库自增的主键ID,还是具有业务含义的**业务编码(Code)**来作为数据关联和操作的核心标识? 一边是坚持传统范式、追求性能与稳定的“ID派”,另一边是看重业务直观、API友好的“Code派”。这两种方式并非水火不容,但理解其背后的设计哲学和利弊…

2 Comments

Spring Boot 内存探秘:不配置 JVM 参数时,内存是如何分配的?

我们在开发和部署 Spring Boot 应用时,经常会被提醒:“生产环境一定要配置 JVM 参数!” 但你是否好奇,如果我们“偷懒”不配置任何 JVM 参数(如 -Xms, -Xmx),Spring Boot 项目的内存占用会是怎样的呢?本文将为你揭开这个谜底。 核心要点 Spring Boot 本身并不决定内存分配。它作为一个标准的 Java 应用程序,其内存行为完全由运行它的 Java 虚拟…

Leave a Comment