avery_leo 2009-01-04 17:48
浏览 257
已采纳

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

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

  • 写回答

3条回答 默认 最新

  • wwwghost 2009-01-05 19:52
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 运筹学排序问题的应用
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥15 安装svn网络有问题怎么办