首页 > 运维 > linux运维 > 正文

掌握这几点,让你轻松搞定内存泄露、内存溢出!

雪夜
发布: 2025-07-22 10:34:28
原创
779人浏览过

前言

掌握以下几个方法,可以轻松应对内存溢出问题。本文将通过 Windows 和 Linux 系统的示例来展示这些方法。有人可能会问,为什么要介绍 Windows 版本?因为目前市场上仍然有很多 Windows 服务器,广泛应用于传统行业、政府机构和医疗行业等领域。展示两个系统的情况,以备不时之需。

此外,本文将使用两个工具:Processor Explorer 和 MAT。关于它们的具体用途和介绍不在本文讨论范围内,有兴趣的朋友可以自行学习。

在 CPU 占用率接近 100% 的情况下,我们将展示如何排查和解决问题。

Windows 服务器

1、找到 CPU 占用率最高的 Java 进程号

掌握这几点,让你轻松搞定内存泄露、内存溢出!进程号(PID):20260

2、根据进程号找到 CPU 占用率最高的线程号

双击刚才找到的 Java 进程

掌握这几点,让你轻松搞定内存泄露、内存溢出!线程号:15900,转为十六进制:3e1c

3、使用 jstack 生成虚拟机中所有线程的快照

命令:jstack -l {pid} > {path}

掌握这几点,让你轻松搞定内存泄露、内存溢出!文件路径:D:\20260.stack

4、分析线程快照

首先浏览快照内容

掌握这几点,让你轻松搞定内存泄露、内存溢出!快照内容格式统一,我们以一个线程快照为例进行说明

"main" #1 prio=5 os_prio=0 tid=0x0000000002792800 nid=0x3e1c runnable 0x00000000025cf000

掌握这几点,让你轻松搞定内存泄露、内存溢出!我们之前找到 CPU 占用率最高的线程号:15900,十六进制:3e1c,在快照文件中搜索 3e1c

掌握这几点,让你轻松搞定内存泄露、内存溢出!至此,问题已找到

掌握这几点,让你轻松搞定内存泄露、内存溢出!Linux 服务器

排查方法与 Windows 类似,仅命令有所不同

1、找到 CPU 占用率最高的 Java 进程号

使用命令:top -c 显示运行中的进程列表信息,shift + p 按 CPU 使用率排序显示

掌握这几点,让你轻松搞定内存泄露、内存溢出!进程号(PID)为 2227 的进程 CPU 使用率最高

2、根据进程号找到 CPU 占用率最高的线程号

使用命令:top -Hp {pid},同样 shift + p 可按 CPU 使用率对线程列表进行排序

掌握这几点,让你轻松搞定内存泄露、内存溢出!进程号(PID)为 2228 的线程消耗 CPU 最高,十进制的 2228 转为十六进制为 8b4

3、使用 jstack 生成虚拟机中所有线程的快照

掌握这几点,让你轻松搞定内存泄露、内存溢出!4、分析线程快照

分析方法与 Windows 版一致,可以将 2227.stack 文件下载到本地进行分析,也可以在 Linux 上直接分析

在 Linux 上分析,命令:cat 2227.stack |grep '8b4' -C 5

掌握这几点,让你轻松搞定内存泄露、内存溢出!至此,问题已定位

掌握这几点,让你轻松搞定内存泄露、内存溢出!无论是在 Windows 还是 Linux 下,排查步骤都是一致的

掌握这几点,让你轻松搞定内存泄露、内存溢出!好了,开始优化程序吧!

3 内存泄漏

同样,我们将在 Windows 和 Linux 各展示一个示例

Windows 服务器

1、找到内存占用率最高的进程号 PID

掌握这几点,让你轻松搞定内存泄露、内存溢出!乍一看,IDEA 的内存占用率最高,因为我是通过 IDEA 启动的 Java 进程;我们无需关注 IDEA 进程,找到内存占用率最高的 Java 进程号(PID):10824

2、使用 jmap 生成堆转储快照

命令:jmap -dump:format=b,file={path} {pid}

