Я выполнил скрипт каждые 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
Вы не найдете ничего на системном уровне. он просто покажет, что JVM держит файлы открытыми. –
Вы запускаете такие инструменты, как FindBugs или тому подобное, на свой код? – fge
да, я запустил findBugs и yourKit. но с mykit невозможно запустить с моим приложением также работает. Я потерял память. –