从 JVM heap dump 里查找没有关闭文件的引用

2018 年 7 月 19 日 ImportNew

(点击上方公众号,可快速关注)


来源:Hengyunabc ,

hengyunabc.github.io/jvm-heap-dump-find-fd/


背景


最近排查一个文件没有关闭的问题,记录一下。


哪些文件没有关闭是比较容易找到的,查看进程的fd(File Descriptor)就可以。但是确定fd是在哪里被打开,在哪里被引用的就复杂点,特别是在没有重启应用的情况下。


在JVM里可以通过heap dump比较方便地反查对象的引用,从而找到泄露的代码。


以下面简单的demo为例,Demo会创建一个临时文件,并且没有close掉:


import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

public class Test {

public static void main(String[] args) throws IOException {

File tempFile = File.createTempFile("test", "ttt");

FileInputStream fi = new FileInputStream(tempFile);


System.in.read();

}

}


通过文件名查找对应的fd


进程打开的文件在OS里有对应的fd(File Descriptor),可以用lsof命令或者直接在linux下到/proc目录下查看。


以demo为例,可以找到test文件的fd是12:


$ ls -alh /proc/11278/fd/

total 0

dr-x------ 2 admin users  0 Jun 30 18:20 .

dr-xr-xr-x 8 admin users  0 Jun 30 18:20 ..

lrwx------ 1 admin users 64 Jun 30 18:20 0 -> /dev/pts/0

lrwx------ 1 admin users 64 Jun 30 18:20 1 -> /dev/pts/0

lr-x------ 1 admin users 64 Jun 30 18:24 11 -> /dev/urandom

lr-x------ 1 admin users 64 Jun 30 18:24 12 -> /tmp/test7607712940880692142ttt


对进程进行heap dump


使用jmap命令:


jmap -dump:live,format=b,file=heap.bin 11278


通过OQL查询java.io.FileDescriptor对象


对于每一个打开的文件在JVM里都有一个java.io.FileDescriptor对象。查看下源码,可以发现FileDescriptor里有一个fd字段:


public final class FileDescriptor {

    private int fd;


所以需要查找到fd等于12的FileDescriptor,QOL语句:


select s from java.io.FileDescriptor s where s.fd == 12


使用VisualVM里的OQL控制台查询

在jdk8里自带VisualVM,jdk9之后可以单独下载:https://visualvm.github.io/


把heap dump文件导入VisualVM里,然后在“OQL控制台”查询上面的语句,结果是:



再可以查询到parent,引用相关的对象。


使用jhat查询


除了VisualVM还有其它很多heap dump工具,在jdk里还自带一个jhat工具,尽管在jdk9之后移除掉了,但是个人还是比较喜欢这个工具,因为它是一个web接口的。


jhat -port 7000 heap.bin


访问 http://localhost:7000/oql/ ,可以在浏览器里查询OQL:



打开链接可以查看具体的信息


总结


  • 先找出没有关闭文件的fd

  • 从heap dump里据fd找出对应的java.io.FileDescriptor对象,再找到相关引用


链接


  • ViauslVM

    https://visualvm.github.io/

  • Object Query Language (OQL)

    http://cr.openjdk.java.net/~sundar/8022483/webrev.01/raw_files/new/src/share/classes/com/sun/tools/hat/resources/oqlhelp.html


【关于投稿】


如果大家有原创好文投稿,请直接给公号发送留言。


① 留言格式:
【投稿】+《 文章标题》+ 文章链接

② 示例:
【投稿】《不要自称是程序员,我十多年的 IT 职场总结》:http://blog.jobbole.com/94148/

③ 最后请附上您的个人简介哈~



看完本文有收获?请转发分享给更多人

关注「ImportNew」,提升Java技能

登录查看更多
1

相关内容

Java 虚拟机(Java Virtual Machine)是一个虚构出来的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。
【2020新书】实战R语言4,323页pdf
专知会员服务
98+阅读 · 2020年7月1日
【实用书】Python技术手册,第三版767页pdf
专知会员服务
229+阅读 · 2020年5月21日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
115+阅读 · 2020年5月10日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
223+阅读 · 2020年3月22日
100+篇《自监督学习(Self-Supervised Learning)》论文最新合集
专知会员服务
161+阅读 · 2020年3月18日
【资源】100+本免费数据科学书
专知会员服务
105+阅读 · 2020年3月17日
【新书】Java企业微服务,Enterprise Java Microservices,272页pdf
后渗透利用msf关闭防火墙
黑白之道
8+阅读 · 2019年8月24日
携程用ClickHouse轻松玩转每天十亿级数据更新
DBAplus社群
11+阅读 · 2019年8月6日
吐血整理!140种Python标准库、第三方库和外部工具都有了
炼数成金订阅号
14+阅读 · 2019年7月30日
Kali Linux 渗透测试:密码攻击
计算机与网络安全
15+阅读 · 2019年5月13日
去哪儿网开源DNS管理系统OpenDnsdb
运维帮
21+阅读 · 2019年1月22日
超级!超级!超级好用的视频标注工具
极市平台
8+阅读 · 2018年12月27日
浅谈浏览器 http 的缓存机制
前端大全
6+阅读 · 2018年1月21日
Neo4j 和图数据库起步
Linux中国
8+阅读 · 2017年12月20日
Arxiv
21+阅读 · 2019年3月25日
Semantics of Data Mining Services in Cloud Computing
Arxiv
4+阅读 · 2018年10月5日
Knowledge Based Machine Reading Comprehension
Arxiv
4+阅读 · 2018年9月12日
Arxiv
4+阅读 · 2018年4月29日
Arxiv
11+阅读 · 2018年1月18日
Arxiv
3+阅读 · 2012年11月20日
VIP会员
相关VIP内容
【2020新书】实战R语言4,323页pdf
专知会员服务
98+阅读 · 2020年7月1日
【实用书】Python技术手册,第三版767页pdf
专知会员服务
229+阅读 · 2020年5月21日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
115+阅读 · 2020年5月10日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
223+阅读 · 2020年3月22日
100+篇《自监督学习(Self-Supervised Learning)》论文最新合集
专知会员服务
161+阅读 · 2020年3月18日
【资源】100+本免费数据科学书
专知会员服务
105+阅读 · 2020年3月17日
【新书】Java企业微服务,Enterprise Java Microservices,272页pdf
相关资讯
后渗透利用msf关闭防火墙
黑白之道
8+阅读 · 2019年8月24日
携程用ClickHouse轻松玩转每天十亿级数据更新
DBAplus社群
11+阅读 · 2019年8月6日
吐血整理!140种Python标准库、第三方库和外部工具都有了
炼数成金订阅号
14+阅读 · 2019年7月30日
Kali Linux 渗透测试:密码攻击
计算机与网络安全
15+阅读 · 2019年5月13日
去哪儿网开源DNS管理系统OpenDnsdb
运维帮
21+阅读 · 2019年1月22日
超级!超级!超级好用的视频标注工具
极市平台
8+阅读 · 2018年12月27日
浅谈浏览器 http 的缓存机制
前端大全
6+阅读 · 2018年1月21日
Neo4j 和图数据库起步
Linux中国
8+阅读 · 2017年12月20日
相关论文
Top
微信扫码咨询专知VIP会员