从JVM heap dump里查找没有关闭文件的引用
背景 最近排查一个文件没有关闭的问题,记录一下。 哪些文件没有关闭是比较容易找到的,查看进程的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 进程打开的文件...