Java内存泄漏排查

1. 堆内存快照导出


  1. 获取 Java 进程 ID

    • Windows:执行 jps 命令,或任务管理器查看,又或者执行 tasklist 命令。

      注意:当有多个 Java 进程时,任务管理器或 tasklist | findstr "java"无法区分特定进程,推荐使用 jps 命令

      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    • Linux

      docker exec -it <容器ID或容器名> bash		#容器启动需要先进入容器,非容器启动直接执行下一条命令
      ps -ef | grep java	#查找java进程的进程ID,或直接执行pgrep java查找,又或者直接执行JDK提供的jsp命令
      
  2. 使用 jmap 生成 Heap Dump 文件

    JDK 自带的一个命令行工具,可以用来生成 Java 进程的堆转储文件(heap dump),这个文件包含了 JVM 堆中所有对象的信息

    # 其中format=b表示输出为二进制格式,file=<output_file_path>指定输出文件的路径及名称,<pid>则是上一步找到的进程ID。
    jmap -dump:format=b,file="D:\Download\heap.prof" <pid>
    

2. 导入内存分析工具


常用的内存分析工具

  • VisualVM:VisualVM 是一个集成的工具,它允许开发者监控和分析Java应用程序的性能,包括内存使用情况、线程活动、编译器统计、垃圾收集行为等。VisualVM 随 JDK 发布一起提供,是一个非常强大的工具,适用于开发环境和生产环境的故障排查。

  • Eclipse Memory Analyzer (MAT):MAT 是一个专门用于分析 Java 应用程序内存消耗的工具。它可以从 JVM 中获取堆转储文件,并提供详细的内存分析报告,包括泄露检测、对象统计等。MAT 是一个独立的工具,可以离线分析堆转储文件。

  • IDEA Profiler:和 VisualVM 工具功能一致,但加载速度相当快,而且不占太多内存

推荐

当内存溢出时,如果-Xmx(最大堆内存大小)之前设置的很大,那么导出的 heap 文件也很大,因此堆内存分析时也会占用很大的内存

  • 如果自己能分析堆内存占用情况,推荐使用 IDEA Profiler(加载快,占用内存小)。
  • 如果需要工具自动分析,并提供泄露检测报告,推荐使用 MAT(加载慢,占用内存特别大,而且卡死过几次)。

JPS命令:https://blog.youkuaiyun.com/heihaozi/article/details/123441649


### Java内存泄漏排查的方法 对于Java应用程序而言,内存泄漏是一个严重的问题,其特征在于程序运行期间不断增长的内存消耗,这可能最终导致应用崩溃。为了有效应对这一现象,开发者可以采用多种策略和技术来识别并解决这些问题。 #### 工具的选择 JVisualVM 和 YourKit 是两款广泛使用的工具,在定位和修复内存泄漏方面表现出色[^1]。这两款工具有助于深入理解应用程序的行为模式及其资源利用情况: - **JVisualVM**: 这是一款免费且开源的应用性能监控平台,内置了丰富的插件支持,能够提供详尽的线程状态、垃圾回收统计以及堆转储分析等功能。 - **YourKit**: 提供更高级别的诊断特性,比如实时跟踪对象创建位置的能力,这对于追踪难以捉摸的对象泄露特别有用;同时还有强大的CPU采样器帮助优化算法效率。 #### 实践技巧 当怀疑存在内存泄漏时,可以通过以下方式着手调查: - 定期捕获heap dump文件,并对比不同时间点的数据差异,以此判断是否有异常增加的趋势; - 利用上述提到的专业软件监视GC活动频率及时长变化趋势,过高的收集次数可能是潜在问题信号之一; - 关注长期存活的大尺寸实例集合(如缓存),确保实现合理的淘汰机制防止无节制扩张; - 对可疑代码片段执行单元测试的同时开启详细的日志记录选项,便于事后审查具体行为路径。 ```java // 示例:设置 JVM 参数以启用 GC 日志输出 public class Main { public static void main(String[] args) { System.setProperty("java.vm.options", "-XX:+PrintGCDetails"); // 应用逻辑... } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值