2013-05-03 10 views
22

Załóżmy dużo co aplikacja robi interesy z czytania zawartość plików. Nie trzeba dodawać, że pliki, które są otwarte, a następnie zamknięte, a życie jest dobre, chyba że ... nowe pliki są szybsze, niż stare pliki się zamykają. To jest marynata z sytuacji znalazłem się.Jak sprawdzić liczbę plików aktualnie otwartych przez aplikacji Java?

teraz .. czy jest jakiś sposób, aby niezawodnie wiedzieć ile pliki są otwarte przez proces? Coś, co tak wiarygodne, jak patrząc na ls /proc/my_pid/fd | wc -l od wewnątrz JVM?

Podejrzewam, odpowiedź może być OS specyficzny, więc dodam że używam Java w systemie Linux.

+4

nie potrafisz po prostu zwiększasz liczbę za każdym razem, gdy otwierasz plik ... i zmniejszasz go, ilekroć go zamykasz? – NominSim

+0

Przypuszczam, że to jeden ze sposobów robienia tego .. Czy istnieje czystsze rozwiązanie? – JAM

+0

Można wykonać to polecenie w języku Java. Zobacz: http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html Nie mogę sobie wyobrazić, że java zapamiętuje, które i ile otwartych plików. – mmirwaldt

Odpowiedz

23

na Unix jednym ze sposobów jest użycie ManagementFactory uzyskać OperatingSystemMxBean i jeśli jest to UnixOperatingSystemMXBean można użyć getOpenFileDescriptorCount() metody.

Przykładowy kod poniżej

import java.lang.management.ManagementFactory; 
import java.lang.management.OperatingSystemMXBean; 
import com.sun.management.UnixOperatingSystemMXBean; 
public class OpenFileCount{ 
    public static void main(String[] args){ 
     OperatingSystemMXBean os = ManagementFactory.getOperatingSystemMXBean(); 
     if(os instanceof UnixOperatingSystemMXBean){ 
      System.out.println("Number of open fd: " + ((UnixOperatingSystemMXBean) os).getOpenFileDescriptorCount()); 
     } 
    } 
} 
+0

Czy wykonując to zadanie samodzielnie zwiększyć liczbę FD? – JAM

+0

Nie wydaje się. Dzięki. Właśnie tego szukałem – JAM

6

Jeśli chcesz uzyskać numer ls /proc/my_pid/fd | wc -l w języku Java, możesz użyć JMX.

Gdy masz MBeanServerConnection, możesz uzyskać atrybut "OpenFileDescriptorCount". da to taki sam wynik jak powyższy ls..|wc -l.

też istnieje inny atrybut „MaxFileDescriptorCount”, który opowiada swoją maksymalna liczba dozwolona.

Jeśli chcesz tylko poznać wartość, ale nie możesz jej wprowadzić w swoim kodzie, możesz zrobić to na swój numer ls..|wc -l lub odczytać z jconsole (z GUI).

UWAGA

ls /proc/my_pid/fd | wc -l 

liczba ta wskazuje, ile fd otwierane przez proces (aplikacja Java). na przykład Twoje pliki biznesowe są zliczane, również te słoiki, pliki bibliotek są liczone. Jeśli chcesz tylko zliczyć pliki biznesowe, musisz sam zaimplementować licznik. Albo, że chcesz to zrobić z shellscript, grep coś się wówczas, wc -l

EDIT

code Dodaj przykład, ale jest to tylko przykład. nie napisane w IDE, nie testowane przy użyciu kompilatora. :)

ObjectName oName = new ObjectName("java.lang:type=OperatingSystem"); 
MBeanServerConnection conn ; // you should get the connection following the api, take a look the java api/ google some example 
javax.management.AttributeList list = conn.getAttributes(oName, new String[]{"OpenFileDescriptorCount", "MaxFileDescriptorCount"}); 
for(Attribute attr: list.asList()){ 
    System.out.println(attr.getName() + ": " + attr.getValue()); 
} 
5

Dla ukończenie/dodanie do odpowiedzi:

Wiele osób korzysta lsof w systemie opartym Linux monitorować deskryptory plików i ich szczegóły. Jednak LSOF wymienia wszystkie rodzaje FD (CWD, MEM), które nie są zwracane przez UnixOperatingSystemMXBean.getOpenFileDescriptorCount().

Szczegóły można znaleźć pod http://www.ibm.com/developerworks/aix/library/au-lsof.html Może to powodować pewne zamieszanie.

Wyjaśnienie UnixOperatingSystemMXBean.getOpenFileDescriptorCount() wyświetla tylko deskryptory otwartych plików aplikacji. Ale LSOF (lsof -a -p) wyświetla listę innych deskryptorów plików otwieranych przez jądro w imieniu procesu.

Do listy tylko jeden poziom aplikacji FDS można odfiltrować inny rodzaj zależności funkcjonalnych

lsof -a -p yourprocid -d^txt,^dz^^ CWD, RTD,^DEL

Powiązane problemy