认识java.lang.Runtime类

来源:互联网 发布:mac如何设置用户名 编辑:程序博客网 时间:2024/05/01 10:46
照例是概念:Runtime类封装了运行时的环境。每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够
与其运行的环境相连接。一般不能实例化一个Runtime对象,应用程序也不能创建自己的 Runtime 类实例,但可以通
过 getRuntime 方法获取当前Runtime运行时对象的引用。 一旦得到了一个当前的R
untime对象的引用,就可以调用
Runtime对象的方法去控制Java虚拟机的状态和行为。 常用的应用有:“内存管理”和“执行外部程序”。
============================================================================================================
内存管理:Java提供了无用单元自动收集机制。通过totalMemory()和freeMemory()方法可以知道对象的堆内存有多大,还剩多少。
Java会周期性的回收垃圾对象(未使用的对象),以便释放内存空间。但是如果想先于收集器的下一次指定周期来收集废弃的对象,
可以通过调用gc()方法来根据需要运行无用单元收集器。一个很好的试验方法是先调用gc()方法,然后调用freeMemory()方法来
查看基本的内存使用情况,接着执行代码,然后再次调用freeMemory()方法看看分配了多少内存。下面的程序演示了这个构想。
//此实例来自《java核心技术》卷一
class MemoryDemo{
        public staticvoid main(String args[]){
                Runtime r = Runtime.getRuntime();
                long mem1,mem2;
                Integer someints[] = new Integer[1000];
                System.out.println("Total memory is :" + r.totalMemory());
                mem1 = r.freeMemory();
                System.out.println("Initial free is : " + mem1);
                r.gc();
                mem1 = r.freeMemory();
                System.out.println("Free memory after garbage collection : " + mem1);
                //allocate integers
                for(int i=0; i<1000; i++) someints[i] =new Integer(i);    
                mem2 = r.freeMemory();
                System.out.println("Free memory after allocation : " + mem2);
                System.out.println("Memory used by allocation : " +(mem1-mem2));    
                //discard Intergers
                for(int i=0; i<1000; i++) someints[i] =null;
                r.gc(); //request garbage collection
                mem2 = r.freeMemory();
                System.out.println("Free memory after collecting " +"discarded integers : " + mem2);
        }
}
编译后运行结果如下(不同的机器不同时间运行的结果也不一定一样):
Total memory is :2031616
Initial free is : 1818488
Free memory after garbage collection : 1888808
Free memory after allocation : 1872224
Memory used by allocation : 16584
===========================================================================================================
执行外部程序:在安全的环境中,可以在多任务操作系统中使用Java去执行其他特别大的进程(也就是程序)。ecec()方法有几种形式命名想要
运行的程序和它的输入参数。ecec()方法返回一个Process对象,可以使用这个对象控制Java程序与新运行的进程进行交互。ecec()方法本质是
依赖于环境。
下面对Runtime.exec()做个总结

Windows下调用程序

Process proc =Runtime.getRuntime().exec("exefile");

Linux下调用程序就要改成下面的格式

Process proc =Runtime.getRuntime().exec("./exefile");

Windows下调用系统命令

String [] cmd={"cmd","/C","copy exe1 exe2"};
Process proc =Runtime.getRuntime().exec(cmd);

Linux下调用系统命令就要改成下面的格式

String [] cmd={"/bin/sh","-c","ln -s exe1 exe2"};
Process proc =Runtime.getRuntime().exec(cmd);

Windows下调用系统命令并弹出命令行窗口

String [] cmd={"cmd","/C","start copy exe1 exe2"};
Process proc =Runtime.getRuntime().exec(cmd);

Linux下调用系统命令并弹出终端窗口就要改成下面的格式

String [] cmd={"/bin/sh","-c","xterm -e ln -s exe1 exe2"};
Process proc =Runtime.getRuntime().exec(cmd);

还有要设置调用程序的工作目录就要

