【小家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编程才会用到。小弟不才,这里只能先给一个大写的略字了


相关文章
|
1月前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。HashSet基于哈希表实现,提供高效的元素操作;TreeSet则通过红黑树实现元素的自然排序,适合需要有序访问的场景。本文通过示例代码详细介绍了两者的特性和应用场景。
40 6
|
3天前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
|
20天前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
41 17
|
12天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
16天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
57 4
|
17天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
35 2
|
21天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
25天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
25天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
|
25天前
|
存储 Java 编译器
java wrapper是什么类
【10月更文挑战第16天】
30 3