中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

從JVM heap dump里查找沒有關(guān)閉文件的引用

2018-07-20    來源:importnew

容器云強勢上線!快速搭建集群,上萬Linux鏡像隨意使用

背景

最近排查一個文件沒有關(guān)閉的問題,記錄一下。

哪些文件沒有關(guān)閉是比較容易找到的,查看進程的fd(File Descriptor)就可以。但是確定fd是在哪里被打開,在哪里被引用的就復雜點,特別是在沒有重啟應用的情況下。
在JVM里可以通過heap dump比較方便地反查對象的引用,從而找到泄露的代碼。

以下面簡單的demo為例,Demo會創(chuàng)建一個臨時文件,并且沒有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對象。查看下源碼,可以發(fā)現(xiàn)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控制臺”查詢上面的語句,結(jié)果是:

再可以查詢到parent,引用相關(guān)的對象。

使用jhat查詢

除了VisualVM還有其它很多heap dump工具,在jdk里還自帶一個jhat工具,盡管在jdk9之后移除掉了,但是個人還是比較喜歡這個工具,因為它是一個web接口的。

jhat -port 7000 heap.bin

訪問?http://localhost:7000/oql/?,可以在瀏覽器里查詢OQL:

打開鏈接可以查看具體的信息

總結(jié)

  • 先找出沒有關(guān)閉文件的fd
  • 從heap dump里據(jù)fd找出對應的java.io.FileDescriptor對象,再找到相關(guān)引用

鏈接

  • ViauslVM
  • Object Query Language (OQL)

標簽: linux 代碼

版權(quán)申明:本站文章部分自網(wǎng)絡,如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:linux 查殺 stopped 進程

下一篇:linux 定時休眠