Process proc =Runtime.getRuntime().exec("exeflie",nullnew File("workpath"));
==================================================================================================
例子1:
class ExecDemo{
        public staticvoid main(String args[]){
                String cmd="cmd winver";
        try {
            Process pro = Runtime.getRuntime().exec(cmd);
            BufferedReader br = new BufferedReader(new InputStreamReader(pro.getInputStream(),"GBK"));
            String curline = null;
            while(null != (curline = br.readLine())){
                System.out.println(curline);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        }
}
编译后运行结果如下(不同的机器不同)
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
========================================================================================================
例子2:
class ExecDemo{
        public staticvoid main(String args[]){
                 String cmd="devcon find pci\\*";
        try {
            Process pro = Runtime.getRuntime().exec(cmd);
            BufferedReader br = new BufferedReader(new InputStreamReader(pro.getInputStream(),"GBK"));
            String curline = null;
            while(null != (curline = br.readLine())){
                System.out.println(curline);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        }
}
编译后运行结果如下(不同的机器不同)
PCI\VEN_10EC&DEV_8168&SUBSYS_1423103C&REV_03\4&30309523&0&00E5: Realtek PCIe GBE Family Controller
PCI\VEN_168C&DEV_002B&SUBSYS_3040103C&REV_01\4&188BCC27&0&00E3: Atheros AR9285 Wireless Network Adapter
PCI\VEN_8086&DEV_0044&SUBSYS_00000000&REV_02\3&33FD14CA&0&00: Intel(R) processor DRAM Controller - 0044
PCI\VEN_8086&DEV_0046&SUBSYS_1423103C&REV_02\3&33FD14CA&0&10: Intel(R) HD Graphics
PCI\VEN_8086&DEV_2448&SUBSYS_00000000&REV_A5\3&33FD14CA&0&F0: Intel(R) 82801 PCI Bridge - 2448
PCI\VEN_8086&DEV_2C62&SUBSYS_00000000&REV_02\3&4F11E61&0&00 : QuickPath Architecture Generic Non-core Registers - 2C62
PCI\VEN_8086&DEV_2D01&SUBSYS_00000000&REV_02\3&4F11E61&0&01 : QuickPath Architecture System Address Decoder - 2D01
PCI\VEN_8086&DEV_2D10&SUBSYS_00000000&REV_02\3&4F11E61&0&10 : QPI Link 0 - 2D10
PCI\VEN_8086&DEV_2D11&SUBSYS_00000000&REV_02\3&4F11E61&0&11 : QPI Physical 0 - 2D11
PCI\VEN_8086&DEV_2D12&SUBSYS_00000000&REV_02\3&4F11E61&0&12 : Reserved - 2D12
PCI\VEN_8086&DEV_2D13&SUBSYS_00000000&REV_02\3&4F11E61&0&13 : Reserved - 2D13
PCI\VEN_8086&DEV_3B0B&SUBSYS_00000000&REV_05\3&33FD14CA&0&F8: Intel(R) HM57 Express Chipset LPC Interface Controller - 3B0B
PCI\VEN_8086&DEV_3B2F&SUBSYS_1423103C&REV_05\3&33FD14CA&0&FA: Intel(R) 5 Series/3400 Series Chipset Family 6 Port SATA AHCI Controller - 3B2F
PCI\VEN_8086&DEV_3B32&SUBSYS_1423103C&REV_05\3&33FD14CA&0&FE: Intel(R) 5 Series/3400 Series Chipset Family Thermal Subsystem - 3B32
PCI\VEN_8086&DEV_3B34&SUBSYS_1423103C&REV_05\3&33FD14CA&0&E8: Intel(R) 5 Series/3400 Series Chipset Family USB Enhanced Host Controller - 3B34
PCI\VEN_8086&DEV_3B3C&SUBSYS_1423103C&REV_05\3&33FD14CA&0&D0: Intel(R) 5 Series/3400 Series Chipset Family USB Enhanced Host Controller - 3B3C
PCI\VEN_8086&DEV_3B42&SUBSYS_00000000&REV_05\3&33FD14CA&0&E0: Intel(R) 5 Series/3400 Series Chipset Family PCI Express Root Port 1 - 3B42
PCI\VEN_8086&DEV_3B44&SUBSYS_00000000&REV_05\3&33FD14CA&0&E1: Intel(R) 5 Series/3400 Series Chipset Family PCI Express Root Port 2 - 3B44
PCI\VEN_8086&DEV_3B48&SUBSYS_00000000&REV_05\3&33FD14CA&0&E3: Intel(R) 5 Series/3400 Series Chipset Family PCI Express Root Port 4 - 3B48
PCI\VEN_8086&DEV_3B4C&SUBSYS_00000000&REV_05\3&33FD14CA&0&E5: Intel(R) 5 Series/3400 Series Chipset Family PCI Express Root Port 6 - 3B4C
PCI\VEN_8086&DEV_3B56&SUBSYS_1423103C&REV_05\3&33FD14CA&0&D8: Microsoft PCI\VEN_8086&DEV_3B64&SUBSYS_1423103C&REV_06\3&33FD14CA&0&B0: Intel(R) Management Engine Interface
22 matching device(s) found.
参考:
java.lang.Runtime类总结http://blog.chinaunix.net/uid-128922-id-289994.html
深入研究java.lang.Runtime类http://lavasoft.blog.51cto.com/62575/15565/


0 0