java.lang.Runtime
每一个java程序都有一个Runtime类的单一实例,可以通过getRuntime静态方法获得。程序通过它与程序的运行环境(也就是操作系统)相交互。
1.内存查看
int java.lang.Runtime. availableProcessors()jvm的可用处理器数量。
long java.lang.Runtime. totalMemory()
初始的总内存,单位为byte。
long java.lang.Runtime. maxMemory()
最大可用内存。
long java.lang.Runtime.freeMemory()
当前可用内存。
public static void main(String[] args) {
Runtime rt = Runtime.getRuntime();
long totalMemorySize = rt.totalMemory()/1024/1024; //初始的总内存
long maxMemorySiz = rt.maxMemory()/1024/1024; //最大可用内存
long freeMemorySize = rt.freeMemory()/1024/1024; //当前可用内存
String str=String.format("%d %d %d", totalMemorySize,maxMemorySiz,freeMemorySize);
System.out.println(str);
double[] arr=new double[165456789];
totalMemorySize = rt.totalMemory()/1024/1024; //初始的总内存
maxMemorySiz = rt.maxMemory()/1024/1024; //最大可用内存
freeMemorySize = rt.freeMemory()/1024/1024; //当前可用内存
str=String.format("%d %d %d", totalMemorySize,maxMemorySiz,freeMemorySize);
System.out.println(str);
}
/*121 1776 118
1369 1776 103
*/
2.运行其他程序
Process java.lang.Runtime.exec(String command) throws IOException
在一个隔离的进程中执行command命令。
java.lang.Process
可通过ProcessBuilder.start()与Runtime.exec()方法得到Process实例。此类提供了很多方法,可从process中得到输入,也可以向process中输出;还可以等待进程结束并检查退出码;可以摧毁process。
InputStream java.lang.Process.getInputStream()
从Process的标准输出得到InputStream。函数内部通过管道实现。
int java.lang.Process.waitFor() throws InterruptedException
等待Process执行完毕,达到同步的效果。返回值为process的返回值。默认地,0表示正常退出。
public class SudoJava {
public static void main(String[] args) throws IOException, InterruptedException {
StringBuilder sb = new StringBuilder("sudo ");
for (String str : args)
sb.append(str).append(" ");
//待执行的命令在子进程中执行。若没有执行完毕父进程结束,则子进程也要被销毁。
//若想保证进程执行完全,需要process.waitFor();
Process process=Runtime.getRuntime().exec(sb.toString());
process.waitFor();
}
}
3.定时任务例子
package com.yichudu;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class RunScriptTimer {
static long periodBySecond=1;
//注意 x.sh 需要已经有可执行权限
public static void main(String[] args) throws ParseException {
if(args==null ||args.length<1){
System.err.println("need to input arguement!");
return;
}
final String fileName=args[0];
String dateStr="2015-01-01 12:00:00";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date=sdf.parse(dateStr);
new Timer().schedule(new TimerTask() {
@Override
public void run() {
//待执行的命令在子进程中执行。若没有执行完毕父进程结束,则子进程也要被销毁。
//若想保证进程执行完全,需要process.waitFor();
try {
Process process=Runtime.getRuntime().exec(fileName);
process.waitFor();
} catch (InterruptedException | IOException e) {
e.printStackTrace();
}
}
}, new Date(),periodBySecond*1000);
}
}
4. 添加退出钩子
void java.lang.Runtime.addShutdownHook(Thread hook)
程序在退出时(正常退出、System.exit()、与 被操作系统强行终止等),hookThread得到触发。可以添加多个hookThread。