欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识
原文出处: Hengyunabc

配景

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

哪些文件没有封锁是较量容易找到的,昆山软件开发,查察历程的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节制台”查询上面的语句,功效是:

可是确定fd是 <a href=昆山软件开拓 在那边被打开" class="aligncenter size-full wp-image-29100" title="visualvm-query" src="/uploads/allimg/c180718/1531UO2b6230-12U2.png" />

再可以查询到parent,劳务派遣管理系统,引用相关的工具。

可是确定fd是 <a href=昆山软件开拓 在那边被打开" class="aligncenter size-full wp-image-29101" title="visualvm-object" src="/uploads/allimg/c180718/1531UO2c1620-24633.png" />

利用jhat查询

除了VisualVM尚有其它许多heap dump东西,在jdk里还自带一个jhat东西,尽量在jdk9之后移除去了,可是小我私家照旧较量喜欢这个东西,因为它是一个web接口的。

jhat -port 7000 heap.bin

会见 http://localhost:7000/oql/ ,可以在欣赏器里查询OQL:

可是确定fd是 <a href=昆山软件开拓 在那边被打开" class="aligncenter size-full wp-image-29102" title="jhat-query" src="/uploads/allimg/c180718/1531UO2c5640-34140.png" />

打开链接可以查察详细的信息

可是确定fd是 <a href=昆山软件开拓 在那边被打开" class="aligncenter size-full wp-image-29103" title="jhat-object" src="/uploads/allimg/c180718/1531UO2cM20-41648.png" />

总结

  • 先找出没有封锁文件的fd
  • 从heap dump里据fd找出对应的java.io.FileDescriptor工具,再找到相关引用
  • 链接

  • ViauslVM
  • Object Query Language (OQL)