-
Process p = rt.exec("free -m")问题,不吝赐教10
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.<init>(UNIXProcess.java:148)
at java.lang.ProcessImpl.start(ProcessImpl.java:65)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:452)
... 7 more
查看网络相关资料,大概了解可能是由于打开的句柄过多造成,也没有找到解决办法,不吝赐教,谢谢
问题补充:
如何清除getInputStream??请详细说明,谢谢
问题补充:
Process p = rt.exec("free -m");// 调用系统的命令
大概循环执行1000次左右,就挂掉了,出现上述错误
原因可能是执行free -m,打开的缓存IO文件过多,如何释放??
已经试过的办法:
} finally {
in.close();
p.destroy();
}
都不起作用,各位大侠分析分析,不胜感谢。
问题补充:
首先,非常感谢lewhwa的热情帮助。
你提供代码和方法我也做过测试,问题依旧,各个流我分别关闭,循环执行1000
次左右还是出现同样的问题。
2009年1月04日 17:48
3个答案 按时间排序 按投票排序
-
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; } }
2009年1月05日 19:44
-
请参考Java调用外部进程并拦截输入输出流--Java IDE Console解密(上篇)http://www.cnblogs.com/lewhwa/archive/2007/01/14/620395.html
和Java调用外部进程并拦截输入输出流--Java IDE Console解密(下篇)http://www.blogjava.net/lewhwa/archive/2007/01/15/94060.html引用大概了解可能是由于打开的句柄过多造成
在Unix或者Linux上标准输入输出以及Stderr,均作为文件方式表示。用的getInputStream有没有清除,所以导致错误。
2009年1月04日 19:00
相关推荐
《process-exporter-0.7.5.linux-amd64.tar.gz:进程监控利器》 在IT领域,系统监控是运维工作中的重要一环,它可以帮助我们及时发现并解决问题,确保服务的稳定运行。"process-exporter-0.7.5.linux-amd64.tar.gz...
《process-exporter 0.7.10在Linux AMD64平台上的应用详解》 process-exporter是一款开源的监控工具,专为收集和暴露系统进程信息而设计,它能够将这些信息转换为Prometheus可读格式,从而方便进行性能监控和故障...
本文将详细介绍三种常用的方法:`Runtime.exec()`、`ProcessBuilder`以及`commons-exec`库。 #### 1. 使用`Runtime.exec()` `Runtime.exec()`是最为传统且简单的执行外部程序的方法。它可以启动一个新的进程,并...
An error ocCurred while completing process -java.lang.reflect.InvocationTargetException (1).关闭 Eclipse (2).copy %AXIS2_HOME%\lib\ 下的 backport-util-concurrent-3.1.jar 和 geronimo-stax-api_1.0_...
Process proc = rt.exec(command); InputStream stderr = proc.getErrorStream(); InputStreamReader isr = new InputStreamReader(stderr); BufferedReader br = new BufferedReader(isr); String line = ...
api-ms-win-crt-process-l1-1-0.dll api-ms-win-crt-runtime-l1-1-0.dll api-ms-win-crt-stdio-l1-1-0.dll api-ms-win-crt-string-l1-1-0.dll api-ms-win-crt-time-l1-1-0.dll api-ms-win-crt-utility-l1-1-0.dll ...
解压即可安装使用,非常好用的画图工具。 diagrams.net is free online diagram software for making flowcharts, process diagrams, org charts, UML, ER and network diagrams
Process process = runtime.exec(commandStr); ``` 其中,“`cmd /c`”是启动CMD并执行命令,“`cmd /k`”则是启动CMD后执行命令但不关闭窗口。 #### 3. 具体示例 下面通过几个具体的示例来演示如何调用各种CMD...
follows the standard process documented in the INSTALL file. As a quick start you can do ./configure --prefix=/usr --sysconfdir=/etc \ --localstatedir=/var --libdir=/usr/lib make sudo make ...
关于低版本PHP资源离线安装包,如果...php-process-5.3.3-50.el6_10.x86_64.rpm php-soap-5.3.3-50.el6_10.x86_64.rpm php-xml-5.3.3-50.el6_10.x86_64.rpm 全部安装完成后如果页面登录不了,需要修改session目录的权限
资源分类:Python库 所属语言:Python 资源全名:data_process-0.1.29-py2.py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
-n|--name <process-name> stop processes with this name -s|--signal <signal> signal to send (default TERM) -a|--startas <pathname> program to start (default is ) -N|--nicelevel <incr> add incr to ...
Process process = runtime.exec("ls -l"); // 读取命令输出 BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine...
《process-exporter-0.5.0.linux-amd64.tar.gz:深入了解运维利器——process-exporter》 process-exporter是一款开源的监控工具,专为Linux系统设计,用于收集和暴露进程级别的性能指标,是Prometheus监控生态中的...
Process p = new Process(); string str = System.Web.HttpContext.Current.Server.MapPath("~/wkhtmltopdf.exe"); if (!System.IO.File.Exists(str)) return false; string switches = "--print-media-type ";...
Process p = cmd.exec("mysqldump --opt – hlocalhost --user=root --password=admin --lock-all-tables=true --result-file=E://oes//2221.sql --default-character-set=utf8 oes"); ``` 这里需要注意的是,如果...
oc process -f openshift/sso74-x509-postgresql-secrets.yaml -p 'NAME=template.sso' -p 'SUFFIX=' -l part-of=rh-sso,managed-by=template,shared=true | oc create -f -\noc process -f openshift/sso74-x509-...
Process process = Runtime.getRuntime().exec(".\\p.exe"); ``` - `exec()`方法返回一个Process对象,可以用来控制子进程的执行或获取子进程的信息。 2. **执行DOS内部命令** - 如果要执行DOS内部命令,如`dir...