jvm排查问题-实践追踪问题 与思路--堆内堆外内存泄漏排查方针

概述

排查问题的一般思路是:现象 ——> 直接原因 ——>根本原因。
从问题现象出发,可以分为 应用逻辑问题、资源使用问题、虚拟机异常:

  1. 应用逻辑可能导致报错增加、死锁、程序退出等;
  2. 资源问题主要集中在CPU上升和内存上升(OOM Kill);
  3. 虚拟机问题通常包括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算法的发展可以概述为几个方向:

  1. 【并发化(异步化)】:让更多GC的工作可以和应用同时并发进行,减少对应用运行的阻塞;例如G1的Concurrent Mark、ZGC的并发回收、异步GC log等;不管是哪种GC算法,都无法做到完全并发,这些无法与应用并发完成的工作会在STW(stop the world)中进行,STW的时长会导致应用的卡顿。
  2. 【并行化】:从 SerialGC 到 ParallelGC,JVM会开启多个GC线程同时完成GC任务。另外G1也是JDK9之后逐渐支持FullGC并行处理。并行处理GC可以降低JVM处在STW阶段的时长,降低对应用的影响。
  3. 【分代】:所有GC算法都基于分代假说成立而设立,对年轻代和老年代采取不同的策略可以大大减小GC的开销;新一代的ZGC和Shenandoah通常不分代,这是由于分代GC更难实现。JDK21已经Release分代Gen-ZGC,JDK25有机会Release分代Shenandoah;
  4. 【预测】:根据GC收集到的历史信息,预判未来应用行为,提前作出规划以满足更好的性能和卡顿要求。例如G1的动态预测、ZGC的Alloc Pacing等;
    在这里插入图片描述

1.1.2 观察 GC 行为

监控

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

GC频率
在这里插入图片描述
GC Pause时间(stw)
在这里插入图片描述

GC原因
在这里插入图片描述

各分区用量

在这里插入图片描述

对于RPC服务,GC频率、Pause、分区用量可以在 Xray 面板或调用链监控(Grafana)中找到,GC原因仅后者支持。
结合GC算法可以初步定位一些问题,例如:

  1. G1GC发生Old GC(也就是FGC)是异常行为,可以根据GC原因初步判断。
  • GCCause::System.GC()则往往代表DirectMemory满了;
  • GCCause::Metaspace Threshold代表metaspace不足需要扩充;
  • GCCause::Evacuation Pause 代表对象分配过快,回收效率不匹配;
  1. 遇到Old GC问题,连续发生多次且Old区使用量不降低,基本可以确定为内存泄漏或内存size过大。接下来可以通过heapdump(1.1.3介绍)分析
  2. 如果使用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/945634.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CPT203 Software Engineering 软件工程 Pt.1 概论和软件过程(中英双语)

文章目录 1.Introduction1.1 What software engineering is and why it is important(什么是软件工程,为什么它很重要)1.1 We can’t run the modern world without software(我们的世界离不开软件)1.1.1 What is Soft…

【Java数据结构】LinkedList与链表

认识LinkedList LinkedList就是一个链表,它也是实现List接口的一个类。LinkedList就是通过next引用将所有的结点链接起来,所以不需要数组。LinkedList也是以泛型的方法实现的,所以使用这个类都需要实例化对象。 链表分为很多种,比…

从0入门自主空中机器人-2-2【无人机硬件选型-PX4篇】

1. 常用资料以及官方网站 无人机飞控PX4用户使用手册(无人机基本设置、地面站使用教程、软硬件搭建等):https://docs.px4.io/main/en/ PX4固件开源地址:https://github.com/PX4/PX4-Autopilot 飞控硬件、数传模块、GPS、分电板等…

详解MySQL在Windows上的安装

目录 查看电脑上是否安装了MySQL 下载安装MySQL 打开MySQL官网,找到DOWNLOADS 然后往下翻,找到MySQL Community(GPL) Downloads>> 然后找到MySQL Community Server 然后下载,选择No thanks,just start my download. 然后双击进行…

【git】(一)在vscode上使用git进行版本控制(结合指令、含示例)

vscode中的git插件将git操作从git指令简化到简单的图形界面操作,不用再去记忆git指令,操作简单直观了很多。第一次使用时,为了加深理解,我将一些基本操作和该操作底层使用的命令结合起来,并包含实例,方便学…

安卓入门二 Kotlin基础

Kotlin Kotlin的历史 Kotlin由Jet Brains公司开发设计,2011年公布第一版,2012年开源。 2016年发布1.0正式版,并且Jet Brains在IDEA加入对Kotlin的支持,安卓自此又有新的选择。 2019年谷歌宣布Kotlin成为安卓第一开发语言&#x…

