JVM对象分配与程序崩溃排查
一、new
对象在 JVM 中的过程
在 JVM 中通过 new
关键字创建对象时,会经历以下步骤:
-
内存分配
对象的内存分配在 堆(Heap) 中,优先在 新生代(Young Generation) 的 Eden 区 分配。分配方式取决于堆内存是否规整:- 指针碰撞(Bump the Pointer):适用于内存规整的堆(如使用
-XX:+UseSerialGC
)。 - 空闲列表(Free List):适用于内存不规整的堆(如使用
-XX:+UseCMSGC
)。
- 指针碰撞(Bump the Pointer):适用于内存规整的堆(如使用
-
初始化零值
内存分配完成后,JVM 会将对象的所有字段初始化为零值(如int
初始化为 0,引用初始化为null
)。 -
设置对象头(Object Header)
对象头包含以下信息:- Mark Word:哈希码、GC 分代年龄、锁状态标志等。
- 类型指针:指向方法区中对象所属类的元数据。
-
执行构造函数(
<init>
)
调用对象的构造函数(用户编写的new
后的代码),完成字段的显式初始化。
二、对象从新生代晋升到老生代的条件
对象从新生代进入老生代的几种情况:
-
年龄阈值(MaxTenuringThreshold)
默认情况下,对象每经历一次 Minor GC 并存活,年龄加 1。当年龄超过阈值(默认15
,通过-XX:MaxTenuringThreshold
设置)时,晋升到老年代。 -
大对象直接进入老年代
通过-XX:PretenureSizeThreshold
设置阈值(如1MB
),大于该值的对象直接在老年代分配(避免在 Eden 区复制)。 -
Survivor 区动态年龄判断
如果 Survivor 区中 相同年龄的所有对象大小总和超过 Survivor 区的一半,则年龄大于等于该值的对象直接晋升到老年代。 -
Minor GC 后 Survivor 区空间不足
当 Survivor 区无法容纳 Minor GC 后存活的对象时,会通过 分配担保机制(Handle Promotion) 直接将对象转移到老年代。
三、CPU 和内存正常,但程序崩溃的排查方法
即使 CPU 和内存正常,程序崩溃仍可能由以下原因导致:
1. 内存泄漏或 OOM(OutOfMemoryError)
- 检查 JVM 日志:搜索
OutOfMemoryError
或java.lang.StackOverflowError
。 - 堆转储分析:通过
jmap -dump:format=b,file=heap.hprof <pid>
导出堆快照,用工具(如 MAT、VisualVM)分析内存泄漏。 - 元空间泄漏:检查是否有类加载器泄漏(如频繁生成动态类)。
2. 死锁或线程阻塞
- 线程转储分析:通过
jstack <pid>
或kill -3 <pid>
获取线程快照,检查是否有BLOCKED
状态的线程或死锁。 - 示例死锁日志:
Found one Java-level deadlock: Thread 1 waiting to lock Monitor@0x00007fcdd8003e58 (Object 0x000000076ab00000), Thread 2 holding Monitor@0x00007fcdd8003e58 (Object 0x000000076ab00000)
3. JVM 崩溃(Native 层错误)
- 检查
hs_err_pid<pid>.log
:JVM 崩溃时会生成错误日志,记录 Native 层错误(如 SIGSEGV)。 - 常见原因:JNI 代码错误、操作系统资源耗尽(如文件句柄数限制)。
4. 外部依赖故障
- 数据库连接池耗尽:检查日志中是否有
Connection pool is full
。 - 外部服务超时:通过链路追踪工具(如 SkyWalking)分析调用链。
5. 程序主动退出
- 检查代码中的
System.exit()
:是否有逻辑错误调用System.exit(0)
。 - 信号处理:检查是否捕获到
SIGTERM
或SIGINT
信号(如kill -15 <pid>
)。
6. 资源泄漏
- 文件句柄泄漏:通过
lsof -p <pid>
查看进程打开的文件数。 - Socket 泄漏:通过
netstat -anp | grep <pid>
检查未关闭的连接。
四、排查工具汇总
工具/命令 | 用途 |
---|---|
jstack <pid> | 获取线程快照,分析死锁/阻塞 |
jmap -heap <pid> | 查看堆内存分配情况 |
jstat -gcutil <pid> | 监控 GC 频率和耗时 |
jcmd <pid> GC.heap_dump | 生成堆转储文件 |
vmstat 1 | 监控系统资源(CPU、内存、IO) |
strace -p <pid> | 跟踪系统调用和信号 |
五、总结
- 对象分配:优先在 Eden 区,通过 GC 年龄或大对象策略进入老年代。
- 程序崩溃排查:优先检查 JVM 日志、线程快照、堆转储和系统资源限制。
相关文章:
JVM对象分配与程序崩溃排查
一、new 对象在 JVM 中的过程 在 JVM 中通过 new 关键字创建对象时,会经历以下步骤: 内存分配 对象的内存分配在 堆(Heap) 中,优先在 新生代(Young Generation) 的 Eden 区 分配。分配方式取决…...

OpenMCU(六):STM32F103开发板功能介绍
概述 距上一篇关于STM32F103的FreeRTOS博客的发布已经过去很长时间没有更新了。在这段时间内,大家可以看到博主发表了一系列的关于使用qemu 模拟实现STM32F103的博客,博主本来想借助qemu开发stm32F103相关的一些软件功能,博主开发出来并成功运…...
(自用)Java学习-5.12(Redis,B2C电商)
一、Redis 核心知识 缓存作用 提升性能:内存读写速度(读 10w/s,写 8w/s)远超 MySQL(读 3w/s,写 2w/s)减少数据库压力:通过内存缓存热点数据,避免频繁 SQL 查询分类&#…...

Rspack:字节跳动自研 Web 构建工具-基于 Rust打造高性能前端工具链
字节跳动开源了一款采用 Rust 开发的前端模块打包工具:Rspack(读音为 /ɑrspk/)。 据介绍,Rspack 是一个基于 Rust 的高性能构建引擎,具备与 Webpack 生态系统的互操作性,可以被 Webpack 项目低成本集成&a…...
深度解析LLM参数:Top-K、Top-p和温度如何影响输出随机性?
许多大模型具有推理参数,用于控制输出的“随机性”。常见的几个是 Top-K、Top-p,以及温度。 Top-p: 含义:Kernel sampling threshold. Used to determine the randomness of the results. The higher the value, the stronger t…...

高速系统设计实例设计分析
在上几章的内容中,我们从纯粹高速信号的理论分析,到 Cadence 工具的具体使用都做了详细的讲解和介绍。相信读者通过前面章节的学习,已经对高速系统的设计理念及 Cadence 相应的设计流程和工具有了一个基本的认识。但是,对于高速电…...

查看购物车
一.查看购物车 查看购物车使用get请求。我们要查看当前用户的购物车,就要获取当前用户的userId字段进行条件查询。因为在用户登录时就已经将userId封装在token中了,因此我们只需要解析token获取userId即可,不需要前端再传入参数了。 Control…...
疑难杂症:dex安装部署
方式一、源码包下载 wget https://github.com/dexidp/dex/archive/refs/tags/v2.42.1.tar.gz 方式二、git方式拉取源码编译: Getting Started | $ git clone https://github.com/dexidp/dex.git 编译 $ cd dex/ $ make build 启动 ./bin/dex serve examples/…...
【idea】快捷键ctrl+shift+F(Find in files)不起作用
问题描述 在idea中使用快捷键CtrlShiftF,进行内容的搜索,但是弹不出对话框、或有时候能弹出有时候又弹不出。 原因分析 1.怀疑是缓存问题?--清空缓存重启也没什么作用 2.怀疑是idea的问题?--有时行、有时不行,而且…...

开发工具分享: Web前端编码常用的在线编译器
1.OneCompiler 工具网址:https://onecompiler.com/ OneCompiler支持60多种编程语言,在全球有超过1280万用户,让开发者可以轻易实现代码的编写、运行和共享。 OneCompiler的线上调试功能完全免费,对编程语言的覆盖也很全&#x…...
EnumUtils:你的枚举“变形金刚“——让枚举操作不再手工作业
各位枚举操控师们好!今天要介绍的是Apache Commons Lang3中的EnumUtils工具类。这个工具就像枚举界的"瑞士军刀",能让你的枚举操作从石器时代直接跃迁到星际文明! 一、为什么需要EnumUtils? 手动操作枚举就像…...

智启未来:新一代云MSP管理服务助力企业实现云成本管理和持续优化
在数字化转型浪潮下,企业纷纷寻求更高效、更经济的运营方式。随着云计算技术的深入应用,云成本优化已成为企业普遍关注的核心议题。 过去,传统云运维服务往往依赖于人力外包,缺乏系统性、规范性的管理,难以有效降低云…...

window 显示驱动开发-将虚拟地址映射到内存段(二)
在将虚拟地址映射到段的一部分之前,视频内存管理器调用显示微型端口驱动程序的 DxgkDdiAcquireSwizzlingRange 函数,以便驱动程序可以设置用于访问可能重排的分配位的光圈。 驱动程序既不能将偏移量更改为访问分配的 PCI 光圈,也不能更改分配…...
C++:构造函数
构造函数是类的六个默认成员函数之一,这里的默认是指我们不写,编译器会自己生成的。 构造函数其目的是初始化对象,不是开空间。 其特征如下: 1.函数名与类名相同 2.没有返回值,意思是不用在函数前面写void。 3.对…...

【文心智能体】使用文心一言来给智能体设计一段稳定调用工作流的提示词
🌹欢迎来到《小5讲堂》🌹 🌹这是《文心智能体》系列文章,每篇文章将以博主理解的角度展开讲解。🌹 🌹温馨提示:博主能力有限,理解水平有限,若有不对之处望指正࿰…...

K8S中构建双架构镜像-从零到成功
背景介绍 公司一个客户的项目使用的全信创的环境,服务器采用arm64的机器,而我们的应用全部是amd64的,于是需要对现在公司流水线进行arm64版本的同步镜像生成。本文介绍从最开始到最终生成双架构的全部过程,以及其中使用的相关配置…...
pth的模型格式怎么变成SafeTensors了?
文章目录 背景传统模型格式的安全隐患效率与资源瓶颈跨框架兼容性限制Hugging Face 的解决方案:SafeTensors行业与社区的推动SafeTensors 的意义总结 背景 最近要找一些适合embedding的模型,在huggingface模型库上看到一些排名比较靠前的,准…...
iOS safari和android chrome开启网页调试与检查器的方法
手机开启远程调试教程(适用于 Chrome / Safari) 前端移动端调试指南|适用 iPhone 和 Android|WebDebugX 出品 本教程将详细介绍如何在 iPhone 和 Android 手机上开启网页检查器,配合 WebDebugX 实现远程调试。教程包含…...

c语言第一个小游戏:贪吃蛇小游戏03
我们为贪吃蛇的节点设置为一个结构体,构成贪吃蛇的身子的话我们使用链表,链表的每一个节点是一个结构体 显示贪吃蛇身子的一个节点 我们这边node就表示一个蛇的身体 就是一小节 输出结果如下 显示贪吃蛇完整身子 效果如下 代码实现 这个hasSnakeNode(…...
大规模预训练范式(Large-scale Pre-training)
大规模预训练指在巨量无标注数据上,通过自监督学习训练大参数量的基础模型,使其具备通用的表征与推理能力。其重要作用如下: 一 跨任务泛化 单一模型可在微调后处理多种NLP(自然语言处理)、CV(计算机视觉…...
基于Flink的用户画像 OLAP 实时数仓统计分析
1.基于Flink的用户画像 OLAP 实时数仓统计分析 数据源是来自业务系统的T日数据,利用kakfa进行同步 拼接多个事实表形成大宽表,优化多流Join方式,抽取主键和外键形成主外键前置层,抽取外键和其余内容形成融合层,将4次事…...
React Native踩坑实录:解决NativeBase Radio组件在Android上的兼容性问题
React Native踩坑实录:解决NativeBase Radio组件在Android上的兼容性问题 问题背景 在最近的React Native项目开发中,我们的应用在iOS设备上运行良好,但当部署到Android设备时,进入语言设置和隐私设置页面后应用崩溃。我们遇到了…...
iptables实现DDos
最近有客户要定制路由器的默认防火墙等级,然后涉及到了DDos规则,对比客户提供的规则发现我们现有的规则存在明显的错误,在此记录一下如何使用iptables防护DDoS攻击 直接贴一下规则 #开启TCP SYN Cookies 机制 sysctl -w net.ipv4.tcp_synco…...

WPF之高级绑定技术
文章目录 引言多重绑定(MultiBinding)基本概念实现自定义IMultiValueConverterMultiBinding在XAML中的应用示例使用StringFormat简化MultiBinding 优先级绑定(PriorityBinding)基本概念PriorityBinding示例实现PriorityBinding的后…...

调出事件查看器界面的4种方法
方法1. 方法2. 方法3. 方法4....

使用vite重构vue-cli的vue3项目
一、修改依赖 首先修改 package.json,修改启动方式与相应依赖 移除vue-cli并下载vite相关依赖,注意一些peerDependency如fast-glob需要手动下载 # 移除 vue-cli 相关依赖 npm remove vue/cli-plugin-babel vue/cli-plugin-eslint vue/cli-plugin-rout…...
Go-GJSON 组件,解锁 JSON 读取新姿势
现在的通义灵码不但全面支持 Qwen3,还支持配置自己的 MCP 工具,还没体验过的小伙伴,马上配置起来啦~ https://click.aliyun.com/m/1000403618/ 在 Go 语言开发领域,json 数据处理是极为常见的任务。Go 标准库提供了 encoding/jso…...
Java详解LeetCode 热题 100(14):LeetCode 56. 合并区间(Merge Intervals)详解
文章目录 1. 题目描述2. 理解题目3. 解法一:排序 + 一次遍历法3.1 思路3.2 Java代码实现3.3 代码详解3.4 复杂度分析3.5 适用场景4. 解法二:双指针法4.1 思路4.2 Java代码实现4.3 代码详解4.4 复杂度分析4.5 与解法一的比较5. 解法三:TreeMap法5.1 思路5.2 Java代码实现5.3 …...
将Docker镜像变为可执行文件?体验docker2exe带来的便捷!
在现代软件开发中,容器化技术极大地改变了应用程序部署和管理的方式。Docker,作为领先的容器化平台,已经成为开发者不可或缺的工具。然而,对于不熟悉Docker的用户来说,接触和运行Docker镜像可能会是一个复杂的过程。为了解决这一问题,docker2exe项目应运而生。它提供了一…...
ev_loop_fork函数
libev监视器介绍:libev监视器用法-CSDN博客 libev loop对象介绍:loop对象-CSDN博客 libev ev_loop_fork函数介绍:ev_loop_fork函数-CSDN博客 libev API吐血整理:https://download.csdn.net/download/qq_39466755/90794251?spm1001.2014.3…...