2013-05-03 14 views
22

Supponiamo molto di ciò che l'applicazione fa con la lettura del contenuto dei file. Va da sé che i file aperti e chiusi e la vita è buona a meno che ... i nuovi file arrivino più velocemente dei vecchi file che vengono chiusi. Questo è il sottaceto di una situazione in cui mi sono trovato.Come trovare il numero di file attualmente aperti dall'applicazione Java?

Ora .. c'è un modo per sapere in modo affidabile quanti file sono aperti dal processo? Qualcosa che sia affidabile come guardare ls /proc/my_pid/fd | wc -l dall'interno della JVM?

Sospetto che la risposta possa essere specifica per il sistema operativo, quindi aggiungo che sto eseguendo Java su Linux.

+4

Impossibile basta incrementare un conteggio ogni volta che apri un file ... e lo decremento ogni volta che ne chiudi uno? – NominSim

+0

Suppongo che sia un modo per farlo ... Esiste una soluzione più pulita? – JAM

+0

È possibile eseguire tale comando in java. Dai uno sguardo: http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html Non riesco a immaginare che java memorizzi quali e quanti file hai aperto. – mmirwaldt

risposta

23

Su Unix un modo sta usando il ManagementFactory per ottenere il OperatingSystemMxBean e se si tratta di un UnixOperatingSystemMXBean è possibile utilizzare getOpenFileDescriptorCount() metodo.

Esempio codice qui sotto

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

Lo svolgimento di questa attività di per sé aumenta il numero di FD? – JAM

+0

Non sembra. Grazie. Questo e 'esattamente quello che stavo cercando – JAM

6

Se si desidera ottenere il numero di ls /proc/my_pid/fd | wc -l in java, è possibile utilizzare JMX.

Se si dispone di MBeanServerConnection, è possibile ottenere l'attributo "OpenFileDescriptorCount". questo ti darà lo stesso risultato del precedente ls..|wc -l.

inoltre esiste un altro attributo "MaxFileDescriptorCount", che indica il numero massimo consentito.

Se si desidera solo conoscere il valore, ma non inserirlo nel codice, è possibile utilizzare il metodo ls..|wc -l o leggere da jconsole (con interfaccia grafica).

NOTA

ls /proc/my_pid/fd | wc -l 

Questo numero indica quanti FD aperta dal processo (applicazione java). per esempio. i file della tua azienda vengono contati, anche questi vasi, vengono contati anche i file delle librerie. Se vuoi solo ottenere il conteggio dei tuoi file aziendali, devi implementare un contatore da solo. Oppure, diciamo che si vuole fare con shellscript, grep qualcosa fuori allora wc -l

EDIT

codice aggiuntivo esempio, ma è solo un esempio. non scritto in IDE, non testato con il compilatore. :)

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

Per il bene di completare/aggiungere alla risposta:

Molte persone utilizza LSOF nel sistema basato su Linux per monitorare i descrittori di file ed i loro dettagli. Tuttavia LSOF elenca tutti i tipi di FD (CWD, MEM) che non vengono restituiti da UnixOperatingSystemMXBean.getOpenFileDescriptorCount().

Dettagli possono essere trovati in http://www.ibm.com/developerworks/aix/library/au-lsof.html Ciò può causare una certa confusione.

Per chiarire UnixOperatingSystemMXBean.getOpenFileDescriptorCount() mostra solo i descrittori di file aperti dell'applicazione. Ma LSOF (lsof -a -p) elenca altri descrittori di file aperti dal kernel per conto del processo.

per elencare solo livello di applicazione FDS può filtrare altro tipo di DF

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

Problemi correlati