- 博客(1160)
- 收藏
- 关注
原创 Redis:IO多路复用深度解析
多路复用快的原因在于,操作系统提供了这样的系统调用,使得原来的 while 循环里多次系统调用,变成了一次系统调用 + 内核层遍历这些文件描述符。所谓 I/O 多路复用机制,就是说通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或写就绪),能够通知程序进行相应的读写操作。这种机制的使用需要 select 、 poll 、 epoll 来配合。多个连接共用一个阻塞对象,应用程序只需要在一个阻塞对象上等待,无需阻塞等待所有连接。
2023-07-06 12:09:39
4489
2
原创 Mono 使用指南:响应式编程的核心概念与实践
摘要: Mono是响应式编程中的单一值容器,用于表示0或1个异步操作结果,常见于Java等语言的ReactiveX框架(如RxJava、Project Reactor)。其核心特点包括: 异步处理:支持延迟执行(如Mono.fromCallable)和链式操作(如map、filter)。 错误处理:通过doOnError和onErrorReturn实现异常捕获与默认值返回。 应用场景:适用于数据库查询(如Spring WebFlux)、Web异步响应等。 与Flux区别:Mono处理单值,Flux处理多值流
2026-01-10 17:52:55
645
原创 Spring 事务管理:为什么内部方法调用事务不生效以及如何解决
摘要: Spring事务管理基于AOP代理机制,通过@Transactional注解实现。当同一类中的方法A调用方法B(均带事务注解)时,事务可能失效,因为内部调用未经过代理对象。解决方法:1)将方法B拆分到另一个类,通过依赖注入调用以触发代理;2)调整事务传播行为(仅对外部调用有效)。关键点在于Spring事务仅对代理对象的外部调用生效,内部直接调用会绕过代理导致事务失效。
2026-01-10 10:52:18
539
原创 Spring 事务传播行为 + 事务失效原因 + 传播行为为什么不用其他模式
本文介绍了Spring事务的7种传播行为,重点分析了默认使用REQUIRED的原因:它最符合业务场景,能保证事务原子性且开销小。其他传播模式如REQUIRES_NEW、SUPPORTS等因场景小众、行为不可控或依赖底层支持而较少使用。文章还解释了内部方法调用事务失效的原因:绕过代理机制。最后指出事务失效的常见情况,如private方法、final类等。整体概括了Spring事务传播机制的核心要点和使用注意事项。
2026-01-09 11:19:10
716
原创 深入解析数据库四大事务隔离级别及其实际应用
事务隔离级别定义了不同事务之间的可见性。为了帮助理解这四个隔离级别的影响,我们通过一个具体的场景来分析。假设我们有一个student表,包含学生的id和age信息。事务A,查询所有年龄大于20的学生记录。事务B,插入一条新记录。我们将分析在不同事务隔离级别下,事务A执行查询时的行为。在生产环境中,选择合适的事务隔离级别是平衡数据一致性和系统性能的关键。通过了解每个事务隔离级别的特点、优缺点和适用场景,你可以更好地满足业务需求,并确保系统在高并发环境下的稳定性。低并发、高一致性要求的系统:使用串行化。
2026-01-09 11:08:12
708
原创 Java 元注解详解:@Target、@Retention、@Documented、@Inherited 区别与使用场景
元注解就是用来描述 “注解自身行为” 的注解。注解用于哪里?(类?方法?字段?注解保留到什么时候?(源码?class?运行时?注解是否会被文档工具收录?注解是否可以被子类继承?这些都是由元注解定义的。元注解作用常见用途@Target限定注解能用在哪里方法注解、类注解、字段注解@Retention决定注解生命周期RUNTIME:AOP、反射最常用是否加入 JavadocAPI 文档友好@Inherited子类是否继承类上的注解。
2026-01-09 09:50:12
694
原创 Redis ZSet 实现排行榜(支持分数相同按时间顺序排序)
本文介绍利用Redis ZSet实现多维度排行榜的复合score方案。针对医疗场景中常见的医生接诊量、护士工作量等排行榜需求,提出将业务分数与时间戳组合为finalScore的计算方法:finalScore = bizScore * FACTOR - timestamp。该方案通过高位存储业务分数、低位存储时间戳,使用ZREVRANGE实现"分数高优先、同分时间早优先"的排序逻辑。文章详细展示了数据示例、Redis命令和Java实现代码,分析了ZSet在时间复杂度上的优势(O(logN)
2026-01-08 09:57:34
879
原创 MySQL 中 DATE / DATETIME / TIMESTAMP 的区别
MySQL中的日期时间类型选择指南:DATE仅存储日期(3字节),适合生日、账期等;DATETIME存储本地时间(8字节),不受时区影响,适合业务规则时间;TIMESTAMP存储UTC时间(4字节),会随时区转换,适合记录事件发生的绝对时间。跨国系统推荐组合使用:事件时间用TIMESTAMP,业务时间用DATETIME,纯日期用DATE。关键是根据"需要记录瞬间时间还是固定显示时间"来选择类型。
2026-01-08 09:52:10
243
原创 MongoDB、Redis、MySQL 如何选型?从真实业务场景谈起
摘要: 本文从业务场景出发,系统分析MySQL、MongoDB和Redis的核心定位与选型原则。MySQL适合强一致、强事务的核心业务数据(如订单);MongoDB擅长处理高频写入、结构灵活的行为数据(如日志);Redis则适用于短期状态和极致性能场景(如缓存、去重)。选型需结合数据特征:强一致性、写入频率、结构变化、存储周期和查询复杂度。生产环境中三者通常协作使用,避免误用(如Redis存长期数据)。核心原则是匹配数据本质特性,而非技术偏好。
2026-01-07 10:50:33
603
原创 MinIO 入门实战:Docker 安装 + Spring Boot 文件上传(公有 / 私有)
MinIO简介与Spring Boot集成指南 MinIO是一个开源对象存储服务,兼容Amazon S3 API,支持存储多种非结构化数据(图片、视频、日志等),单个对象可达5TB。其核心特点包括高性能(55GB/s读取)、高扩展性、云原生支持、完全兼容S3 API以及纠删码数据保护机制。 安装方面,可通过Docker快速部署MinIO服务,并需注意服务器时间同步问题。在Spring Boot集成中,通过MinioClient实现文件上传功能,支持公共和私有存储桶分类管理,自动生成对象路径并返回访问链接。
2026-01-07 09:36:38
879
原创 MinIO public / private Bucket 最佳实践(生产级设计)
本文详细介绍了MinIO对象存储的最佳实践方案,重点阐述了public和private bucket的核心设计原则。文章指出必须区分两种bucket类型:public bucket用于可直接访问的非敏感资源(如头像、商品图片),private bucket用于需要受控访问的敏感文件(如合同、隐私文件)。作者提供了bucket命名规范、访问策略设置、权限管理建议,并推荐使用预签名URL或后端转发方式访问private文件。同时强调了对象命名规范、账号权限最小化等关键实践,避免常见错误。最终指出MinIO的最佳
2026-01-07 09:36:19
1268
原创 使用 Nginx 为内网 Java 服务实现 HTTPS
本文介绍如何通过Nginx为内网Java服务快速配置HTTPS访问。核心方案是使用Nginx作为HTTPS终止层,将SSL证书配置在Nginx上,通过反向代理转发HTTP请求到Java服务。重点包括:生成支持IP的自签名证书(必须包含SAN扩展)、Nginx的HTTPS配置、保持Java服务仅HTTP运行等步骤。该方案无需修改Java代码,简化证书管理,提升性能,支持热更新,并为未来公网部署奠定基础。适用于需要快速为内网服务添加HTTPS支持又不希望改动原有Java应用的场景。
2026-01-07 09:30:28
606
原创 从 QueryWrapper 到 XML:一次「报表 SQL」的重构实践
MyBatis-Plus QueryWrapper在复杂报表场景下的重构实践 摘要:本文通过真实案例分析了QueryWrapper在报表统计场景中的局限性,包括SQL可读性差、维护成本高、安全隐患等问题。针对这些痛点,作者提出将Wrapper重构为XML SQL的方案,详细展示了重构后的项目结构、Mapper接口设计和XML动态SQL实现。重点介绍了如何通过MyBatis XML实现动态分组和统计字段,同时强调必须进行字段白名单校验以确保安全性。该重构方案显著提升了SQL的可读性和可维护性,使报表逻辑更清晰
2026-01-06 10:33:20
1055
原创 Spring 中 StringUtils.isEmpty 被弃用?正确用法你真的用对了吗
Spring弃用了StringUtils.isEmpty(Object)方法,因其参数类型宽泛、语义不清且易误解。官方推荐使用语义更明确的hasLength(判断字符串是否有长度)和hasText(判断是否包含非空白字符)替代。迁移时应根据实际需求选择:参数校验推荐hasText,纯存在性判断用hasLength。该方法变更旨在提高代码可读性和安全性,避免常见的空值校验错误。
2026-01-06 10:30:00
710
原创 一文搞懂 Spring Boot 默认数据库连接池 HikariCP
HikariCP作为Spring Boot默认数据库连接池,其参数配置直接影响系统性能。文章详细解析了HikariCP核心参数:connection-timeout建议30秒避免线程阻塞,max-lifetime应大于idle-timeout且推荐30分钟,maximum-pool-size根据应用场景设置为10-20,minimum-idle设为最大连接数一半。同时指出常见错误配置,如连接生命周期过短、timeout设置不合理等会导致性能问题,并提供了适用于中小型项目的推荐配置方案。强调HikariCP的
2026-01-05 09:24:05
824
原创 Cosine、Dot Product、L2 Distance 的区别
摘要: 在语义搜索和向量检索中,Cosine Similarity、Dot Product和L2 Distance是三种核心相似度计算方法,各有特点: Cosine 专注语义方向(0.8+表示强相关),最适合语义搜索/RAG Dot Product 受向量长度影响(需归一化才能等价Cosine),易出现长文本霸榜问题 L2 衡量几何距离(越小越相似),适用于聚类任务 工程建议:优先使用Cosine(阈值0.75-0.85),归一化场景可用Dot Product,聚类选L2,避免混淆方向与距离的评判标准。
2026-01-05 09:22:23
658
原创 Java 中 ObjectMapper 是干什么的?一个简单 Demo 讲清楚
本文介绍了Java后端开发中常用的JSON转换工具ObjectMapper。作为Jackson库的核心类,ObjectMapper能高效实现Java对象与JSON字符串的相互转换。文章通过具体代码示例,展示了如何将Map结构转换为JSON字符串,以及如何将JSON字符串还原为Java对象。重点说明了ObjectMapper的线程安全性、性能优势及统一配置特点,对比了手动拼接JSON的弊端。最后总结了ObjectMapper作为Java与JSON"翻译官"的核心价值,强调其在项目开发中的实
2026-01-05 09:18:52
841
原创 Vue + Spring Boot 项目添加 /wvp 前缀的完整链路解析(从浏览器到静态资源)
本文详细介绍了在Vue+Spring Boot项目中统一添加访问前缀/wvp的完整实现方案。通过分析浏览器访问链路,指出需要在浏览器、Vue和Spring Boot三个层面同时配置。关键点包括:Spring Boot通过WebMvcConfig映射静态资源路径,Vue需配置publicPath和router.base前缀,以及正确处理index.html请求。文章还解释了常见404错误的根本原因,并提供了兜底控制器代码,确保前端资源请求能正确映射到后端静态文件。这种多层次的协同配置方案适用于多项目部署、反向
2026-01-04 11:07:19
980
原创 Vue + Spring Boot 项目统一添加 `/wvp` 访问前缀实践
本文介绍了如何为Vue+Spring Boot项目添加统一访问前缀的完整方案。前端需修改vue.config.js中的publicPath和路由base配置,后端需在Spring Security中放行新路径。该方案具有低侵入性、高可维护性特点,适用于多项目共存、反向代理等场景。改造后项目可通过/wvp/前缀访问,同时保持原有路由跳转逻辑不变,开发与生产环境行为一致。实施步骤清晰,包含前后端配置修改要点及注意事项,是解决项目路径前缀问题的实用指南。
2026-01-04 11:01:42
453
原创 Vue 项目部署在子目录下:hash vs history 的真实区别
Vue项目子目录部署模式对比 在子目录(如/wvp/)部署Vue项目时,hash模式和history模式存在本质差异: 1️⃣ hash模式:URL含#(如/wvp/#/dashboard),路由由前端接管,无需后端配合,刷新不404,部署简单稳定 2️⃣ history模式:URL简洁(如/wvp/dashboard),但需Nginx配置try_files指向index.html,否则刷新必404 选型建议: 内部系统推荐hash模式(零配置、高稳定) 对外网站需SEO时用history模式(需前后端协同
2026-01-04 11:00:02
825
原创 Pinecone 在国内环境下的稳定使用姿势
在国内使用Pinecone向量数据库时,常因DNS解析和gRPC连接问题导致失败。核心问题在于过早初始化连接,特别是在JVM启动初期。解决方案包括:1) 通过Spring Bean延迟初始化;2) 使用懒加载(@Lazy);3) 在ApplicationReadyEvent事件后操作。虽然Thread.sleep(5000)可临时解决问题,但不建议用于生产环境。最佳实践是结合Spring生命周期管理,避免在main方法中直接连接。Pinecone在国内并非不可用,关键在于正确的初始化时机和使用方式。
2026-01-03 12:51:21
589
原创 从自然语言到 SQL:为什么向量数据库是更好的选择
摘要 本文探讨了向量数据库在自然语言查询场景中的应用价值。传统基于规则或关键词匹配的方案存在语义理解不足、维护成本高等问题。向量数据库通过将自然语言转换为数学向量表示,能够有效解决语义相似度匹配问题。文章提出了一种分层架构:用向量数据库识别用户意图(统计方式、分组维度、实体对象),再通过关系数据库执行具体计算。这种方案避免了规则膨胀问题,实现了自然语言到SQL的高效转换,在数据分析、BI报表等场景中具有显著优势。核心观点在于区分语义理解和数据计算,充分发挥两类数据库的各自优势。
2026-01-03 12:50:26
921
原创 Spring 中的资源加载:ClassPathResource 与 ResourceLoader 的正确使用方式
摘要:Spring项目中加载资源时,ClassPathResource和ResourceLoader都能加载classpath资源,但存在本质区别。ClassPathResource是具体实现类,仅支持classpath路径;ResourceLoader作为统一资源入口,支持多协议(classpath/file/http等)并自动选择实现类。核心建议:路径可配置时优先使用ResourceLoader,只有在明确仅需classpath资源或脱离Spring环境时才用ClassPathResource。这种设计
2026-01-03 12:41:13
972
原创 从 bootstrap.yml 到 Config Data 的一次架构升级
Spring Boot 2.4 配置加载机制升级解析 在 Spring Cloud 项目中,配置文件的加载方式在 Spring Boot 2.4 版本发生了重大变化。旧版本(≤2.3)采用双 Context 机制,必须通过 bootstrap.yml 预先加载配置中心信息。而新版本(≥2.4)移除了 Bootstrap Context,引入 Config Data API,允许通过 application.yml 的 spring.config.import 直接加载外部配置。 核心区别: 老版本:必须使用
2026-01-02 12:03:14
1113
原创 Spring Cloud Alibaba 项目中DataSource 配置失败?原来是 application.yml 和 bootstrap.yml 的坑
本文探讨了Spring Cloud项目中数据库配置加载失败的常见问题。当使用Nacos作为配置中心时,将数据源配置放在application.yml会导致启动失败,而改用bootstrap.yml则能成功运行。核心原因是配置加载顺序问题:bootstrap.yml在容器初始化前加载,确保Nacos配置先于DataSource创建。文章详细分析了Spring Boot/Cloud的配置加载机制,指出正确做法是将Nacos连接信息放在bootstrap.yml中,而数据源配置放在Nacos。这种问题在单体应用中
2026-01-02 12:02:35
914
原创 深入理解Java中的函数式接口
Java函数式接口是仅含一个抽象方法的接口,支持Lambda表达式实现。本文详细介绍了函数式接口的定义、判断标准及创建方法,包括无参无返回值、带参数、带返回值以及含默认/静态方法的接口实现。通过多个代码示例展示了自定义函数式接口的使用方式,并提及Java内置的Predicate等常用函数式接口。文章特别以Predicate为例,演示了如何用其筛选符合年龄条件的用户集合,体现了函数式编程在简化代码和集合操作中的优势。
2026-01-01 22:57:00
664
原创 阿里《Java 开发手册》下的对象构建与赋值规范实践
本文结合阿里《Java开发手册》,系统梳理了对象赋值的规范做法。对于字段较多的业务对象(如购物车CartInfo),阿里明确推荐使用Builder模式,因其可读性强、维护性好。普通set方法虽允许但需集中完成初始化。阿里强烈反对使用BeanUtils.copyProperties(性能差、调试难)、超长构造方法(可读性差)和伪链式set(破坏语义)。标准推荐组合是:实体类添加@Builder注解,业务层使用链式构建。核心原则是:字段少用构造器,字段多用Builder;set方法可集中使用;禁用BeanUti
2026-01-01 22:15:12
660
原创 为什么 Nginx 代理后,静态资源加载到 80 端口?
Nginx反向代理静态资源端口问题解决方案 当使用Nginx反向代理时,静态资源可能加载到默认80端口而非代理端口(如8888或9000),主要原因是后端URL生成逻辑未正确处理代理端口。 问题原因 静态资源路径硬编码,导致浏览器请求默认80端口 Nginx代理配置未正确传递端口信息,后端无法获取真实访问端口 解决方案 动态生成基础路径:后端根据请求动态生成包含正确协议、主机和端口的basePath Nginx配置优化: 设置proxy_set_header Host $host:$server_port
2025-12-30 14:47:05
801
原创 深入理解 PropertySource 与优先级:Spring Boot/Spring Cloud 配置体系的底层原理
本文深入剖析了Spring Boot/Cloud项目中配置加载的核心机制——PropertySource体系。通过分析Environment中的PropertySource有序列表,揭示了配置优先级的关键规则:列表越靠前的配置源优先级越高。文章结合实际项目打印结果,展示了本地文件(properties>yml>yaml)、Nacos配置(私有>共享)及系统变量的真实优先级顺序,并指出Nacos配置的优先级与spring.config.import声明顺序直接相关(后声明的优先级更高)。掌握
2025-12-30 14:43:03
1062
1
原创 Java 对象到底占多少内存?手算 new Object / int[2] / long[2] / new String(对象头·实例数据·对齐填充全拆解)
本文分析了四种Java对象在64位HotSpot JVM(开启指针压缩)下的内存占用情况: new Object():对象头12B(Mark Word 8B + Klass Pointer 4B),无实例数据,对齐填充4B,总计16B。 new int[2]:数组头16B(含length字段),实例数据8B(2个int元素),无需填充,总计24B。 new long[2]:数组头16B,实例数据16B(2个long元素),总计32B。 new String()(Java 9+):对象头12B,实例数据10B
2025-12-29 16:36:04
1016
原创 Java 内存溢出(OOM)排查实战指南:从复现到 MAT Dump 分析
摘要:本文介绍了Java中OOM(内存溢出)问题的排查方法。首先解释了OOM的常见类型和原因,包括堆空间不足、本地缓存无限增长、内存泄漏等。通过Demo演示了如何快速复现OOM并生成Heap Dump文件。重点讲解了使用MAT工具分析Dump的步骤:查看Leak Suspects报告、Histogram统计、Dominator Tree分析以及Path to GC Roots追踪引用链。最后给出了修复OOM的常见方法,如限制缓存大小、优化数据结构等。文章提供了完整的OOM排查流程,帮助开发者快速定位和解决内
2025-12-29 16:34:36
1035
原创 合理使用 instanceof:边界层的应用与业务层的避免
本文探讨了Java中instanceof的合理使用场景。指出instanceof并非设计缺陷,关键在于使用场景的选择。文章推荐在两个边界层场景中使用:1)DTO到VO的转换(仅做数据映射,不涉及业务逻辑);2)通用工具类(处理基础类型,无业务语义)。同时强调instanceof不应出现在业务核心层,而应使用多态。通过示例代码展示了安全使用方式,并提出判断原则:若用于"判断数据形态"则可用,若用于"决定对象行为"则应避免。最终结论是合理限制instanceof的使用范围
2025-12-26 10:02:05
596
原创 MySQL 分区表应用案例:优化数据管理与性能
本文探讨了MySQL分区表在医院管理系统中的应用,针对海量患者数据管理中的查询和删除性能问题提出解决方案。文章介绍了RANGE和LIST两种分区方式,并给出具体案例:1)按就诊年份分区,可高效查询和删除年度数据;2)按科室分区,能快速处理特定科室的数据操作。通过分区表技术,系统能够显著提升大数据量下的查询效率,实现快速历史数据清理,避免全表扫描和锁表问题。这种优化方法有效提高了医院数据库管理的性能和灵活性,适用于需要处理数亿条记录的场景。
2025-12-26 09:59:46
1032
原创 Maven <dependencyManagement>:如何在多模块项目中集中管理依赖版本
Maven的<dependencyManagement>功能是多模块项目管理的利器,它能集中管理所有子模块的依赖版本,确保项目一致性和可维护性。本文通过示例项目展示了如何通过父POM统一管理依赖版本,子模块只需引用依赖而无需指定版本号。这种方式有效避免了版本冲突问题,简化了依赖维护,特别适用于Spring Boot、Jackson等复杂依赖场景。合理使用<dependencyManagement>能显著提升多模块项目的开发效率和管理质量。
2025-12-25 17:23:21
768
原创 Spring AOP 中 JoinPoint 使用指南
JoinPoint是Spring AOP中获取方法运行时信息的核心接口,表示方法执行的切入点。它能获取方法参数、目标对象、代理对象、方法名、类名、方法签名、Method对象以及方法上的注解等信息。通过JoinPoint可以实现接口日志打印、幂等签名生成、参数校验、审计记录等常见功能。在AOP开发中,JoinPoint是注解驱动业务的基础,广泛应用于防重复提交、业务操作日志、权限校验等场景。要获取方法注解,需要先通过MethodSignature获取Method对象。JoinPoint作为AOP的"
2025-12-25 16:20:55
1025
原创 HTTP 状态码一览:理解 2xx、3xx、4xx 和 5xx 分类
HTTP状态码是3位数字代码,用于表示服务器对请求的处理结果。主要分为4类:2xx(成功,如200/201/204)、3xx(重定向,如301/302/304)、4xx(客户端错误,如400/401/403/404)和5xx(服务器错误,如500/502/503)。2xx表示请求成功处理,3xx需要客户端重定向,4xx是客户端请求错误,5xx则是服务器内部问题。开发中建议结合HTTP状态码和业务状态码使用,REST风格推荐查询成功返回200,创建成功201,删除成功204,参数错误400等。掌握状态码分类有
2025-12-25 09:53:19
1142
原创 StringRedisTemplate vs RedisTemplate:该怎么选?
本文系统对比了Spring Boot中StringRedisTemplate和RedisTemplate的核心区别与使用场景。关键点包括: 本质区别在于默认序列化方式:StringRedisTemplate使用字符串序列化,RedisTemplate默认使用JDK序列化 生产环境差异: StringRedisTemplate兼容redis-cli/Lua/多语言,安全可靠 默认RedisTemplate会导致数据不可读和Lua脚本失效 正确使用方式: 简单数据/Lua场景:优先使用StringRedisTe
2025-12-24 10:54:00
677
原创 Java 可变参数 Object... args 详解:原理、用法与实战场景
摘要: Java中的Object... args是可变参数(Varargs),本质是编译器自动转换为数组的语法糖,允许方法接收0到多个参数。它必须位于参数列表末尾,且方法内可直接作为数组使用。相比Object[],可变参数调用更简洁(可省略参数),适合API设计。常见于Spring、Redis等框架,如execute(script, keys, args...)支持灵活传参。需注意:可变参数永不为null,而显式传null会被视为单参数"null"。该特性提升了API的可用性和扩展性,是
2025-12-24 10:51:48
682
原创 Redis Lua 脚本核心语法详解:KEYS[1]、ARGV[1]、tonumber 是什么意思?
本文介绍了Redis Lua脚本中KEYS和ARGV参数的使用方法。KEYS数组用于存放Redis键名,其索引从1开始(Lua语言特性),在集群环境中帮助正确路由;ARGV数组存放普通参数,Redis会将所有参数转为字符串传入。重点强调了必须使用tonumber()函数将ARGV参数转换为数值类型才能进行数学运算,并给出了库存扣减的完整示例脚本。文章还指出了常见误区,如不区分KEYS和ARGV、不进行类型转换等。理解这三个核心概念(KEYS[1]、ARGV[1]和tonumber)是掌握Redis Lua脚
2025-12-24 10:29:37
654
原创 一次真实 GC 实验:Parallel 与 G1 在 `Xms < Xmx` 下的日志对比分析
本文基于Java 17,通过真实GC日志对比了Parallel GC和G1 GC在Xms<Xmx场景下的行为差异。实验使用持续创建1MB大对象的代码,发现Parallel GC在扩容时必然触发Full GC,导致频繁STW;而G1 GC虽能平滑扩容,但Humongous对象仍可能导致最终Compaction Full GC。研究表明,生产环境推荐Xms=Xmx:Parallel GC可避免扩容Full GC,G1 GC能预防Humongous Region耗尽风险。两种GC在不设等值时都会增加OOM风
2025-12-23 14:31:54
1044
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