Runtime详解一

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.exeD:\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",这是实际开发中常用的方式
  1. "exec("cmd /c echo 123")":不会弹出cmd窗口,也不会一闪而过,直观上看不到任何东西
  2. "exec("cmd /c dir E:\\gxg")":不会弹出cmd窗口,也不会一闪而过,直观上看不到任何东西
  3. "exec("cmd /c E:\\jarDir\\test.jar")":可执行jar程序必须加"cmd /c"运行
  4. "exec("cmd /c E:\\Study_Note\\html\\Html_in-depth.docx")":打开指定文档,也可以是其它格式,如png、jpg、pptx、pdf等等,会调用它们的默认程序来打开它们
  5. "exec("cmd /c D:\\PotPlayer\\PotPlayerMini.exe")":exe程序前面加不加"cmd /c"都能正常运行
  6. 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"参数
  1. exec("cmd /c start echo 123"):弹出cmd框显示字符“123”
  2. exec("cmd /c start dir E:\\gxg"):弹出cmd框显示"E:\\gxg"目录的详细信息
  3. exec("cmd /c start E:\\xfmovie\\a.txt"):会打开a.txt文件,因为没有cmd输出内容,所以不会弹出cmd框,与不加"start"参数是一样的
  4. 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();
    }
}









猜你喜欢

转载自blog.csdn.net/wangmx1993328/article/details/80277277