2014-12-19 2 views
0

Я выполнил скрипт каждые 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 
+0

Вы не найдете ничего на системном уровне. он просто покажет, что JVM держит файлы открытыми. –

+0

Вы запускаете такие инструменты, как FindBugs или тому подобное, на свой код? – fge

+0

да, я запустил findBugs и yourKit. но с mykit невозможно запустить с моим приложением также работает. Я потерял память. –

ответ

2

Взгляните на File Leak Detector написанную Kohsuke Кавагути Дженкинса славы. Это Java-агент, который вы присоединяете к процессу Java.

Есть также другие способы сканирования для них через FindBugs/PMD и т. Д. Я бы посмотрел на SonarQube. Существуют правила, касающиеся не закрытия ресурсов.

Смежные вопросы