3.3常用类(java学习笔记)Runtime与Process

2018-08-26 17:17:59来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

一、Runtime

我们来看下文档中对Runtime的说明:

每一个java程序都有一个属于Runtime类的实例,它允许程序连接到程序运行环境。

当前runtime可以用getRuntime()方法获得。

程序无法创建自己的此类实例。

 

public class Test {
    public static void main(String[] args) {
        Runtime run1 = Runtime.getRuntime();//获取当前程序的runtime
        Runtime run2 = Runtime.getRuntime();
        
        System.out.println(run1.freeMemory());//打印出java虚拟机中的空闲内存
        System.out.println(run2.freeMemory());
    }    
}
运行结果:
63144792
63144792

每个java程序有一个属于Runtime的实例,所以run1和run2是一样的,它们都是与本程序运行环境相连接。

 

下面介绍下几个方法:

maxMenmory(),获得jvm最大内存值,返回一个long型值。

freeMenmory(),获得空闲内存值,返回一个long型值。

gc(),运行垃圾回收器,释放内存。

 1 import java.io.IOException;
 2 import java.lang.StringBuffer;
 3 
 4 public class Test {
 5     public static void main(String[] args) {
 6         String str = "";
 7         StringBuffer sb = new StringBuffer("");
 8         Runtime run = Runtime.getRuntime();
 9         System.out.println("jvm中最大内存\t\t" + run.maxMemory());
10         long start = run.freeMemory();           
11         for(int i = 0; i < 1000; i++){
12             str += i;
13         }
14         long end = run.freeMemory();
15         System.out.println("执行String消耗的内存\t" + (start - end));
16         start = run.freeMemory();
17         for(int i = 0; i < 1000; i++){
18             sb.append(i);
19         }
20         end = run.freeMemory();
21         System.out.println("执行strBuf消耗的内存\t" + (start - end));
22         System.out.println("执行gc前空闲内存\t\t" + run.freeMemory());
23         run.gc();
24         System.out.println("执行完gc空闲内存\t\t" + run.freeMemory());    
25     }
26 }
运行结果:
jvm中最大内存 928514048 执行String消耗的内存 5704248 执行strBuf消耗的内存 0 执行gc前空闲内存 57440544 执行完gc空闲内存 63592208

 

可以看出String不可变会不停创建新的连接,所以比较占内存。

StringBuffer明显占内存少,频繁对字符串进行操作做好用StringBuffer。

 

exec(String command)执行指定字符串命令

 1 import java.io.IOException;
 2 
 3 public class Test {
 4     public static void main(String[] args) {
 5         Runtime run = Runtime.getRuntime();
 6         try {
 7             run.exec("notepad.exe");//打开记事本。
 8         } catch (IOException e) {                         
 9             // TODO Auto-generated catch block
10             e.printStackTrace();
11         }
12     }
13 }

由于斜杠\是转义字符所以打\\才能代表路径中的\。

上面执行的是打开记事本的命令。

我们还可以将执行一些命令:

例如:Runtime.getRuntime().exec("cmd /k copy c:\\b\\b.txt c:\\a\\a.txt ");    (将c:\b\b.txt的内容复制到c:\a\a.txt)

 

将exec()中字符串复制到下列窗口中执行和调用exec()执行效果是一样的。

windows + R弹出此窗口:

 

 

 

cmd /k 加上k代表运行完命令后窗口不关闭,这个在运行窗口会有明显效果,在java中调用exec()运行不会弹出命令窗口。

cmd /c 加上c代表运行后窗口会关闭。

具体命令有兴趣可以查阅相关资料书籍。

 

 

二.Process

 

 

我们来看文档中对Process的描述:

ProcessBuilder.start()和Runtime.exec()方法创建本地进程并且返回Process子类实例,

可以使用它来控制并获得进程信息。

 

首先我们之前用到了exec方法,这个方法会返回一个Process类型的实例。

我们可以通过这个实例来对进程进行操作。

例如之前使用了exec()打开记事本,那么就会返回一个Process实例,用于操作进程。

 1 import java.io.IOException;
 2 
 3 public class Test {
 4     public static void main(String[] args) {
 5         
 6         Process notepad = null; //创建一个Process的实例,用于接受exec()返回的进程。
 7         try {
 8             notepad = Runtime.getRuntime().exec("notepad.exe"); //接受返回的进程
 9             Thread.sleep(5000);                                 //休眠5s
10         } catch (IOException e) {
11             // TODO Auto-generated catch block
12             e.printStackTrace();
13         } catch (InterruptedException e) {
14             // TODO Auto-generated catch block
15             e.printStackTrace();
16         }
17         notepad.destroy();    //结束notepad进程。
18     }
19 }

运行上面代码会先打开记事本,然后过5s会关闭记事本。

记事本打开时,任务管理器中也会有记事本的进程,关闭后记事本进程也结束。

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:clob字段超过4000转String类型

下一篇:什么样的简历不会被丢进回收站