登录社区云,与社区用户共同成长
邀请您加入社区
摘要: 本文记录了一次因JVM启动参数书写错误导致的线上服务启动卡死故障排查全过程。故障现象为服务启动后健康检查不通过,接口无响应。通过Arthas工具排查发现,JVM参数被错误放置在-jar之后导致全部失效,引发堆内存不足和FullGC风暴。修复后规范了启动参数顺序:JVM参数→探针→系统变量→jar包→应用参数,并验证GC指标恢复正常。文章提供了Arthas全套排查命令和线上启动脚本规范,强调
/ 注入指标注册器 @Resource private MeterRegistry meterRegistry;// 初始化业务计数器 public JvmDemoController(MeterRegistry registry) {// 每次访问计数器+1 return "JVM监控Demo服务运行正常";} }// 注入指标注册器 @Resource private MeterRegistr
场景存储位置/生命周期作用域/链接性初始化次数局部变量静态存储区(程序结束时才销毁)函数内部/作用域为函数范围1次(线程安全)全局变量/函数静态存储区本文件内部(内部链接)1次(程序启动时初始化)静态成员函数静态存储区(全局共享)类域(需外部定义)1次静态成员函数无this,属于类类域(通过类名调用)--
这篇博客为C++初学者整理了《C++语言程序设计教程》前四章的核心基础知识,重点包括: 数据类型与变量:介绍了整型、浮点型等基本数据类型及其用法 常量定义:对比了宏定义和const常量的区别,推荐使用const 运算符:详细讲解算术、关系、逻辑等运算符及其易错点 流程控制:通过实例演示了选择结构和循环结构的实现 综合案例:以九九乘法表为例展示知识点综合运用 常见错误:总结了初学者常犯的语法错误和改
ContextRefreshedEvent事件发生在WebServerInitializedEvent之后,此时初始化Bean时,服务已经被注册到注册中心,请求已经进来,但Bean还在初始化中,造成服务启动时接口响应慢、GC异常。通过监听Web容器的初始化完成事件注册服务,注册中心客户端(不限于Nacos)实现这个抽象类就会在 Web容器初始化完成后向注册中心注册服务。于是,每次配置发布,都可能引
日常开发优先选择实现 Runnable 接口,规避单继承限制,方便多线程共享资源,代码更灵活。
本文系统介绍 JVM 的核心机制,包括内存结构、类加载与垃圾回收。首先讲解堆、栈、程序计数器和元空间等内存区域的职责与常见 OOM 问题;随后分析类加载生命周期、双亲委派模型及其设计意义;最后介绍可达性分析、引用类型、GC 算法、分代回收策略以及 G1、ZGC 等主流垃圾回收器,并总结常用调优参数与故障排查工具,帮助开发者理解 JVM 运行原理并提升性能优化能力。
C++ 异常处理
本文主要针对 Hotspot VM 中“CMS + ParNew”组合的一些使用场景进行总结。重点通过部分源码对根因进行分析以及对排查方法进行总结,排查过程会省略较多,另外本文专业术语较多,有一定的阅读门槛,如未介绍清楚,还请自行查阅相关材料。在这里,我们把整个文章内容总结一下,方便大家整体地理解回顾。
Runnable 方式实现多线程和使用 Callable 和 FutureTask 实现多线程
显式在EndPlay中解绑委托是处理“短生命周期对象监听长生命周期对象事件”的黄金准则。即便 UE 的动态委托提供弱引用保护,主动清理能消除对象销毁顺序不确定性带来的隐患,确保系统稳定性。
摘要:本文介绍了C++异常处理机制的基本概念和使用方式。异常处理将问题检测与解决分离,相比C语言错误码更全面。主要内容包括:1)异常通过throw抛出对象,由匹配的catch捕获处理;2)栈展开过程描述异常沿调用链向上查找处理程序;3)异常匹配规则允许类型转换;4)异常可重新抛出给外层处理;5)C++标准库提供了exception基类及其继承体系,建议主函数捕获exception基类并调用what
本文记录了在使用JDK8+Spring+SpringMVC+Tomcat+JSP的老旧技术栈时遇到的ASM字节码问题。开发者在添加Stream API代码(Function.identity())后,因Spring依赖的老版本ASM4(仅支持Java7)无法处理Java8接口静态方法的INVOKESTATIC指令,导致BeanDefinitionStoreException异常。通过查阅ASM版本
集合框架是Java开发中很常用的框架,单线程下没什么问题,但是多线程下有很大的并发问题数据覆盖数据丢失扩容死循环(JDK7)因为 HashMap 本身没有任何同步机制,多线程下会有很大的并发安全问题全局元素数量 + 1检查元素总数是否超过扩容阈值,达到阈值触发多线程 resize新增元素返回 nullbaseCount + CounterCell = 分段计数避免热点 CAS。
2.2 模式:传统的垃圾收集器(如 Serial, Parallel, CMS)将堆内存划分为连续的三大块:年轻代(Eden + 2个 Survivor)和老年代(Old),G1将堆划分为多个大小相等的 Region,每个 Region 可以在逻辑上扮演 Eden、Survivor、Old 或 Humongous(大对象)区域,不严格要求连续分代,优先回收价值最大的 Region(垃圾最多),以可
/ ❌ 常见错误:用 DTO 做 key,但没重写 hashCode// 只重写了 equals,没重写 hashCode// 换个新的 query 对象(字段相同),取不出来// null ❌。
本文深入解析Java反射机制及其应用场景。通过支付系统案例引入反射概念,形象比喻反射为透视眼能力,能动态获取类信息并操作对象。文章详细介绍了获取Class对象的三种方式、反射的核心功能(创建对象、调用方法、修改字段等)及四大应用场景(JDBC驱动加载、Spring IOC/AOP、测试框架)。同时指出反射的缺点:性能损耗、破坏封装性、安全隐患等,并提供避坑指南。最后强调反射是Java动态性的基石,
用户咨询了一个java中cpu缓存伪共享场景, 他通过padding多个long 字段隔离 2 个volatile字段,但是实测效果没有提升。这是个比较有趣的场景,在 jdk8 有更稳定的方案去解决伪共享带来的性能问题。下面我们展开介绍。
通过上诉两个全局函数的实现代码可以看出,operator new实际上是通过malloc来申请空间的,如果malloc申请空间成功就直接返回,否则执行用户提供的空间不足的应对,如果用户提供该措施就继续申请,否则就抛异常。new和delete是用户进行动态内存申请和释放的操作符,operator new和 operator delete是系统提供的全局函数,new在底层调用operator new
继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。基类的公有成员,子类可以继承为自己的公有成员。在派生类可以访问,在外部也可以访问。基类的保护成员,子类可以继承为自己的保护成员,在派生类可
变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表,如下所示:在这里,type必须是一个有效的 C++ 数据类型,可以是 char、wchar_t、int、float、double、bool 或任何用户自定义的对象,可以由一个或多个标识符名称组成,多个标识符之间用逗号分隔。下面列出几个有效的声明:char c, ch;
/ << "\t最大值:" << (numeric_limits<string>::max)() << "\t最小值:" << (numeric_limits<string>::min)() << endl;
Java 26新特性摘要 Java 26带来了三大实用新特性: 结构化并发:StructuredTaskScope的正式转正解决了回调地狱问题,使并发代码更简洁。通过scope管理子任务,自动处理错误传播和任务取消,重构案例显示代码量减少40%。 Scoped Values:替代ThreadLocal的新型上下文传递机制,自动管理作用域生命周期,避免内存泄漏和线程池复用导致的数据污染问题,特别适合
Java多线程编程核心涵盖线程六种状态及转换机制,通过代码示例展示状态变化过程。线程安全问题源于调度随机性、共享变量修改、非原子操作、内存可见性和指令重排序五大因素,可通过synchronized保证原子性、volatile解决可见性、wait/notify实现线程协调。单例模式线程安全实现包括饿汉式的类加载初始化与懒汉式的双重检查锁定优化。典型问题如死锁需避免循环等待条件,注意sleep不释放锁
/ 通过注入的 clock 获取时间。// 新写法:直观、链式调用。对比维度│ 旧版java.util.Date│ 新版java.time.Instant。Date到底是 UTC 时间还是本地时间。// 旧写法 2:借助 Calendar(代码冗长)Instant类所有的计算和修改操作(如plus() ,minus()Instant只代表绝对时间线上的一个点(默认。
本周 JVM 生态密集更新:Spring AI 2.0 引入自纠错结构化输出,Spring Boot 3.5.16/Spring Data 2025.0.13 终结 3.5.x 系列,Quarkus 紧急修复 CVE-2026-50559,JetBrains 开源 120 亿参数 MoE 编程模型 Mellum2,Netflix 推出 AI 视频编辑模型 Vera 和 VOID,Oracle 发布
变量类型存储区域生命周期地址特征全局变量全局区程序启动→结束地址小,固定静态变量全局区程序启动→结束地址小,固定局部变量栈区函数开始→结束地址大,每次运行可能不同局部常量栈区函数开始→结束地址大,和局部变量相邻全局常量常量区程序启动→结束地址中,只读字符串常量常量区程序启动→结束地址中,只读1.2 程序运行后 **栈区:** 由编译器自动分配释放, 存放函数的参数值,局部变量等 注意事项:不
你打开自己三个月前写的Java代码,看着那个超过500行的Service类,里面充斥着各种switch-case和if-else嵌套,以及一个名叫的方法——这个方法内部做了数据校验、格式转换、业务计算、日志记录、邮件通知……你深吸一口气,意识到这就是人们常说的“屎山”的起点。更可怕的是,你突然发现无法迅速理解这段逻辑,更别提安心地修改它了。编写优质Java代码并非遥不可及,它源自于点滴编程习惯的积
经常编写着色器的同学应该对 swizzle(重排)语法非常熟悉,方便又灵活,可以说是用过一次便回味无穷。代码可惜的是,C++ 中并不存在这样的语法,但是可以利用语法特性来模拟它,基本的思路是使用一个代理类来存储被操作点的引用以及需要操作的位置信息。
不可变类型无法原地修改,只能通过重新赋值让变量指向新对象;字符串、元组的拼接、替换、切片操作,都会返回全新对象;想要实现原地修改效果,可以用列表等可变容器包裹不可变数据;globalnonlocal只是修改变量绑定关系,不是修改原始不可变对象。需要分别整理字符串、元组常用生成新对象的方法清单吗?
说说你遇到过的高并发场景,以及你是怎么调优JVM的?”这几乎是每一场Java高级面试的必答题。面试官不会满足于你背诵“堆内存分代”“GC算法”这些概念,他更想听到当你面对真实的生产环境——CPU飙升到99%、接口响应耗时超过10秒、应用每隔几小时就OOM重启——你是如何抽丝剥茧、用工具和思路一步步定位并解决的。今天我们不聊虚的,直接进入十几个经典问答,每一刀都砍在痛点上。
int为4个字节,根据规则,b存储的起始地址必须为其对齐模数4的整数倍,所以a后面自动填充空缺字节空间0x0001-0x0003,因此b存放于0x0004-0x0007中。long double是12个字节,由于32位系统每次最多分配4个字节,则首先分配0x0008-0x000B,由于不够存储空间,则继续分配0x000C-0x000F,仍然不满足存储c,则继续分配0x0010-0x0013,所以c
如果没有显式地进行初始化,那么默认情况下,变量的值是不确定的(即未定义行为)。在 C++ 中,变量的内存分配是在定义时进行的。当定义一个变量时,编译器会为其分配一定的内存空间,并将其类型和名称与变量名关联起来。1.声明:声明是指告诉编译器一个变量的类型和名称,但并不分配内存空间给该变量。2.定义:定义是指为一个变量分配内存空间并将其类型和名称与变量名关联起来。在 C++ 中,声明、定义、初始化、赋
本文深入剖析了Java线程创建对CPU缓存(L1/L2/L3)和TLB(页表缓存)的性能影响。作者结合OpenJDK 8源码,从硬件架构和虚拟机实现两个维度,详细分析了线程创建各阶段对系统缓存的冲击。关键发现包括:1)线程描述符分配导致缓存污染;2)全局锁竞争引发MESI协议开销;3)线程调度带来的缓存冷启动;4)栈内存分配触发的TLB抖动。文中通过源码注释特别指出了涉及缓存和TLB损耗的关键代码
使用 C/C++ 完成了基本仓库管理系统的编写,调试过程中未出现死循环或内存泄漏的 Bug。本次的设计只能算是完成了基础功能,包括出库入库与数据查询功能,但并未有附加功能以及数据库接口。通过这次课题使我巩固了我的编写程序的能力,使我对数据结构的构建有了更深的认知。
本文介绍了JVM内存模型的核心组成部分,包括程序计数器、Java虚拟机栈、本地方法栈、堆和方法区。重点解析了堆内存结构(新生代、老年代)和对象的内存布局(对象头、实例数据、对齐填充)。文章还探讨了直接内存的特点和使用场景,并提供了常见JVM内存参数的配置建议。最后通过示例程序演示如何观察内存分配情况,帮助开发者理解对象在JVM中的存储位置。掌握这些知识对Java性能调优和解决内存问题具有重要意义。
就是那些大部分时间在等待外部资源(比如等待网络响应、等待磁盘读写)的任务。比如:网络爬虫(等待服务器返回数据)文件读写(等待磁盘)数据库查询(等待数据库返回结果)在这些场景下,线程在等待I/O完成时会主动。
在 Java 应用的早期阶段(Java 6 之前),主流的垃圾回收器是和。:吞吐量优先,但会触发的 Full GC,停顿时间随堆增大而显著增加。CMS:以低延迟为目标,回收阶段与应用线程并发执行,但容易产生内存碎片,且在 JDK 9 已被废弃。随着大内存(>8GB)堆的普及以及云原生场景对可预测停顿时间停顿时间可预测(软实时)内存整理(无碎片)大堆友好的新型 GC这就是 G1 诞生的背景。空间连续
表格关键字作用是否需要初始化是否保留引用 /const适用场景auto定义变量,靠初始化推导类型必须初始化仅基础类型,丢弃引用迭代器、循环、lambda、简化长类型decltype查询任意表达式完整类型不需要变量初始化完整保留 const、&、左值属性模板返回值、提取复杂类型、精准保留修饰符C++11 新增,统一使用大括号{}做初始化,统一所有类型(普通变量、数组、结构体、类、容器)的初始化语法,
jvm
——jvm
联系我们(工作时间:8:30-22:00)
400-660-0108 kefu@csdn.net