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

  • 时间:
  • 浏览:3

除了VisualVM还有其它要是heap dump工具,在jdk里还自带2个jhat工具,尽管在jdk9完后 移除掉了,时会 此人 还是比较喜欢这俩工具,机会它是2个web接口的。

守护任务管理器打开的文件在OS里有对应的fd(File Descriptor),还都都能否用lsof命令机会直接在linux下到/proc目录下查看。

要是需用查找到fd等于12的FileDescriptor,QOL搞笑的话:

打开链接还都都能否查看具体的信息

再还都都能否查询到parent,引用相关的对象。

把heap dump文件导入VisualVM里,时会 在“OQL控制台”查询后边的搞笑的话,结果是:

以demo为例,还都都能否找到test文件的fd是12:

以下面简单的demo为例,Demo会创建2个临时文件,时会 没人close掉:

最近排查2个文件没人关闭的间题,记录一下。

对于每2个打开的文件在JVM里都是2个java.io.FileDescriptor对象。查看下源码,还都都能否发现FileDescriptor里2个fd字段:

什么文件没人关闭是比较容易找到的,查看守护任务管理器的fd(File Descriptor)就还都都能否。时会 选用fd是在哪里被打开,在哪里被引用的就错综复杂点,有点痛 是在没人重启应用的情况报告下。

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

访问 http://localhost:7000/oql/ ,还都都能否在浏览器里查询OQL:

使用jmap命令:

在jdk8里自带VisualVM,jdk9完后 还都都能否单独下载:https://visualvm.github.io/