Process p = rt.exec("free -m")问题,不吝赐教

Java代码
public static double[] getMemUsage() throws Exception {

    double[] result = new double[4];   

    Process p = rt.exec("free -m");// 调用系统的命令   

    BufferedReader in = null;   
    try {   
        in = new BufferedReader(new InputStreamReader(p.getInputStream()));   
        String str = null;   
        String[] strArray = null;   

        while ((str = in.readLine()) != null) {   

public static double[] getMemUsage() throws Exception {

    double[] result = new double[4];

    Process p = rt.exec("free -m");// 调用系统的命令

    BufferedReader in = null;
    try {
        in = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String str = null;
        String[] strArray = null;

        while ((str = in.readLine()) != null) {
            Java代码 
    int m = 0;   

    if (str.indexOf("/") != -1) {// MemUsed   
                                                strArray = str.split(" ");   
        for (String tmp : strArray) {   
            if (tmp.trim().length() == 0)   
                continue;   

            if (++m == 3) {   
                                            result[1] = Double.parseDouble(tmp);   

            }   
        }   

    }   
    if (str.indexOf("Mem") != -1) {// MemTotal   

        strArray = str.split(" ");   
        for (String tmp : strArray) {   
            if (tmp.trim().length() == 0)   
                continue;   

            if (++m == 2) {   

                result[0] = Double.parseDouble(tmp);   

            }   
        }   

    }   
}   
p.getErrorStream();   

} catch (Exception e) {

e.printStackTrace();

} finally {

in.close();

p.destroy();

}

// System.out.println("Performance Monitoring menUsed:" + result[1]);

return result;

在一个线程(假设1毫秒一次)中,无限循环执行上面的代码:

大概20分钟左右后出现如下异常:

java.io.IOException: Cannot run program "free": java.io.IOException: error=24, Too many open files
at java.lang.ProcessBuilder.start(ProcessBuilder.java:459)
at java.lang.Runtime.exec(Runtime.java:593)
at java.lang.Runtime.exec(Runtime.java:431)
at java.lang.Runtime.exec(Runtime.java:328)
at LinuxSystemTool.getMemUsage(LinuxSystemTool.java:98)
at LinuxSystemTool.exec(LinuxSystemTool.java:67)
at LinuxSystemTool.run(LinuxSystemTool.java:42)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.io.IOException: java.io.IOException: error=24, Too many open files
at java.lang.UNIXProcess.(UNIXProcess.java:148)
at java.lang.ProcessImpl.start(ProcessImpl.java:65)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:452)
... 7 more

查看网络相关资料,大概了解可能是由于打开的句柄过多造成,也没有找到解决办法,不吝赐教,谢谢

[b]问题补充:[/b]
如何清除getInputStream??请详细说明,谢谢
[b]问题补充:[/b]
Process p = rt.exec("free -m");// 调用系统的命令

大概循环执行1000次左右,就挂掉了,出现上述错误

原因可能是执行free -m,打开的缓存IO文件过多,如何释放??

已经试过的办法:
} finally {

in.close();

p.destroy();

}

都不起作用,各位大侠分析分析,不胜感谢。
[b]问题补充:[/b]
首先,非常感谢lewhwa的热情帮助。

你提供代码和方法我也做过测试,问题依旧,各个流我分别关闭,循环执行1000

次左右还是出现同样的问题。

多个输入流都没有关闭。用我给代码再试试。

请参考Java调用外部进程并拦截输入输出流--Java IDE Console解密(上篇)[url]http://www.cnblogs.com/lewhwa/archive/2007/01/14/620395.html[/url]
和Java调用外部进程并拦截输入输出流--Java IDE Console解密(下篇)[url]http://www.blogjava.net/lewhwa/archive/2007/01/15/94060.html[/url]
[quote]大概了解可能是由于打开的句柄过多造成[/quote]
在Unix或者Linux上标准输入输出以及Stderr,均作为文件方式表示。用的getInputStream有没有清除,所以导致错误。

[code="java"]import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

/**

  • @author Hanson
  • */
    public class TestDemo {
    public static double[] getMemUsage() throws Exception {

    double[] result = new double[4];
    
    Process p = Runtime.getRuntime().exec("free -m");// 调用系统的命令
    
    BufferedReader in = null;
    InputStream is=p.getInputStream();
    InputStreamReader isr=new InputStreamReader(p.getInputStream());
    InputStream errIS=p.getErrorStream();
    try {
        in = new BufferedReader(isr);
        String str = null;
        String[] strArray = null;
    
        while ((str = in.readLine()) != null) {
            int m = 0;
    
            if (str.indexOf("/") != -1) {// MemUsed
                strArray = str.split(" ");
                for (String tmp : strArray) {
                    if (tmp.trim().length() == 0)
                        continue;
    
                    if (++m == 3) {
                        result[1] = Double.parseDouble(tmp);
    
                    }
                }
    
            }
            if (str.indexOf("Mem") != -1) {// MemTotal
    
                strArray = str.split(" ");
                for (String tmp : strArray) {
                    if (tmp.trim().length() == 0)
                        continue;
    
                    if (++m == 2) {
    
                        result[0] = Double.parseDouble(tmp);
    
                    }
                }
    
            }
        }
    
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        p.destroy();
        errIS.close();
        is.close();
        isr.close();
        in.close();
    }
    // System.out.println("Performance Monitoring menUsed:" + result[1]);
    return result;
    

    }

}[/code]