MST

星途 面试题库

面试题:Java中如何利用JVM自带工具分析内存泄漏

假设在一个Java项目中出现了内存泄漏的情况,简述如何使用JVM自带的工具(如jmap、jhat等)来分析定位内存泄漏的原因及发生位置。
41.5万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 生成堆转储文件
    • 使用jmap命令生成堆转储文件(.hprof文件)。例如,如果目标Java进程的PID为1234,可执行命令jmap -dump:format=b,file=heapdump.hprof 1234。这会将Java堆的当前状态以二进制格式转储到heapdump.hprof文件中。
  2. 启动jhat分析堆转储文件
    • 执行jhat heapdump.hprof命令,jhat工具会启动一个HTTP服务器,默认监听在端口7000。它会解析堆转储文件并提供一个基于网页的界面来浏览堆中的对象。
    • 打开浏览器,访问http://localhost:7000/,在页面中可以查看对象的类信息、对象数量、对象引用关系等。通常关注那些实例数量异常多或者占用内存过大的类,这可能是内存泄漏的可疑点。
  3. 使用jvisualvm(更强大的可视化工具)
    • 启动jvisualvm,它通常在JDK的bin目录下。
    • 连接到正在运行的Java进程(如果进程还在运行),或者直接打开之前生成的.hprof文件。
    • jvisualvm的“监视”标签页中,可以实时查看堆内存的使用情况,包括已用内存、最大内存等。
    • 切换到“线程”标签页,可以查看线程的运行状态,有时线程死锁等情况可能间接导致内存泄漏。
    • 在“堆Dump”部分,可以生成堆转储并进行分析。点击“分析堆Dump”,会打开一个新窗口,在这里可以像jhat一样查看对象的详细信息,但界面更友好直观。通过分析对象的引用树,找到那些没有被正常释放的对象及其引用路径,从而定位内存泄漏发生的位置。例如,如果发现某个类的对象数量持续增长且没有合理的业务逻辑解释,就需要深入查看该类对象的引用关系,看是否存在不必要的强引用导致对象无法被垃圾回收。