0

0

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

雪夜

雪夜

发布时间:2025-07-22 10:34:28

|

779人浏览过

|

来源于php中文网

原创

前言

掌握以下几个方法,可以轻松应对内存溢出问题。本文将通过 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 的内存分析工具;下载地址:

图酷AI
图酷AI

下载即用!可以免费使用的AI图像处理工具,致力于为用户提供最先进的AI图像处理技术,让图像编辑变得简单高效。

下载

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

然后我们可以将转储文件导入 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 内存模型的方法了吗?是不是很简单?

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
eclipse教程
eclipse教程

php中文网为大家带来eclipse教程合集,eclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。php中文网还为大家带来eclipse的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

193

2023.06.14

eclipse怎么设置中文
eclipse怎么设置中文

eclipse设置中文的方法:除了设置界面为中文外,你还可以为Eclipse添加中文插件,以便更好地支持中文编程。例如,你可以安装EBNF插件来支持中文变量名,或安装Chinese Helper来提供中文帮助文档。本专题为大家提供eclipse设置中文相关的各种文章、以及下载和课程。

805

2023.07.24

c语言编程软件有哪些
c语言编程软件有哪些

c语言编程软件有GCC、Clang、Microsoft Visual Studio、Eclipse、NetBeans、Dev-C++、Code::Blocks、KDevelop、Sublime Text和Atom。更多关于c语言编程软件的问题详情请看本专题的文章。php中文网欢迎大家前来学习。

620

2023.11.02

Eclipse版本号有哪些区别
Eclipse版本号有哪些区别

区别:1、Eclipse 3.x系列:Eclipse的早期版本,包括3.0、3.1、3.2等;2、Eclipse 4.x系列:Eclipse的最新版本,包括4.0、4.1、4.2等;3、Eclipse IDE for Java Developers等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

180

2024.02.23

eclipse和idea有什么区别
eclipse和idea有什么区别

eclipse和idea的区别:1、平台支持;2、内存占用;3、插件系统;4、智能代码提示;5、界面设计;6、调试功能;7、学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

152

2024.02.23

eclipse设置中文全教程
eclipse设置中文全教程

本专题整合了eclipse设置中文相关教程,阅读专题下面的文章了解更多详细操作。

113

2025.10.10

eclipse字体放大教程
eclipse字体放大教程

本专题整合了eclipse字体放大教程,阅读专题下面的文章了解更多详细内容。

153

2025.10.10

eclipse左边栏不见了解决方法
eclipse左边栏不见了解决方法

本专题整合了eclipse左边栏相关教程,阅读专题下面的文章了解更多详细内容。

120

2025.10.15

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.3万人学习

Excel 教程
Excel 教程

共162课时 | 20.4万人学习

PHP基础入门课程
PHP基础入门课程

共33课时 | 2.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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