java基础:java.lang.Runtime

作者: wuxiaowei | 来源:发表于2017-05-27 16:00 被阅读119次

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基础:java.lang.Runtime

    Runtime简介 当程序运行时,每个java应用程序都能得到一个运行时的实例,应用程序不能创建这个实例,只能从g...

  • 【androidstudio】java.lang.Runtime

    问题 解决方法 1、打开Androidmainfest文件2、点击下面的Merged Manifest

  • Java 基础

    Java 基础01Java开发入门 Java 基础02Java编程基础 Java 基础03面向对象 Java 基础...

  • 技术体系

    一,java核心 java基础,jvm,算法,多线程,设计模式 Java基础:java基础相关,全栈java基础 ...

  • 面试题汇总

    1.Java基础面试问题 Java基础之基础问题 Java基础之面向对象 Java基础之数据结构 Java基础之I...

  • 【Android】知识点汇总,坚持原创ing

    Android基础 Java基础 Java基础——Java内存模型和垃圾回收机制 语法基础 语法基础——C语法基础...

  • Java基础:反射

    反射注解动态代理相关阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 ...

  • Java基础:注解

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 1. 概述 注解...

  • Java基础:动态代理

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 概述 在运行时,...

  • Java 集合类原理

    Java基础——HashMap源码分析 Java基础——HashSet源码分析 Java基础——HashTable...

网友评论

    本文标题:java基础:java.lang.Runtime

    本文链接:https://www.haomeiwen.com/subject/llgffxtx.html