线上问题——频繁 Full GC 问题的排查思路
文章目录
- 一、查看 GC 日志
- 二、分析内存泄漏
- 三、检查对象生命周期
- 四、优化代码
- 五、调整垃圾回收策略
- 六、使用监控工具
一、查看 GC 日志
-
启用 GC 日志
- 在 Java 应用中,需要在启动参数中添加适当的参数来启用 GC 日志记录。可以使用-XX:+PrintGCDetails、-XX:+PrintGCDateStamps、-Xloggc:<log - path>参数。其中 -XX:+PrintGCDetails 会打印详细的 GC 信息,-XX:+PrintGCDateStamps会打印 GC 发生的时间戳,-Xloggc:<log - path>指定了 GC 日志的输出路径。
-
分析 GC 日志内容
- Full GC 频率:查看 GC 日志中 Full GC 发生的频率。如果 Full GC 过于频繁(例如,每分钟多次),则需要深入分析。
- Full GC 原因:
- 内存不足(Heap Space):如果日志中显示java.lang.OutOfMemoryError: Java heap space,说明应用程序创建的对象太多,导致堆内存不够用,从而触发 Full GC。
- 永久代 / 元空间(Permanent Generation / Metaspace)溢出:在旧版本的 Java 中,可能会出现java.lang.OutOfMemoryError: PermGen space,在 Java 8 及以后可能会出现java.lang.OutOfMemoryError: Metaspace。这表示类加载过多或者存在类加载器泄漏等问题,导致永久代或元空间被耗尽。
- System.gc () 调用:如果在日志中发现有Full GC(System),说明应用程序中显式调用了System.gc()方法。虽然在现代 JVM 中,System.gc()的调用不一定会立即触发 Full GC,但如果频繁调用,可能会导致 Full GC 频繁发生。
二、分析内存泄漏
- 使用内存分析工具
- Heap Dump 工具:例如,使用jmap -dump:format=b,file=<dump - file - path>命令可以生成堆快照(Heap Dump)文件。在生成堆快照时,要选择在 Full GC 发生后或者内存使用量较高时进行,这样能更准确地捕获问题。它可以打开堆快照文件,分析对象的引用关系、内存占用情况等。通过 MAT,可以查找那些占用大量内存且不应该存在的对象,例如:
- 大对象(Large Objects):MAT 可以帮助找到那些占用大量堆内存的单个对象。如果存在一些本应被回收但却一直存在的大对象,可能是内存泄漏的迹象。
- 对象引用链(Reference Chains):通过分析对象的引用链,可以发现那些意外被长引用链所保持的对象。例如,一个不再使用的对象可能通过一系列的强引用被保存在内存中,导致无法被垃圾回收。
- Heap Dump 工具:例如,使用jmap -dump:format=b,file=<dump - file - path>命令可以生成堆快照(Heap Dump)文件。在生成堆快照时,要选择在 Full GC 发生后或者内存使用量较高时进行,这样能更准确地捕获问题。它可以打开堆快照文件,分析对象的引用关系、内存占用情况等。通过 MAT,可以查找那些占用大量内存且不应该存在的对象,例如:
- 长期运行监控
- Java Flight Recorder(JFR):这是 JDK 自带的一个性能监控和事件记录工具。它可以在应用程序运行过程中持续监控内存使用情况、对象分配和回收情况等。通过 JFR,可以发现随着时间的推移,内存中对象数量和大小的异常增长情况,从而判断是否存在内存泄漏。
三、检查对象生命周期
- 审查代码中的对象引用
- 局部变量和方法参数:检查方法中的局部变量和参数,确保在不需要使用对象时,对象的引用能够及时超出作用域。例如,在方法结束后,方法内创建的局部对象应该能够被垃圾回收。
- 静态变量和单例对象:静态变量和单例对象的生命周期通常与应用程序的生命周期相同。因此,要特别注意这些对象所引用的其他对象。如果单例对象持有大量其他对象的引用,并且这些引用在不需要时没有被正确清理,可能会导致内存问题。
- 缓存管理
- 缓存策略审查:如果应用程序中使用了缓存机制,例如使用HashMap或其他缓存库来缓存数据,需要检查缓存的清除策略。如果缓存没有设置合理的过期时间或者最大容量限制,可能会导致缓存对象不断累积,最终引发 Full GC。
- 弱引用和软引用的使用:考虑在合适的场景下使用弱引用(WeakReference)或软引用(SoftReference)。弱引用的对象在下次垃圾回收时会被回收,软引用的对象在内存不足时会被回收。例如,对于一些可以重新加载或者重新创建的数据,可以使用弱引用或软引用进行缓存,以避免长期占用内存。
四、优化代码
- 对象创建模式优化
- 减少不必要的对象创建:例如,在循环中频繁创建字符串对象(如String s = new String(“constant - value”);)是一种低效的做法。可以使用字符串常量或者StringBuilder来优化这种情况。
- 对象池(Object Pooling)技术:对于一些创建成本高且可复用的对象,如数据库连接、线程等,可以考虑使用对象池技术。通过对象池,可以重复利用已经创建的对象,减少对象创建和销毁的频率。
- 优化数据结构和算法
- 选择合适的数据结构:根据应用程序的需求选择合适的数据结构。例如,如果需要频繁地在集合中查找元素,使用HashSet或HashMap可能比ArrayList更高效。如果需要按照顺序访问元素,ArrayList可能更合适。
- 算法复杂度分析:对代码中的算法进行复杂度分析。如果存在时间复杂度或空间复杂度较高的算法(如嵌套的多层循环、递归调用深度过深等),可能会导致大量对象的创建和内存占用。优化这些算法可以减少内存压力。
五、调整垃圾回收策略
-
选择合适的垃圾回收器
- Serial GC:适合单核 CPU 且内存较小的环境,简单且暂停时间较长。
- Parallel GC(Throughput Collector):适合对吞吐量要求较高的应用,能够充分利用多核 CPU 并行进行垃圾回收,但暂停时间可能较长。
- CMS(Concurrent Mark - Sweep)GC:适合对响应时间敏感的应用,它在垃圾回收过程中尽量减少应用程序的暂停时间,但可能会有更高的 CPU 使用率和内存碎片问题。
- G1(Garbage - First)GC:适用于大容量内存的服务器,它将堆内存划分为多个大小相等的区域(Region),在垃圾回收时可以优先回收垃圾最多的区域,兼具高吞吐量和低暂停时间的特点。
-
调整垃圾回收器参数
- 堆大小参数:-Xms和-Xmx分别用于设置初始堆大小和最大堆大小。合理设置这两个参数可以避免因堆空间过小导致频繁 Full GC,同时也避免因堆空间过大而浪费内存资源。
- 新生代和老年代比例:例如,-XX:NewRatio参数可以设置新生代和老年代的比例。调整这个比例可以影响对象在新生代和老年代之间的分配,进而影响垃圾回收的频率和效率。
- Survivor 区比例:-XX:SurvivorRatio参数用于设置 Eden 区和 Survivor 区的比例。合理的 Survivor 区比例可以确保在新生代中对象的复制和回收能够高效进行。
六、使用监控工具
-
实时监控内存使用情况
- VisualVM:这是一个免费的 Java 性能监控和分析工具。它可以连接到本地或远程的 Java 应用程序,实时监控堆内存、非堆内存、线程等的使用情况。通过 VisualVM,可以直观地看到内存使用量的变化趋势,以及 Full GC 发生的时间点和频率。
- JConsole:JDK 自带的监控工具,可以监控 Java 应用程序的运行时性能,包括内存使用、线程、类加载等。JConsole 可以帮助发现内存使用的异常情况,例如内存使用量突然急剧上升等。
-
分析监控数据
- 内存使用趋势分析:通过长期监控内存使用情况,分析内存使用量的增长趋势。如果发现内存使用量呈线性或指数增长,可能存在内存泄漏或其他内存相关问题。
- Full GC 与应用程序行为关联分析:将 Full GC 的发生时间与应用程序的业务操作进行关联分析。例如,如果每次执行某个特定的业务操作后都会引发 Full GC,那么很可能这个业务操作存在内存问题,如创建了大量对象或者持有了不必要的对象引用等。
相关文章:
线上问题——频繁 Full GC 问题的排查思路
文章目录 一、查看 GC 日志二、分析内存泄漏三、检查对象生命周期四、优化代码五、调整垃圾回收策略六、使用监控工具 一、查看 GC 日志 启用 GC 日志 在 Java 应用中,需要在启动参数中添加适当的参数来启用 GC 日志记录。可以使用-XX:PrintGCDetails、-XX:PrintGCD…...
《探秘 Qt Creator Manual 4.11.1》
《探秘 Qt Creator Manual 4.11.1》 一、Qt Creator 4.11.1 概述二、功能特性全解析(一)跨平台能力展示(二)代码编辑优势(三)版本控制集成(四)特定 Qt 功能呈现(五&#…...
level2逐笔委托查询接口
沪深逐笔委托队列查询 前置步骤 分配数据库服务器 查询模板 以下是沪深委托队列查询的请求模板: http://<数据库服务器>/sql?modeorder_book&code<股票代码>&offset<offset>&token<token>查询参数说明 参数名类型说明mo…...
在Linux系统安装配置 MySQL 和 hive,hive配置为远程模式
前提:已安装配置好了Hadoop环境,因为hive的底层是Hadoop 1 Mysql安装 搜索Centos7自带的mariadb rpm -qa|grep mariadb 卸载mariadb rpm -e mariadb-libs-5.5.64-1.el7.x86_64 --nodeps 再搜索一次看看是否还存在 rpm -qa|grep mariadb 安装mysql 创…...
如何写好一份科技报告
如何写好一份技术文档 一、科技报告写作的整体框架封面与摘要:引言:理论框架与文献综述:实验方法与材料:实验结果:结果分析与讨论:结论:参考文献:附录: 二、科技报告写作…...
ARM学习(38)多进程多线程之间的通信方式
ARM学习(38)ARM学习(38)多进程多线程之间的通信方式 一、问题背景 笔者在调试模拟器的时候,碰到进程间通信的问题,一个进程在等另外一个进程ready的时候,迟迟等不到,然后通过调试发现,另外一个进程变量已经变化了,但是当前进程变量没变化,需要了解进程间通信的方式…...
《图解机器学习》(杉山将著)第一部分绪论学习笔记
《图解机器学习》(杉山将著)第一部分绪论学习笔记 《图解机器学习》(杉山将著)第一部分绪论学习笔记一、什么是机器学习1.1 学习的种类1.2 机器学习任务的例子1.3 机器学习的方法 二、学习模型2.1 线性模型2.2 核模型2.3 层级模型…...
【WPF】RenderTargetBitmap的使用
在WPF(Windows Presentation Foundation)中,RenderTargetBitmap 是一个非常有用的类,它允许你将任何可视元素(如 UIElement 或 Visual 的实例)渲染到位图中。这在需要生成图像快照、导出可视化内容为图片文…...
编辑, 抽成组件
问题 错误思路: 1 dept不能修改, 用watch监听一下:赋值给新的变量进行修改, 问题: currentDept 发生改变, depth也发生了改变,因为是浅拷贝, 用了json.pase(json.stringify(value…...
使用C#绘制具有平滑阴影颜色的曼德布洛特集分形
示例使用复数类在 C# 中轻松绘制曼德布洛特集分形解释了如何通过迭代方程绘制曼德布洛特集:...
【批量生成WORD和PDF文件】根据表格内容和模板文件批量创建word文件,一次性生成多个word文档和批量创建PDF文件
如何按照Word模板和表格的数据快速制作5000个word文档 ? 在与客户的合作的中需要创建大量的合同,这些合同的模板大概都是一致的,是不是每次我们都需要填充不一样的数据来完成? 今天用表格数据完成合同模板的填充,批量…...
低延迟!实时处理!中软高科AI边缘服务器,解决边缘计算多样化需求!
根据相关统计,随着物联网的发展和5G技术的普及,到2025年,全球物联网设备连接数将达到1000亿,海量的计算数据使得传输到云端再处理的云计算方式显得更捉襟见肘。拥有低延迟、实时处理、可扩展性和更高安全性的边缘计算应运而生&…...
内旋风铣削知识再学习
最近被有不少小伙伴们问到蜗杆加工的一种方式——内旋风铣削加工。关于旋风铣之前出过一篇《什么是旋风铣?》,简要介绍了旋风铣(Whilring)的一些基本内容。本期再重新仔细聊一聊内旋风这种加工方式,可加工的零件种类&a…...
Redis 7.x如何安装与配置?保姆级教程
大家好,我是袁庭新。最新写了一套最新版的Redis 7.x企业级开发教程,今天先给大家介绍下Redis 7.x如何在Linux系统上安装和配置。 1 Redis下载与安装 使用非关系型数据库Redis必须先进行安装配置并开启Redis服务,然后使用对应客户端连接使用…...
SLAAC如何工作?
SLAAC如何工作? IPv6无状态地址自动配置(SLAAC)-常见问题 - 苍然满关中 - 博客园 https://support.huawei.com/enterprise/zh/doc/EDOC1100323788?sectionj00shttps://www.zhihu.com/question/6691553243/answer/57023796400 主机在启动或接口UP后,发…...
电脑丢失dll文件一键修复的多种方法分析,电脑故障修复攻略
电脑在使用过程中,有时会遇到DLL文件丢失的情况,这可能导致软件无法正常运行或系统出现故障。当面对这种状况时,不必过于慌张,因为有多种有效的修复方法可供选择。下面我们一起来看看电脑丢失dll文件的多种解决方法。 一.了解什么…...
Docker容器命令
docker 命令说明docker pull拉取镜像docker push推送镜像到DockerRegistrydocker images查看本地镜像docker rmi删除本地镜像docker run创建并运行容器(不能重复创建)docker stop停止指定容器docker start启动指定容器docker restart重新启动容器docker…...
【Leetcode 每日一题】3291. 形成目标字符串需要的最少字符串数 I
问题背景 给你一个字符串数组 w o r d s words words 和一个字符串 t a r g e t target target。 如果字符串 x x x 是 w o r d s words words 中 任意 字符串的 前缀(字符串的前缀是从字符串的开头开始并延伸到其中任意点的子串),则认为…...
Windows聚焦壁纸代理不更新——解除UWP应用回环限制
开代理后经常出现Microsoft store打不开,聚焦壁纸不更新的情况,因为UWP应用默认禁止回环地址,导致开了代理以后不仅用不了代理上网,还把自己的本来的通信堵死了 打开CMD输入 FOR /F "tokens11 delims\" %p IN (REG QUER…...
电脑开机提示error loading operating system怎么修复?
前一天电脑还能正常运行,但今天启动时却显示“Error loading operating system”(加载操作系统错误)。我已经仔细检查了硬盘、接线、内存、CPU和电源,确认这些硬件都没有问题。硬盘在其他电脑上可以正常使用,说明不是硬…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
