java基础:java.lang.Runtime

Runtime简介

当程序运行时,每个java应用程序都能得到一个运行时的实例,应用程序不能创建这个实例,只能从getRuntime()方法获得RunTime实例。

1. RunTime是单例模式,不能实例化

private static Runtime currentRuntime = new Runtime();
public static Runtime getRuntime() { 
    return currentRuntime;
}
private Runtime() {}

我们看到源码是单例模式实例(饿汉式,线程安全 但效率比较低 ),设计成单例主要是从节约系统资源来考虑。

2. Runtime几个核心方法

  • exec("notepad");
    在单独的进程中执行指定的字符串命令。


    Paste_Image.png
  • exec("notepad","demo");
    在单独的进程中执行指定命令和变量。
Paste_Image.png
  • availableProcessors();
    向 Java 虚拟机返回可用处理器的数目。
    int num = Runtime.getRuntime().availableProcessors();
    System.out.println("返回本机处理器结果:" + num);
    返回本机处理器结果:4

  • Runtime.getRuntime().freeMemory();
    返回 Java 虚拟机中的空闲内存量。
    Long memory = Runtime.getRuntime().freeMemory();
    System.out.println(memory);

  • gc();
    运行垃圾回收器。
    try {
    Long memoryBefor = Runtime.getRuntime().freeMemory();
    System.out.println("当前内存: "+memoryBefor);
    Runtime.getRuntime().gc();
    Long memoryAfter = Runtime.getRuntime().freeMemory();
    System.out.println("执行完GC后内存:"+memoryAfter);
    } catch (Exception e) {
    e.printStackTrace();
    }
当前内存: 15722728
执行完GC后内存:16027912
  • load(String filename)
    加载作为动态库的指定文件名。

  • maxMemory() ;
    返回 Java 虚拟机试图使用的最大内存量。
    Long maxMemeory = Runtime.getRuntime().maxMemory();
    System.out.println(maxMemeory);
    259522560

  • totalMemory()
    返回 Java 虚拟机中的内存总量。
    try {
    Long freeMemory = Runtime.getRuntime().freeMemory();
    System.out.println(freeMemory);
    Long totalMemory = Runtime.getRuntime().totalMemory();
    System.out.println(totalMemory);
    System.out.println("已使用:" + (totalMemory - freeMemory));
    } catch (Exception e) {
    e.printStackTrace();
    }

15722728
16252928
已使用:530200
  • traceInstructions(on)
    启用/禁用跟踪的指令。如果布尔参数是正确的,该方法表明,Java虚拟机发出调试信息每条指令的执行虚拟机。这些信息的格式,文件或其他输出流释放它,取决于主机环境。虚拟机可能会忽略这个请求,如果它不支持此功能。跟踪输出的目的地是依赖于系统的。
    如果布尔参数是假的,这个方法会导致虚拟机停止执行的详细指令跟踪执行。
    我在本机(hotspot JDK1.8)不管如何测试,都没打印出任何信息,不知是否是虚拟机不支持还是什么情况。
  • traceMethodCalls(on)
    启用/禁用方法调用跟踪,同上。

3. RunTime应用

  • 内存监控

我们可以结合RunTime方法几个特点,做个实时内存监控,如我监控某个方法执行消耗了多少内存
public static void main(String[] args) {
Long freeMemery1,freeMemery2;
try {
Runtime r = Runtime.getRuntime();
freeMemery1 = r.freeMemory();
aa();
freeMemery2 = r.freeMemory();
System.out.println("调用方法aa()使用了" + (freeMemery1 - freeMemery2));
} catch (Exception e) {
e.printStackTrace();
}
}

    public static void aa(){
        byte aa [] = new byte[1024 * 1024];
    }

输出结果:
调用方法aa()使用了1048592

  • JVM实时系统内存监控

读者可根据上面的方法自行实现,实现依据是RunTime是单例的,在单机JVM上拿总内存减去空闲内存即可

  • 系统小工具

可以windows平台上直接调用,如查看java -version
public static void main(String[] args) {
try {
Runtime r = Runtime.getRuntime();
Process process = r.exec("java");
InputStream in = process.getInputStream();
Scanner scanner;
scanner = new Scanner(in);
while (scanner.hasNext()) {
System.out.println(scanner.nextLine());
}
} catch (Exception e) {
e.printStackTrace();
}
}

Paste_Image.png

总结

本文是举例说明了我们常见的几个方法,其中内存监控和exec最为常见。上面示例都实现并测试通过,如有不正确,请批评指正,谢谢。

推荐阅读更多精彩内容

  • Java经典问题算法大全 /*【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子...
    江湖宇阅读 1,192评论 0 2
  • 第一章 初识javaJAVA 第一讲:什么是程序?:为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的...
    人子日月几点阅读 294评论 0 1
  • 小编费力收集:给你想要的面试集合 1.C++或Java中的异常处理机制的简单原理和应用。 当JAVA程序违反了JA...
    八爷君阅读 3,563评论 1 115
  • 夏月偷偷走了 我还是喜庆着小日子与诗 十月延续我的满满心思 好在我的前奏已有准备 准备了好心情去看你的世界 我所剩...
    韩克庶阅读 163评论 0 0
  • 他是小熊,残暴却温柔,他是我一个朋友的弟弟,我与他的相识来源于一个误会。他在群里骂人,起初我以为他在骂我,我不...
    浅沫or阅读 715评论 0 3