【小家java】聊聊Java中的Runtime类

简介: 【小家java】聊聊Java中的Runtime类

概述


Runtime类封装了运行时的环境。每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。


我们不能实例化一个Runtime对象,应用程序也不能创建自己的 Runtime 类实例,但可以通过 getRuntime 方法获取当前Runtime运行时对象的引用。一旦得到了一个当前的Runtime对象的引用,就可以调用Runtime对象的方法去控制Java虚拟机的状态和行为


当Applet和其他不被信任的代码调用任何Runtime方法时,常常会引起SecurityException异常。


API方法示例


我们先来看看几个native方法:


public native int availableProcessors();
public native long freeMemory();
public native long totalMemory();
public native long maxMemory();


使用示例如下:


Runtime rt = Runtime.getRuntime();
        System.out.println("处理器数量:" + rt.availableProcessors()); //处理器数量:4
        System.out.println("空闲内存数:" + rt.freeMemory() / 1024 / 1024 + "mb"); //空闲内存数:111mb
        System.out.println("总内存数:" + rt.totalMemory() / 1024 / 1024 + "mb"); //总内存数:120mb
        System.out.println("可用最大内存数:" + rt.maxMemory() / 1024 / 1024 + "mb"); //可用最大内存数:1910mb


使用场景:

通过totalMemory()和freeMemory()方法可以知道对象的堆内存有多大,还剩多少。


Java会周期性的回收垃圾对象(未使用的对象),以便释放内存空间。但是如果想先于收集器的下一次指定周期来收集废弃的对象,可以通过调用gc()方法来根据需要运行无用单元收集器。一个很好的试验方法是先调用gc()方法,然后调用freeMemory()方法来查看基本的内存使用情况,接着执行代码,然后再次调用freeMemory()方法看看分配了多少内存。


     version()方法 (since Java9)


     java9t提供了Version方法,可以放我们和方便的获取到运行时的一些参数信息,可以说是非常的人性化。我们看看这个方法源码:

public static Version version() {
        if (version == null) {
            version = new Version(VersionProps.versionNumbers(),
                    VersionProps.pre(), VersionProps.build(),
                    VersionProps.optional());
        }
        return version;
    }


我们发现所有的参数都来自于VersionProps,所以我们贴一些它的源码,大家就都清晰了


class VersionProps {
        private static final String launcher_name = "java";
        private static final String java_version = "10.0.2";
        private static final String java_version_date = "2018-07-17";
        private static final String java_runtime_name = "Java(TM) SE Runtime Environment";
        private static final String java_runtime_version = "10.0.2+13";
        private static final String VERSION_NUMBER = "10.0.2";
        private static final String VERSION_BUILD = "13";
        private static final String VERSION_PRE = "";
        private static final String VERSION_OPT = "";
        private static final boolean isLTS = "".startsWith("LTS");
        private static final String VENDOR_VERSION_STRING = "18.3";
        private static final String vendor_version = (VENDOR_VERSION_STRING.length() > 0
                        ? " " + VENDOR_VERSION_STRING : "");
        static {
            init();
        }
    }


由于我的JDK版本是Java10,所以各位的参数可能和我的不太一样。我运行一下如下:


System.out.println(Runtime.version()); //10.0.2+13


执行其它程序


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


 public static void main(String[] args) throws IOException {
        Runtime rt = Runtime.getRuntime();
        //rt.exec("notepad.exe"); //打开记事本 备注:.exe可以省略 下同
        Process process = rt.exec("calc.exe");//打开计算器
        System.out.println(process); //Process[pid=8108, exitValue="not exited"]
    }


在新程序开始运行后就可以使用Process的方法了。可以用destory()方法杀死子进程,也可以使用waitFor()方法等待程序直到子程序结束,exitValue()方法返回子进程结束时返回的值。如果没有错误,将返回0,否则返回非0。


public static void main(String[] args) throws IOException, InterruptedException {
        Runtime rt = Runtime.getRuntime();
        Process process = rt.exec("notepad.exe"); //打开记事本 备注:.exe可以省略 下同
        //Process process = rt.exec("calc.exe");//打开计算器
        process.waitFor(); //阻塞  等到子进程执行结束
        System.out.println("字进行执行完事了~~~");
        process.destroyForcibly(); //强制杀死子进程 destroy
    }
运行结果:(当关闭记事本后,会接着运行程序,打印信息)


和Gc相关的方法


exit(int status)


通过启动虚拟机的关闭序列,终止当前正在运行的 Java 虚拟机。


gc()


运行垃圾回收器。


halt(int status)


强行终止目前正在运行的 Java 虚拟机。


load和loadLibrary


