jvm排查问题-实践追踪问题 与思路--堆内堆外内存泄漏排查方针
概述
排查问题的一般思路是:现象 ——> 直接原因 ——>根本原因。
从问题现象出发,可以分为 应用逻辑问题、资源使用问题、虚拟机异常:
- 应用逻辑可能导致报错增加、死锁、程序退出等;
- 资源问题主要集中在CPU上升和内存上升(OOM Kill);
- 虚拟机问题通常包括GC问题、进程crash;
当然,不同的问题可能导向同一现象(比如crash和spring启动失败都会导致程序退出),从现象出发排查需要逐步验证、做排除法,最终定位根因。
1.0. 虚拟机行为排查
Java应用逻辑经由JVM虚拟机得以运行,JVM负责解释/编译 Java代码,并且管理运行时应用所需要的各种资源,维护应用状态。JVM的管理行为大多通过异步执行+Barrier的方式完成,不会对业务造成明显影响。但GC、Crash以及个别情况下的编译问题可能会对业务产生性能上的体感变化。
1.1. GC问题排查
1.1.1 GC算法
GC主要任务就是,自动回收掉应用不在需要的内存,保证应用程序运行过程中,使用内存可以控制在预设的Size范围内。由于Java进程的运行会持续伴随着内存分配,但Java用户几乎不需要主动归还内存,于是,归还内存的任务就交给了JVM,这个过程就叫做垃圾清理(Garbage Collect),且需要保证清理效率不低于应用使用内存的需求,否则就会出现积压,造成OOME的风险。
因此以时间维度来看,可以将Java运行分为3个阶段:
分配内存阶段 ——> 识别垃圾阶段 ——> 清理垃圾阶段;
如此一来,一个最简单的GC算法就出现了。我们进一步会考虑到,识别垃圾的同时能不能分配内存?清理垃圾的同时能不能也分配内存?如果我随时可以分配内存,那么GC不就影响不到应用运行了吗?JDK的发展就伴随着诸如此般优化,产生了不同的GC算法。
目前业界使用比较广泛的GC算法有:ParallelGC、G1GC、PauselessGC(Shenandoah && ZGC),小红书还有极个别场景使用Serial GC。这些GC算法的发展可以概述为几个方向:
- 【并发化(异步化)】:让更多GC的工作可以和应用同时并发进行,减少对应用运行的阻塞;例如G1的Concurrent Mark、ZGC的并发回收、异步GC log等;不管是哪种GC算法,都无法做到完全并发,这些无法与应用并发完成的工作会在STW(stop the world)中进行,STW的时长会导致应用的卡顿。
- 【并行化】:从 SerialGC 到 ParallelGC,JVM会开启多个GC线程同时完成GC任务。另外G1也是JDK9之后逐渐支持FullGC并行处理。并行处理GC可以降低JVM处在STW阶段的时长,降低对应用的影响。
- 【分代】:所有GC算法都基于分代假说成立而设立,对年轻代和老年代采取不同的策略可以大大减小GC的开销;新一代的ZGC和Shenandoah通常不分代,这是由于分代GC更难实现。JDK21已经Release分代Gen-ZGC,JDK25有机会Release分代Shenandoah;
- 【预测】:根据GC收集到的历史信息,预判未来应用行为,提前作出规划以满足更好的性能和卡顿要求。例如G1的动态预测、ZGC的Alloc Pacing等;

1.1.2 观察 GC 行为
监控
监控可以比较得看到GC变化趋势,快速定位问题时间点,从监控中通常可以获得几个GC指标:
GC频率

GC Pause时间(stw)

GC原因

各分区用量

