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;
/**
*/
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]