这两个方法是我们在使用Java的JNI机制时,会用到的一个非常重要的函数,它的作用即是把实现了我们在Java code中声明的native方法的那个libraryload进来,或者load其他什么动态连接库


这儿JNI编程才会用到。小弟不才,这里只能先给一个大写的略字了


相关文章
|
9天前
|
Java Linux
java基础(3)安装好JDK后使用javac.exe编译java文件、java.exe运行编译好的类
本文介绍了如何在安装JDK后使用`javac.exe`编译Java文件,以及使用`java.exe`运行编译好的类文件。涵盖了JDK的安装、环境变量配置、编写Java程序、使用命令行编译和运行程序的步骤,并提供了解决中文乱码的方法。
24 1
|
9天前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
21 0
java基础(13)String类
|
24天前
|
Java
java的类详解
在 Java 中,类是面向对象编程的核心概念,用于定义具有相似特性和行为的对象模板。以下是类的关键特性:唯一且遵循命名规则的类名;描述对象状态的私有属性;描述对象行为的方法,包括实例方法和静态方法;用于初始化对象的构造方法;通过封装保护内部属性;通过继承扩展其他类的功能;以及通过多态增强代码灵活性。下面是一个简单的 `Person` 类示例,展示了属性、构造方法、getter 和 setter 方法及行为方法的使用。
|
20天前
|
Java 编译器
Java——类与对象(继承和多态)
本文介绍了面向对象编程中的继承概念,包括如何避免重复代码、构造方法的调用规则、成员变量的访问以及权限修饰符的使用。文中详细解释了继承与组合的区别,并探讨了多态的概念,包括向上转型、向下转型和方法的重写。此外,还讨论了静态绑定和动态绑定的区别,以及多态带来的优势和弊端。
22 9
Java——类与对象(继承和多态)
|
20天前
|
SQL Java 编译器
Java——类与对象(封装)
封装是面向对象编程中的概念,指将数据(属性)和相关操作(方法)组合成独立单元(类),使外部无法直接访问对象的内部状态,只能通过提供的方法进行交互,从而保护数据安全。例如,手机将各种组件封装起来,只暴露必要的接口供外部使用。实现封装时,使用`private`关键字修饰成员变量,并提供`get`和`set`方法进行访问和修改。此外,介绍了包的概念、导入包的方式及其注意事项,以及`static`关键字的使用,包括静态变量和方法的初始化与代码块的加载顺序。
23 10
Java——类与对象(封装)
|
2天前
|
Java API
Java的日期类都是怎么用的
【10月更文挑战第1天】本文介绍了 Java 中处理日期和时间的三个主要类:`java.util.Date`、`java.util.Calendar` 和 `java.time` 包下的新 API。`Date` 类用于表示精确到毫秒的瞬间,可通过时间戳创建或获取当前日期;`Calendar` 抽象类提供丰富的日期操作方法,如获取年月日及时区转换;`java.time` 包中的 `LocalDate`、`LocalTime`、`LocalDateTime` 和 `ZonedDateTime` 等类则提供了更为现代和灵活的日期时间处理方式,支持时区和复杂的时间计算。
26 14
|
20天前
|
Java C语言
Java——类与对象
这段内容介绍了Java中的类和对象、`this`关键字及构造方法的基本概念。类是对现实世界事物的抽象描述,包含属性和方法;对象是类的实例,通过`new`关键字创建。`this`关键字用于区分成员变量和局部变量,构造方法用于初始化对象。此外,还介绍了标准JavaBean的要求和生成方法。
21 9
Java——类与对象
|
19天前
|
存储 安全 Java
Java——String类详解
String 是 Java 中的一个类,用于表示字符串,属于引用数据类型。字符串可以通过多种方式定义,如直接赋值、创建对象、传入 char 或 byte 类型数组。直接赋值会将字符串存储在串池中,复用相同的字符串以节省内存。String 类提供了丰富的方法,如比较(equals() 和 compareTo())、查找(charAt() 和 indexOf())、转换(valueOf() 和 format())、拆分(split())和截取(substring())。此外,还介绍了 StringBuilder 和 StringJoiner 类,前者用于高效拼接字符串,后者用于按指定格式拼接字符串
19 1
Java——String类详解
|
10天前
|
存储 Java
Java编程中的对象和类
【8月更文挑战第55天】在Java的世界中,“对象”与“类”是构建一切的基础。就像乐高积木一样,类定义了形状和结构,而对象则是根据这些设计拼装出来的具体作品。本篇文章将通过一个简单的例子,展示如何从零开始创建一个类,并利用它来制作我们的第一个Java对象。准备好让你的编程之旅起飞了吗?让我们一起来探索这个神奇的过程!
25 10
|
6天前
|
安全 Java 编译器
java访问类字段
java访问类字段
下一篇
无影云桌面