Runtime简介
java.lang.Runtime public class Runtime extends Object
- 每个 Java 应用程序都有一个
Runtime
类实例,使应用程序能够与其运行的环境相连接。 - 应用程序不能创建自己的 Runtime 类实例,可以通过
getRuntime
静态方法获取当前运行时机制(Runtime) - 每一个JAVA程序实际上都是启动了一个JVM进程,每一个JVM进程都对应一个Runtime实例
- 得到了当前的Runtime对象的引用,就可以调用Runtime对象的方法去控制Java虚拟机的状态和行为。
方法详解
maxMemory()
- public long maxMemory()
- 返回 Java 虚拟机试图使用的最大内存量,如果内存本身没有限制,则返回值 Long.MAX_VALUE,以字节为单位。
- ***Memory都是关于Java 虚拟机的方法,如果项目中要自己管理内存和垃圾回收等操作时,则可以使用它们
freeMemory()
- public long freeMemory()
- 返回 Java 虚拟机中的空闲内存量,供将来分配对象使用的当前可用内存的近似总量,以字节为单位。
- 调用 gc 方法可能导致 freeMemory 返回值的增加。
totalMemory()
- public long totalMemory()
- 返回 Java 虚拟机中的内存总量,目前为当前和后续对象提供的内存总量,以字节为单位。
- 此方法返回的值可能随时间的推移而变化,这取决于主机环境。
public static void main(String[] args) throws UnsupportedEncodingException { Runtime runtime = Runtime.getRuntime(); System.out.println("JVM试图使用的最大内存量:"+runtime.maxMemory()+"字节"); System.out.println("JVM空闲内存量:"+runtime.freeMemory()+"字节"); System.out.println("JVM内存总量:"+runtime.totalMemory()+"字节"); }
gc()
- public void gc()
- 运行垃圾回收器,调用此方法意味着 Java 虚拟机做了一些努力来回收未用对象,以便能够快速地重用这些对象当前占用的内存。
- 当控制从方法调用中返回时,虚拟机已经尽最大努力回收了所有丢弃的对象。
- 名称 gc 代表“垃圾回收器”,虚拟机根据需要在单独的线程中自动执行回收过程,甚至不用显式调用 gc 方法。
- 方法 System.gc() 是调用此方法的一种传统而便捷的方式。
public static void main(String[] args) throws UnsupportedEncodingException { Runtime runtime = Runtime.getRuntime(); System.out.println("-------str变量未使用前-------------"); System.out.println("JVM试图使用的最大内存量:"+runtime.maxMemory()+"字节"); System.out.println("JVM空闲内存量:"+runtime.freeMemory()+"字节"); System.out.println("JVM内存总量:"+runtime.totalMemory()+"字节"); String str = "00"; for (int i=0;i<2000;i++){ str += "xx"+i; } System.out.println("-------str变量使用后-------------"); System.out.println("JVM试图使用的最大内存量:"+runtime.maxMemory()+"字节"); System.out.println("JVM空闲内存量:"+runtime.freeMemory()+"字节"); System.out.println("JVM内存总量:"+runtime.totalMemory()+"字节"); runtime.gc(); System.out.println("-------垃圾回收后-------------"); System.out.println("JVM试图使用的最大内存量:"+runtime.maxMemory()+"字节"); System.out.println("JVM空闲内存量:"+runtime.freeMemory()+"字节"); System.out.println("JVM内存总量:"+runtime.totalMemory()+"字节"); }
exit(int status)
- public void exit(int status)
- 通过启动虚拟机的关闭序列,终止当前正在运行的 Java 虚拟机。
- status作为状态码,根据惯例,非零的状态码表示非正常终止。
- 每一个Java程序本质就是一个JVM进程,因为Java应用必须在Java虚拟机中运行,所以关闭了JVM等同于关闭了应用
public static void runtimeTest11() throws InterruptedException { Runtime runtime = Runtime.getRuntime(); System.out.println("程序开始,延时10s后程序退出..."); Thread.sleep(10000); runtime.exit(0); System.out.println("JVM已经关闭,此句不会被输出..."); }
exec(String command)
- public Process exec(String command) throws IOException
- 在单独的进程中执行指定的字符串命令,这是一个很有用的方法。
- 对于 exec(command) 形式的调用而言,其行为与调用 exec(command, null, null) 完全相同。
- 参数:command - 一条指定的系统命令。
- 返回:一个新的 Process 对象,用于管理子进程
在安全的环境中,可以在多任务操作系统中使用Java去执行其他特别大的进程(也就是程序)。
/** * 打开指定的程序 * 如windows自带的:记事本程序notepad、计算器程序:notepad.exe、服务程序:services.msc 等等 * 以及安装的第三方程序:D:\Foxmail_7.2\Foxmail.exe、D:\gxg_client\Client.exe 等等 * 或者直接传参,如打开potPlayer播放视频:"D:\PotPlayer\PotPlayerMini.exe E:\xfmovie\WoxND7209-mobile.mp4" * @param appNameORPath:取值如上所示 */ public static final void runExtApp(String appNameORPath) { try { Runtime runtime = Runtime.getRuntime(); runtime.exec(appNameORPath); } catch (IOException e) { e.printStackTrace(); } }
- 上面这种写法,经过反复实践验证后,通常只对"windows自带的程序"、*.exe程序"(写全路径)有效
- 对于其它做法,请参考后面
exec格式详解
错误示范
- cmd中有很多类似如下的指令,如目录统计:"dir"、文件(夹)复制:"copy"、删除文件:del等等
public static void main(String[] args) { try { Runtime runtime = Runtime.getRuntime(); /**这样运行是报错: Cannot run program "dir": * 即默认把"dir"当在程序进行运行了*/ runtime.exec("dir E:\\gxg"); } catch (IOException e) { e.printStackTrace(); } }
cmd /c
- 已经知道exec(String xxx),不加前缀时只能执行windows自带的程序或者可执行的exe文件
- 对于其它cmd指令必须调用windows的cmd程序来执行
- 格式:exec("cmd /c xxx"):cmd表示调用windows的cmd程序来执行后面的"xxx"指令,/c是参数
- 无论什么指令,都建议加上"cmd /c",这是实际开发中常用的方式
- "exec("cmd /c echo 123")":不会弹出cmd窗口,也不会一闪而过,直观上看不到任何东西
- "exec("cmd /c dir E:\\gxg")":不会弹出cmd窗口,也不会一闪而过,直观上看不到任何东西
- "exec("cmd /c E:\\jarDir\\test.jar")":可执行jar程序必须加"cmd /c"运行
- "exec("cmd /c E:\\Study_Note\\html\\Html_in-depth.docx")":打开指定文档,也可以是其它格式,如png、jpg、pptx、pdf等等,会调用它们的默认程序来打开它们
- "exec("cmd /c D:\\PotPlayer\\PotPlayerMini.exe")":exe程序前面加不加"cmd /c"都能正常运行
- exec("cmd /c calc"):windows自带的程序前面加不加cmd /c都能正常运行
public static void main(String[] args) { try { Runtime runtime = Runtime.getRuntime(); /*runtime.exec("cmd /c echo 123");*/ /*runtime.exec("cmd /c dir E:\\gxg");*/ /*runtime.exec("cmd /c E:\\jarDir\\test.jar");*/ /*runtime.exec("cmd /c E:\\Study_Note\\html\\Html_in-depth.docx");*/ /*runtime.exec("cmd /c D:\\PotPlayer\\PotPlayerMini.exe");*/ runtime.exec("cmd /c calc"); } catch (IOException e) { e.printStackTrace(); } }
cmd /c start
- exec("cmd /c dir E:\\gxg"):它默认是不会弹出cmd面板的,如果希望它弹出时,则可以加上"start"参数
- exec("cmd /c start echo 123"):弹出cmd框显示字符“123”
- exec("cmd /c start dir E:\\gxg"):弹出cmd框显示"E:\\gxg"目录的详细信息
- exec("cmd /c start E:\\xfmovie\\a.txt"):会打开a.txt文件,因为没有cmd输出内容,所以不会弹出cmd框,与不加"start"参数是一样的
- exec("cmd /c start notepad"):会打开记事本,但不会弹出cmd框,与不加"strat"时一样
public static void main(String[] args) { try { Runtime runtime = Runtime.getRuntime(); /*runtime.exec("cmd /c start echo 123");*/ /*runtime.exec("cmd /c start dir E:\\gxg");*/ /*runtime.exec("cmd /c start E:\\xfmovie\\a.txt");*/ runtime.exec("cmd /c start notepad"); } catch (IOException e) { e.printStackTrace(); } }