Runtime

Runtime类封装了运行时的环境。每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。Runtime类是单例的,只能通过getRuntime()方法获得Runtime对象。

常见应用:

  • 内存管理:

    Java提供了无用单元自动收集机制。通过totalMemory()和freeMemory()方法可以知道对象的堆内存有多大,还剩多少。Java会周期性的回收垃圾对象(未使用的对象),以便释放内存空间。但是如果想先于收集器的下一次指定周期来收集废弃的对象,可以通过调用gc()方法来根据需要运行无用单元收集器。举个例子来看一下:

package com.koma.demo;

/**
 * @author koma
 * @version 2017年12月7日 下午5:08:39
 */
public class RuntimeTest {
    public static void main(String[] args) {
        memory();
    }

    public static void memory() {
        Runtime r = Runtime.getRuntime();
        System.out.println("totalMemory is :" + r.totalMemory());
        System.out.println("freeMemory is : " + r.freeMemory());
        r.gc();
        long mem1 = r.freeMemory();       
        System.out.println("freeMemory after gc : " + mem1);
        // 给数组分配内存
        String someints[] = new String[100000];
        for (int i = 0; i < 100000; i++)
            someints[i] = i+"";
        long mem2 = r.freeMemory();
        System.out.println("freeMemory after allocation : " + mem2);
        System.out.println("Memory used by allocation : " + (mem1 - mem2));
        // 释放数组空间
        for (int i = 0; i < 100000; i++)
            someints[i] = null;
        r.gc(); // request garbage collection
        mem2 = r.freeMemory();
        System.out.println("freeMemory after collecting discarded integers : " + mem2);
    }

}

结果:

totalMemory is128974848
freeMemory is : 126930104
freeMemory after gc : 128437504
freeMemory after allocation : 107308104
Memory used by allocation : 21129400
freeMemory after collecting discarded integers : 128435928
  • addShutdownHook方法作用
    当程序正常退出,系统调用 System.exit方法或虚拟机被关闭时会执行添加的shutdownHook线程。其中shutdownHook是一个已初始化但并不有启动的线程,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的钩子,当系统执行完这些钩子后,jvm才会关闭。所以可通过这些钩子线程在jvm关闭的时候进行内存清理、资源回收等工作。
package com.koma.demo;
/**
 * @author koma
 * @version 2017年12月8日 上午9:32:57
 */
public class HookTest {
    public static void main(String[] args) {
        Runtime.getRuntime().addShutdownHook(new HookThread());
        try {
            Thread.sleep(1000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("主程序结束时间: "+System.currentTimeMillis());
    }
}

class HookThread extends Thread{

    @Override
    public void run() {
        System.out.println("hook run time: "+System.currentTimeMillis());
    }

}

结果:

主程序结束时间: 1512697007617
hook run time: 1512697007629

钩子线程的时间晚于主程序结束时间。

  • 执行其他程序
    在安全的环境中,可以在多任务操作系统中使用Java去执行其他特别大的进程(也就是程序)。ecec()方法有几种形式命名想要运行的程序和它的输入参数。ecec()方法返回一个Process对象,可以使用这个对象控制Java程序与新运行的进程进行交互。ecec()方法本质是依赖于环境。
    在linux上用Java运行linux命令:
package com.koma.demo;

import java.io.IOException;

/**
 * @author koma
 * @version 2017年12月7日 下午5:08:39
 */
public class RuntimeTest {
    public static void main(String[] args) {
        processLinux();
    }

    public static void processLinux(){
        Runtime r = Runtime.getRuntime();
        try {
            // 删除test.txt文件
            Process p=r.exec("rm -rf test.txt");
            // 等待删除完成,删除完成后返回0
            int i=p.waitFor();
            System.out.println("删除完成后返回: "+i);
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

在windows上调用记事本程序。

package com.koma.demo;

/**
 * @author koma
 * @version 2017年12月7日 下午5:08:39
 */
public class RuntimeTest {
    public static void main(String[] args) {
        processWin();
    }

    public static void processWin() {
        Runtime r = Runtime.getRuntime();
        Process p = null;
        try {
            p = r.exec("notepad");
            // 会阻塞,等待进程结束
            p.waitFor();
            System.out.println("阻塞了吗");
        } catch (Exception e) {
            System.out.println("Error executing notepad.");
        }
        System.out.println("Notepad returned " + p.exitValue());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值