Java 如何发现我的应用程序在何处打开更多文件(打开的文件太多)?

Java 如何发现我的应用程序在何处打开更多文件(打开的文件太多)?,java,heap-dump,Java,Heap Dump,我做了一个脚本,每10分钟执行一次,当Java应用程序上打开的文件超过10000个时,它将执行一个jmap命令,给我一个heapdump 我的目的是发现我的应用程序的哪个类没有关闭文件,或者哪里有内存泄漏,或者为什么我在执行20小时后收到“打开的文件太多”的消息 这是我的剧本。是否有人有其他方法或工具来发现我的应用程序未关闭文件的位置?非常感谢 #!/bin/bash rm openfiles.log flag=1 for (( ; ; )) do sleep 10m files=

我做了一个脚本,每10分钟执行一次,当Java应用程序上打开的文件超过10000个时,它将执行一个jmap命令,给我一个heapdump

我的目的是发现我的应用程序的哪个类没有关闭文件,或者哪里有内存泄漏,或者为什么我在执行20小时后收到“打开的文件太多”的消息

这是我的剧本。是否有人有其他方法或工具来发现我的应用程序未关闭文件的位置?非常感谢

#!/bin/bash

rm openfiles.log
flag=1
for (( ; ; ))
do
   sleep 10m
   files=`ps -A x |grep iscsi | awk '{print $1}' | xargs -I '{}' ls /proc/29192/fd  | wc -l`
   msg="open files: $files - date: `date`"
   echo "$msg     - infinite loops [ hit CTRL+C to stop]"
   echo $msg >> openfiles.log

   if [ $files -gt 10000 ] && [ $flag -eq 1 ]
   then
      jmap -F -dump:file=heapdump.hprof 29192
      flag=0;
      echo "############################################ heapdump of 29192" >> openfiles.log
   fi
   echo "" >> openfiles.log
done
看看川口浩介写的《詹金斯名人录》。它是附加到java进程的java代理


还有其他方法可以通过FindBugs/PMD等进行扫描。我想看一下。有专门关于不关闭资源的规则。

在系统级找不到任何内容。它只是显示了保持文件打开状态的JVM。您在代码中运行过FindBugs之类的工具吗?是的,我运行过FindBugs和yourKit。但使用yourkit无法在我的应用程序也在运行的情况下运行。我忘记了。