线上问题——频繁 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和电源,确认这些硬件都没有问题。硬盘在其他电脑上可以正常使用,说明不是硬…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...