【MATLAB第111期】基于MATLAB的sobol全局敏感性分析方法二阶指数计算

【MATLAB第111期】基于MATLAB的sobol全局敏感性分析方法二阶指数计算 一、简介 在MATLAB中计算Sobol二阶效应指数通常涉及到全局敏感性分析(Global Sensitivity Analysis, GSA),其中Sobol方法是一种流行的技术,用于评估模型输入…

线段树例题题解

卫星覆盖(NOI1997) 题面: SERCOI(Space-Earth Resource Cover-Observe lnstitute) 是一个致力于利用卫星技术对空间和地球资源进行覆盖观测的组织。现在他们研制成功一种新型资源观测卫星 -SERCOI-308。这种卫星可以…

FFmpeg 编码和解码

文章目录 音频格式AACADIF音频数据交换格式ADTS音频数据传输流 音频解码音频编码 视频格式H264GOP图像组I帧,P帧,B帧H264压缩技术H264压缩级别H264视频级别H264码流结构SPSPPS 解码视频编码视频 音频格式 AAC AAC全称 Advanced Audio Coding&#xff0…

vue 组件库二次封装

vue 组件库二次封装 需求背景:项目使用arco-design组件库,ui 界面对于单选有统一的界面, 对于封装组件有一个大原则就是我们应该尽量保持原有组件的接口,除了我们需要封装的功能外,我们不应该改变原有组件的接口&#…

Kafka 幂等性与事务

文章目录 幂等性实现机制配置使用局限性 事务使用场景配置使用实现机制事务过程事务初始化事务开始事务提交事务取消事务消费 幂等性 Producer 无论向 Broker 发送多少次重复的数据,Broker 端只会持久化一条,保证数据不丢失且不重复。 实现机制 通过引…

LVS 负载均衡原理 | 配置示例

注:本文为 “ LVS 负载均衡原理 | 配置” 相关文章合辑。 部分内容已过时,可以看看原理实现。 未整理去重。 使用 LVS 实现负载均衡原理及安装配置详解 posted on 2017-02-12 14:35 肖邦 linux 负载均衡集群是 load balance 集群的简写,翻…

CannotRetrieveUpdates alert in disconnected OCP 4 cluster解决

环境: Red Hat OpenShift Container Platform (RHOCP) 4 问题: Cluster Version Operator 不断发送警报,表示在受限网络/断开连接的 OCP 4 集群中无法接收更新。 在隔离的 OpenShift 4 集群中看到 CannotRetrieveUpdates 警报: …

详解从输入url到页面渲染

当你在浏览器中输入一个 URL 并按下回车键,浏览器会经历一系列步骤来加载并渲染页面。这些步骤包括 DNS 解析、缓存处理、建立连接、发送请求、接收响应、解析 HTML、构建 DOM 树和 CSSOM 树、执行 JavaScript、布局和绘制等。以下是这些步骤的详细解释,…

Linux(Centos 7.6)目录结构详解

Linux(Centos 7.6)是一个操作系统,其核心设计理念是将一切资源抽象为文件,即一切皆文件。比如系统中的硬件设备硬盘、网络接口等都被视为文件。Windows系统一般是分为C、D、E盘。而Linux(Centos 7.6)是以斜线"/"作为文件系统的开始目录&#x…

【蓝桥杯选拔赛真题85】python摆放箱子 第十五届青少年组蓝桥杯python选拔赛真题 算法思维真题解析

目录 python摆放箱子 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python摆放箱子 第十五届蓝桥杯青少年组python比赛选拔赛真题详细解析 一…

数据分析思维(六):分析方法——相关分析方法

数据分析并非只是简单的数据分析工具三板斧——Excel、SQL、Python,更重要的是数据分析思维。没有数据分析思维和业务知识,就算拿到一堆数据,也不知道如何下手。 推荐书本《数据分析思维——分析方法和业务知识》,本文内容就是提取…

小程序中引入echarts(保姆级教程)

hello hello~ ,这里是 code袁~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 🦁作者简介:一名喜欢分享和记录学习的在校大学生…

【SQLi_Labs】Basic Challenges

什么是人生?人生就是永不休止的奋斗! Less-1 尝试添加’注入,发现报错 这里我们就可以直接发现报错的地方,直接将后面注释,然后使用 1’ order by 3%23 //得到列数为3 //这里用-1是为了查询一个不存在的id,好让第一…

基于JAVA+SpringBoot+Vue的校园二手书交易平台

基于JAVASpringBootVue的校园二手书交易平台 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接🍅 …