掌握这几点,让你轻松搞定内存泄露、内存溢出!转储文件路径:D:\heapdump_108244.hprof

3、使用 MAT 分析转储文件

MAT:Memory Analyzer Tool,是针对 Java 的内存分析工具;下载地址:

掌握这几点,让你轻松搞定内存泄露、内存溢出!选择合适的版本,下载后直接解压;默认情况下,MAT 的最大内存为 1024m,而我们的转储文件通常大于 1024m,因此需要调整。在 MAT 的 home 目录下找到 MemoryAnalyzer.ini,将 -Xmx1024m 修改为大于转储文件大小的值,我将其改为 -Xmx4096m

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online 193
查看详情 Find JSON Path Online

然后我们可以将转储文件导入 MAT 中,开始解析转储文件

掌握这几点,让你轻松搞定内存泄露、内存溢出!解析过程可能较为漫长,需要耐心等待...

解析完成后,我们可以看到如下概况界面

掌握这几点,让你轻松搞定内存泄露、内存溢出!各个窗口的细节不做详细介绍,有兴趣的可自行查阅资料;我们来看几个图:饼状图、直方图、支配树、可疑的内存泄漏报告。

饼状图

掌握这几点,让你轻松搞定内存泄露、内存溢出!可以看出,com.lee.schedule.Schedule 对象占用了 1G 内存,显然有问题

直方图

掌握这几点,让你轻松搞定内存泄露、内存溢出!我们看一下 Person 的定义

掌握这几点,让你轻松搞定内存泄露、内存溢出!可以想象,上图标记的几项都与 Person 相关

支配树

掌握这几点,让你轻松搞定内存泄露、内存溢出!这非常直观,Schedule 中的 ArrayList 占了 99.04% 的内存

可疑的内存泄漏报告

掌握这几点,让你轻松搞定内存泄露、内存溢出!通过这些数据,大家应该能找到问题所在了

掌握这几点,让你轻松搞定内存泄露、内存溢出!Linux 服务器

排查方法与 Windows 类似,仅命令略有不同

1、找到内存占用率最高的进程号

使用命令:top -c 显示运行中的进程列表信息,shift + m 按内存使用率排序

掌握这几点,让你轻松搞定内存泄露、内存溢出!进程号:2527

2、使用 jmap 生成堆转储快照

命令:jmap -dump:format=b,file={path} {pid}

掌握这几点,让你轻松搞定内存泄露、内存溢出!堆转储快照文件路径:/opt/heapdump_2527.hprof

3、使用 MAT 分析堆转储快照

将 heapdump_2448.phrof 文件下载到本地,使用 MAT 进行分析;分析过程与 Windows 版完全一致

至此,问题已定位

Windows 和 Linux 下的排查流程是相同的

掌握这几点,让你轻松搞定内存泄露、内存溢出!至此,已找到导致内存溢出的代码。

4 总结

JVM 常用命令

jps:列出正在运行的虚拟机进程

jstat:监视虚拟机各种运行状态信息,可以显示虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据

jinfo:实时查看和调整虚拟机各项参数

jmap:生成堆转储快照,也可以查询 finalize 执行队列、Java 堆和永久代的详细信息

jstack:生成虚拟机当前时刻的线程快照

jhat:虚拟机堆转储快照分析工具

与 jmap 搭配使用,分析 jmap 生成的堆转储快照,与 MAT 的作用类似

排查步骤

1、首先找到对应的进程:PID

2、生成线程快照 stack(或堆转储快照:hprof)

3、分析快照(或堆转储快照),定位问题

内存泄漏、内存溢出和 CPU 100% 的关系

掌握这几点,让你轻松搞定内存泄露、内存溢出!常用的 JVM 性能检测工具

Eclipse Memory Analyzer、JProfile、JProbe Profiler、JVisualVM、JConsole、Plumbr,你学会了如何玩转 JVM 内存模型的方法了吗?是不是很简单?

以上就是掌握这几点,让你轻松搞定内存泄露、内存溢出!的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号