对于RPC服务,GC频率、Pause、分区用量可以在 Xray 面板或调用链监控(Grafana)中找到,GC原因仅后者支持。
结合GC算法可以初步定位一些问题,例如:
- G1GC发生Old GC(也就是FGC)是异常行为,可以根据GC原因初步判断。
- GCCause::System.GC()则往往代表DirectMemory满了;
- GCCause::Metaspace Threshold代表metaspace不足需要扩充;
- GCCause::Evacuation Pause 代表对象分配过快,回收效率不匹配;
- 遇到Old GC问题,连续发生多次且Old区使用量不降低,基本可以确定为内存泄漏或内存size过大。接下来可以通过heapdump(1.1.3介绍)分析
- 如果使用Parallel GC,则发生Old GC为正常行为;仅需要关注GC次数/时间的变化曲线。
打开 GC Log
查看GC Log可以细致得知道历史时刻中GC的变化,根据GC变化反推产生变化的原因,从而定位具体问题。
使用JDK参数模版,默认会打开gc*,safepoint的info等级log,通过info log可以基本确定问题直接原因,有时继续定位根因需要进一步打开更多log,方式为:
//排查GC卡顿时间:打开gc+phases=debug
-Xlog:gc*=info,safepoint=info,gc+phases=debug:gc.log:time,tags,tid:filesize=20M相关文章:
jvm排查问题-实践追踪问题 与思路--堆内堆外内存泄漏排查方针
概述 排查问题的一般思路是:现象 ——> 直接原因 ——>根本原因。 从问题现象出发,可以分为 应用逻辑问题、资源使用问题、虚拟机异常: 应用逻辑可能导致报错增加、死锁、程序退出等;资源问题主要集中在CPU上升和内存上升(OOM Kill);虚拟机问题通常包括GC问题、进…...
网络层协议--ip协议
目录 引言 IP协议 协议头格式 16位标识与3位标志与13位片偏移讲解 网段划分(重要) DHCP技术 CIDR技术 特殊的IP地址 广播主机 IP地址的数量限制 私有IP地址和公网IP地址 路由:在复杂的网络结构中, 找出一条通往终点的路线 简单认识路由器 路由表生成算…...
【总结整理】 神经网络与深度学习 邱锡鹏 课后习题答案 扩展阅读链接
本文主要针对神经网络神经网络邱锡鹏 2~8 章的课后习题进行理解的过程中,搜索到的讲的会比较透彻的链接整理。适合有一定基础但是想了解更细的人阅读。 主要参考书籍 首先是本书pdf可在神经网络与深度学习获取; 主要参考的课后习题答案为nndl/solution…...
使用 Three.js 创建一个 3D 人形机器人仿真系统
引言 在这篇文章中,我们将探讨如何使用 Three.js 创建一个简单但有趣的 3D 人形机器人仿真系统。这个机器人可以通过键盘控制进行行走和转向,并具有基本的动画效果。 技术栈 HTML5Three.jsJavaScript 实现步骤 1. 基础设置 首先,我们需要…...
图像修复和编辑大一统 | 腾讯北大等联合提出BrushEdit:BrushNet进阶版来了
文章链接:https://arxiv.org/pdf/2412.10316 项目链接:https://liyaowei-stu.github.io/project/BrushEdit 亮点直击 提出了BrushEdit,这是先前BrushNet模型的高级迭代版本。BrushEdit通过开创基于修复(inpainting)的图…...
【hackmyvm】Adroit靶机wp
tags: HMVjava反编译SQL注入 1. 基本信息^toc 文章目录 1. 基本信息^toc2. 信息收集3. java反编译4. sql注入5. 解密密码6. 提权 靶机链接 https://hackmyvm.eu/machines/machine.php?vmAdroit 作者 alienum 难度 ⭐️⭐️⭐️⭐️️ 2. 信息收集 ┌──(root㉿kali)-[~] └…...
【Python运维】自动化备份与恢复系统的实现:Python脚本实战
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着信息化进程的加速,数据的重要性日益增加,数据丢失的风险也随之增加。为了保证数据安全,定期备份和及时恢复数据是必不可少的操作。本…...
Goland 安装与使用
GoLand安装 官方网址: JetBrains GoLand:不只是 Go IDE 1. 进入官网,点击下载: 2. 如下图一步步安装 3. 如下图一步步安装...
vue2 升级为 vite 打包
VUE2 中使用 Webpack 打包、开发,每次打包时间太久,尤其是在开发的过程中,本文记录一下 VUE2 升级Vite 步骤。 安装 Vue2 Vite 依赖 dev 依赖 vitejs/plugin-vue2": "^2.3.3 vitejs/plugin-vue2-jsx": "^1.1.1 vite&…...
FreeSwitch中启用WebRTC
在FreeSwitch中启用WebRTC需要进行一系列配置。以下是详细的步骤: 1. 安装必要的依赖: 确保安装了支持WebRTC的依赖库,如libsrtp。 2. 配置SIP Profile: 编辑 conf/sip_profiles/internal.xml 文件,添加或修改以下内…...
R语言的数据类型
标题:《探索R语言数据类型的奥秘》 引言: 在统计学和数据分析的世界里,R语言无疑是一颗璀璨的明星。它以其强大的数据处理能力和丰富的图形展示功能而受到广泛欢迎。然而,要熟练掌握并高效使用R语言,深入了解其数据类…...
基于UNET的图像分类
网络架构 UNet网络是一种革命性的图像分割架构,在图像分类任务中同样展现出卓越的性能。其独特的设计巧妙地平衡了全局信息捕捉和精细细节保留的需求,特别适合处理需要高度精确定位的任务。 UNet的核心设计理念体现在其 对称的编码器-解码器结构 中。这种结构不仅实现了高效…...
css文字折行以及双端对齐实现方式
使用flex布局后,文字超出容器部分不会自动折行了。实现代码如下: <el-row><el-col :span"24"><span class"label">姓名</span><span class"content">{{name}}</span></el-col>…...
华为云语音交互SIS的使用案例(文字转语音-详细教程)
文章目录 题记一 、语音交互服务(Speech Interaction Service,简称SIS)二、功能介绍1、实时语音识别2、一句话识别3、录音文件识别4、语音合成 三、约束与限制四、使用1、API2、SDK 五、项目集成1、引入pom依赖2、初始化 Client1)…...
设计一个监控摄像头物联网IOT(webRTC、音视频、文件存储)
前言: 设计一个完整的 监控摄像头物联网 IoT 平台 涉及 视频直播和点播、WebRTC 和 文件存储模块,可以分为以下几个主要部分:摄像头设备、服务端处理、Web 前端、视频流存储和回放。以下是结合这些技术的一个具体完整流程设计,涵盖…...
学习笔记(prism--视频【WPF-prism核心教程】)--待更新
《一》框架介绍 prism是一个用于WPF…和winUI中构建的松散耦合,可维护和可测试的应用程序框架。帮助WPF开发人员以简化编写,维护和扩展来设计应用程序。 优点:遵循特定的约定,可自动将view/ViewModel建立DataContext的关系&#…...
Kafka无锁设计
前言 在分布式消息队列系统中,Kafka 的无锁设计是其高吞吐量和高并发的核心优势之一。通过避免锁的竞争,Kafka 能够在高并发和大规模的生产环境中保持高效的性能。为了更好地理解 Kafka 的无锁设计,我们首先对比传统的队列模型,然后探讨 Kafka 如何通过无锁机制优化生产者…...
【GO基础学习】gin框架路由详解
文章目录 gin框架路由详解(1)go mod tidy(2)r : gin.Default()(3)r.GET()路由注册 (4)r.Run()路由匹配 总结 gin框架路由详解 先创建一个项目,编写一个简单的demo&#…...
GPIO+TIM(无PWM)实现呼吸灯功能
程序特点: 1、模块化,可快速移植,5分钟便可完成移植。 2、通过GPIO普通定时器,实现呼吸灯功能。 3、PWM周期为5ms,占空比调节时间为20ms,占空比为100等份,即呼吸灯从暗到亮需要20ms*1002s。 …...
贪心算法.
贪心算法是指只从当前角度出发,做出当前情景下最好的选择,在某种意义上来说是局部最优解,并不从全局的角度做决策.如果贪心策略选择不恰当,可能无法得到全局最优解. 贪心算法的基本流程如下: 1.分析问题,确定优化目标,对变量进行初始化 2.制定贪心策略:在制定贪心策略时需要…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
