2013-05-03 20 views
22

Giả sử rất nhiều ứng dụng của bạn đề cập đến nội dung đọc của tệp. Đi mà không nói rằng các tập tin được mở sau đó đóng cửa và cuộc sống là tốt trừ khi .. các tập tin mới đi vào nhanh hơn sau đó tập tin cũ được đóng lại. Đây là sự lựa chọn của một tình huống mà tôi tìm thấy.Cách tìm số lượng tệp hiện đang mở bằng ứng dụng Java?

Bây giờ .. có cách nào để biết chắc chắn có bao nhiêu tệp được mở bởi quy trình này không? Cái gì đáng tin cậy khi nhìn vào ls /proc/my_pid/fd | wc -l từ bên trong JVM?

Tôi nghi ngờ câu trả lời có thể là hệ điều hành cụ thể, vì vậy hãy để tôi thêm rằng tôi đang chạy Java trên Linux.

+4

Can not bạn chỉ tăng số lượng bất cứ khi nào bạn mở một tệp ... và giảm nó bất cứ khi nào bạn đóng một tệp? – NominSim

+0

Tôi cho rằng đó là một cách để làm điều đó .. Có giải pháp sạch hơn không? – JAM

+0

Bạn có thể thực hiện lệnh đó trong java. Hãy xem: http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html Tôi không thể tưởng tượng rằng java ghi nhớ cái nào và số lượng tệp bạn đã mở. – mmirwaldt

Trả lời

23

Trên unix một cách là sử dụng ManagementFactory để có được những OperatingSystemMxBean và nếu nó là một UnixOperatingSystemMXBean bạn có thể sử dụng phương pháp getOpenFileDescriptorCount().

Ví dụ Mã dưới đây

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

Thực hiện nhiệm vụ này bằng cách tăng số lượng FD? – JAM

+0

Dường như không. Cảm ơn. điều này thật đúng với gì mà tôi đã tìm kiếm – JAM

6

Nếu bạn muốn lấy số ls /proc/my_pid/fd | wc -l bằng java, bạn có thể sử dụng JMX.

Khi bạn có MBeanServerConnection, bạn có thể nhận thuộc tính "OpenFileDescriptorCount". điều này sẽ cho bạn kết quả tương tự như trên ls..|wc -l.

cũng có một thuộc tính khác "MaxFileDescriptorCount", cho biết số lượng tối đa cho phép.

Nếu bạn chỉ muốn biết giá trị nhưng không nhận được mã trong mã, bạn có thể thực hiện theo cách ls..|wc -l hoặc đọc từ jconsole (bằng GUI).

LƯU Ý

ls /proc/my_pid/fd | wc -l 

con số này chỉ ra có bao nhiêu fd mở bởi quá trình của bạn (java ứng dụng). ví dụ. các tệp doanh nghiệp của bạn được tính, cũng là các tệp đó, các tệp thư viện cũng được tính. Nếu bạn chỉ muốn có được số lượng các tập tin kinh doanh của bạn, bạn phải thực hiện một truy cập của chính mình. Hoặc, nói rằng bạn muốn làm điều đó với shellscript, grep một cái gì đó ra sau đó wc -l

EDIT

add mã ví dụ, nhưng nó chỉ là một ví dụ. không được viết bằng IDE, không được thử nghiệm với trình biên dịch. :)

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

Vì mục đích hoàn thành/thêm vào câu trả lời:

Nhiều người sử dụng lsof trong Linux dựa trên hệ thống giám sát mô tả tập tin và chi tiết của họ. Tuy nhiên LSOF liệt kê tất cả các loại FD (CWD, MEM) mà không được trả về bởi UnixOperatingSystemMXBean.getOpenFileDescriptorCount().

Chi tiết có thể được tìm thấy trong http://www.ibm.com/developerworks/aix/library/au-lsof.html Điều này có thể gây nhầm lẫn.

Để làm rõ UnixOperatingSystemMXBean.getOpenFileDescriptorCount() chỉ hiển thị các ứng dụng mô tả tệp được mở. Nhưng LSOF (lsof -a -p) liệt kê các bộ mô tả tập tin khác được nhân mở bằng cách thay mặt cho tiến trình.

Để liệt kê mức độ ứng dụng duy nhất FDS ai có thể lọc ra các loại khác của FD

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

Các vấn đề liên quan