内存泄漏问题排查

文章目录

1、获取内存泄漏程序的进程号

  ps -ef|grep java

2、查看该进程下内存对象类全名中包含bshms的对象个数

  ./jmap -histo 19655 |grep bshms

3、打开java控制台(命令jconsole),连接到该进程,切到“内存”tab页,点击右上角的“执行GC”按钮进行垃圾回收

4、重复步骤2,看下对象个数,一直增加不减少,和程序内部逻辑不一样的,就是内存泄漏的。

结合sort命令,来查看:一个JVM中什么类的实例最多?一个JVM中什么类的占用的合计容量最大?
统计实例最多的类 前十位有哪些?

jmap -histo 9989 | sort -n -r -k 2 | head -10 

Q:统计合计容量前十的类有哪些?

jmap -histo 121566 | sort -n -r -k 3 | head -10
jmap -histo:live 121566 | more

说明:
sort命令的部分参数含义解释如下

  • -n :使用“”纯数字”进行排序(默认是以文字类型来排序)
  • -r : 反向排序
  • -k :以那个区间(field)来进
排查 CentOS 系统中的内存泄漏问题通常涉及多个层面,包括系统级、应用级以及语言特定的分析工具。以下是几种常用的方法和工具,帮助定位和解决内存泄漏问题: ### 系统级排查工具 1. **`top` 和 `htop`** 这些工具可以实时查看系统中各个进程的内存使用情况。通过观察哪个进程的内存持续增长,可以初步判断是否是该进程导致了内存泄漏。 2. **`free`** 使用 `free -h` 可以查看系统的整体内存使用情况,包括物理内存和交换分区的使用情况。这对于判断系统是否因内存不足而使用了过多的交换空间非常有用。 3. **`vmstat`** `vmstat` 提供了关于系统虚拟内存统计信息的详细报告,包括页面交换、进程、CPU 活动等。通过 `vmstat 1` 可以每秒刷新一次内存状态。 4. **`sar`** `sar` 是系统活动报告工具,能够记录和报告系统资源使用情况,包括内存。可以使用 `sar -r` 查看内存使用的历史数据。 5. **`dmesg`** `dmesg` 可以查看内核日志,当系统发生 OOM(Out of Memory)时,内核会记录相关信息,通过 `dmesg | grep -i kill` 可以查看是否有进程因内存不足被杀死。 ### 应用级排查工具 1. **`valgrind`** `valgrind` 是一个强大的内存调试工具,特别适用于 C/C++ 应用程序。它可以帮助检测内存泄漏、非法内存访问等问题。 示例命令: ```bash valgrind --leak-check=full --show-leak-kinds=all ./your_application ``` 2. **`pmap`** `pmap` 可以显示进程的内存映射,帮助分析进程的内存使用情况。 示例命令: ```bash pmap -x <PID> ``` 3. **`gdb`** `gdb` 是 GNU 调试器,可以在程序运行时进行调试,查看内存状态。 示例命令: ```bash gdb -p <PID> ``` ### 语言特定的排查工具 1. **Python** - **`gc`**:Python 的垃圾回收模块,可以帮助检测循环引用等问题。 - **`tracemalloc`**:用于跟踪内存分配,帮助定位内存泄漏的具体位置。 - **`objgraph`**:可视化对象图,帮助理解对象之间的引用关系。 - **`pympler`**:提供内存分析功能,可以检测对象的大小变化。 2. **.NET Core** - **`dotMemory`**:JetBrains 提供的 .NET 内存分析工具,支持内存快照和比较功能。 - **`VisualVM`**:可以用于监控和分析 Java 应用程序的内存使用情况。 3. **Go** - **`pprof`**:Go 自带的性能分析工具,支持内存分析。可以通过 HTTP 接口获取内存快照。 - **`gperftools`**:Google 的性能分析工具,支持内存分析。 4. **C/C++** - **`AddressSanitizer`**:LLVM 提供的内存错误检测工具,可以检测内存泄漏、越界访问等问题。 - **`Electric Fence`**:用于检测内存越界访问的工具。 ### 日志和监控工具 1. **`syslog` / `journalctl`** 系统日志工具可以帮助查看内核和应用程序的日志,特别是当系统发生 OOM 时,内核会记录相关信息。 2. **`zabbix`** Zabbix 是一个企业级的监控工具,可以监控系统的内存使用情况,并设置告警。 3. **`Prometheus + Grafana`** Prometheus 是一个时间序列数据库,结合 Grafana 可以实现对系统内存使用情况的可视化监控。 4. **`SkyWalking`** SkyWalking 是一个应用性能监控(APM)工具,支持对分布式系统的内存使用情况进行监控和分析。 ### 案例分析 在实际的生产环境中,测试环境一切正常,但线上环境出现内存泄漏的情况较为常见。这通常是由于数据量或并发量增加导致的问题。可以通过以下步骤进行排查: 1. **查看内存使用情况**:使用 `top`、`htop` 或 `free` 查看系统的整体内存使用情况。 2. **定位异常进程**:找到内存使用增长最快的进程。 3. **使用 `pmap` 或 `valgrind`**:分析该进程的内存使用情况,定位内存泄漏的具体位置。 4. **生成内存快照**:使用语言特定的工具(如 `pprof`、`dotMemory` 等)生成内存快照,并进行比较分析。 5. **检查代码**:根据内存快照的结果,检查相关的代码逻辑,寻找可能导致内存泄漏的地方。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值