深入研究java.lang.Runtime类

2023-11-03

转自:http://lavasoft.blog.51cto.com/62575/15565/

一、概述
      Runtime类封装了运行时的环境。每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。
      一般不能实例化一个Runtime对象,应用程序也不能创建自己的 Runtime 类实例,但可以通过 getRuntime 方法获取当前Runtime运行时对象的引用。
      一旦得到了一个当前的Runtime对象的引用,就可以调用Runtime对象的方法去控制Java虚拟机的状态和行为。
      当Applet和其他不被信任的代码调用任何Runtime方法时,常常会引起SecurityException异常。
二、API预览
    addShutdownHook(Thread hook)
      注册新的虚拟机来关闭挂钩。
    availableProcessors()
      向 Java 虚拟机返回可用处理器的数目。
    exec(String command)
      在单独的进程中执行指定的字符串命令。
    exec(String[] cmdarray)
      在单独的进程中执行指定命令和变量。
    exec(String[] cmdarray, String[] envp)
      在指定环境的独立进程中执行指定命令和变量。
    exec(String[] cmdarray, String[] envp, File dir)
      在指定环境和工作目录的独立进程中执行指定的命令和变量。
    exec(String command, String[] envp)
      在指定环境的单独进程中执行指定的字符串命令。
    exec(String command, String[] envp, File dir)
      在有指定环境和工作目录的独立进程中执行指定的字符串命令。
    exit(int status)
      通过启动虚拟机的关闭序列,终止当前正在运行的 Java 虚拟机。
    freeMemory()
      返回 Java 虚拟机中的空闲内存量。
    gc()
      运行垃圾回收器。
    InputStream getLocalizedInputStream(InputStream in)
      已过时。 从 JDK 1.1 开始,将本地编码字节流转换为 Unicode 字符流的首选方法是使用 InputStreamReader 和 BufferedReader 类。
    OutputStream getLocalizedOutputStream(OutputStream out)
      已过时。 从 JDK 1.1 开始,将 Unicode 字符流转换为本地编码字节流的首选方法是使用 OutputStreamWriter、BufferedWriter 和 PrintWriter 类。
    getRuntime()
      返回与当前 Java 应用程序相关的运行时对象。
    halt(int status)
      强行终止目前正在运行的 Java 虚拟机。
    load(String filename)
      加载作为动态库的指定文件名。
    loadLibrary(String libname)
      加载具有指定库名的动态库。
    maxMemory()
      返回 Java 虚拟机试图使用的最大内存量。
    removeShutdownHook(Thread hook)
      取消注册某个先前已注册的虚拟机关闭挂钩。
    runFinalization()
      运行挂起 finalization 的所有对象的终止方法。
    runFinalizersOnExit(value)
      已过时。 此方法本身具有不安全性。它可能对正在使用的对象调用终结方法,而其他线程正在操作这些对象,从而导致不正确的行为或死锁。
    totalMemory()
      返回 Java 虚拟机中的内存总量。
    traceInstructions(on)
      启用/禁用指令跟踪。
    traceMethodCalls(on)
      启用/禁用方法调用跟踪。 三、常见的应用
1、内存管理:
Java提供了无用单元自动收集机制。通过totalMemory()和freeMemory()方法可以知道对象的堆内存有多大,还剩多少。
Java会周期性的回收垃圾对象(未使用的对象),以便释放内存空间。但是如果想先于收集器的下一次指定周期来收集废弃的对象,可以通过调用gc()方法来根据需要运行无用单元收集器。一个很好的试验方法是先调用gc()方法,然后调用freeMemory()方法来查看基本的内存使用情况,接着执行代码,然后再次调用freeMemory()方法看看分配了多少内存。下面的程序演示了这个构想。

//此实例来自《java核心技术》卷一
 
class MemoryDemo{
         public static void main(String args[]){
                Runtime r = Runtime.getRuntime();
                 long mem1,mem2;
                Integer someints[] = new Integer[1000];
                System.out.println( "Total memory is :" + r.totalMemory());
                mem1 = r.freeMemory();
                System.out.println( "Initial free is : " + mem1);
                r.gc();
                mem1 = r.freeMemory();
                System.out.println( "Free memory after garbage collection : " + mem1);
                 //allocate integers
                 for( int i=0; i<1000; i++) someints[i] = new Integer(i);    
                mem2 = r.freeMemory();
                System.out.println( "Free memory after allocation : " + mem2);
                System.out.println( "Memory used by allocation : " +(mem1-mem2));    
                 //discard Intergers
                 for( int i=0; i<1000; i++) someints[i] = null;
                r.gc(); //request garbage collection
                mem2 = r.freeMemory();
                System.out.println( "Free memory after collecting " + "discarded integers : " + mem2);
        }
}

编译后运行结果如下(不同的机器不同时间运行的结果也不一定一样):
Total memory is :2031616
Initial free is : 1818488
Free memory after garbage collection : 1888808
Free memory after allocation : 1872224
Memory used by allocation : 16584
Free memory after collecting discarded integers : 1888808
2、执行其他程序
在安全的环境中,可以在多任务操作系统中使用Java去执行其他特别大的进程(也就是程序)。ecec()方法有几种形式命名想要运行的程序和它的输入参数。ecec()方法返回一个Process对象,可以使用这个对象控制Java程序与新运行的进程进行交互。ecec()方法本质是依赖于环境。
下面的例子是使用ecec()方法启动windows的记事本notepad。这个例子必须在Windows操作系统上运行。 //此实例来自《Java核心技术》卷一
class ExecDemo {
         public static void main(String args[]){
                Runtime r = Runtime.getRuntime();
                Process p = null;
                 try{
                        p = r.exec( "notepad");
                } catch (Exception e) {
                        System.out.println( "Error executing notepad.");
                }
        }
}
ecec()还有其他几种形式,例子中演示的是最常用的一种。ecec()方法返回Process对象后,在新程序开始运行后就可以使用Process的方法了。可以用destory()方法杀死子进程,也可以使用waitFor()方法等待程序直到子程序结束,exitValue()方法返回子进程结束时返回的值。如果没有错误,将返回0,否则返回非0。下面是关于ecec()方法的例子的改进版本。例子被修改为等待,直到运行的进程退出:
//此实例来自《Java核心技术》卷一
class ExecDemoFini {
    public static void main(String args[]){
        Runtime r = Runtime.getRuntime();
        Process p = null;
        try{
            p = r.exec("notepad");
            p.waitFor();
        } catch (Exception e) {
            System.out.println("Error executing notepad.");
        }
        System.out.println("Notepad returned " + p.exitValue());
    }
}
下面是运行的结果(当关闭记事本后,会接着运行程序,打印信息):
Notepad returned 0
请按任意键继续. . .
当子进程正在运行时,可以对标准输入输出进行读写。getOutputStream()方法和getInPutStream()方法返回对子进程的标准输入和输出。
四、来自SUN公司的java.long.Runtime类的API文档,网上有chm中文版的,很好找。为了查阅方便,我从SUN公司的JavaDoc站点上复制出来了Runtime类的API文档。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深入研究java.lang.Runtime类 的相关文章

  • Android:如何在任何东西(任何活动)之上自由绘图

    如何在所有其他活动之上绘制视图 无论它们显示什么 并且不使用透明活动或消耗其触摸事件 它就像在屏幕上的所有其他应用程序之上显示一个自定义图标 当您触摸它时该图标会做出反应 但您仍然可以触摸屏幕上的其他视图 示例 Facebook 聊天头会在
  • 易失性变量的读-修改-写操作如何保证线程安全

    我正在阅读 JCIP 但无法理解 3 3 1 中的以下声明 只要您可以确保仅从单个线程写入易失性变量 对共享易失性变量执行读取 修改 写入操作就是安全的 在这种情况下 您将修改限制在单个线程中以防止竞争条件 并且易失性变量的可见性保证可确保
  • 模拟匿名函数

    我正在编写 jUnits 但被 Lambda 表达式困住了 有没有办法模拟匿名函数 return retryTemplate execute retryContext gt return mockedResponse 在上面的代码中 我试图
  • Twitter4j - 超出速率限制

    我想让追随者使用getFollowersIds 在 Twitter4j 中 但我得到 连接错误异常 超过限速 public static void main String args try Twitter twitter TwitterFa
  • CompletableFuture:几个任务

    如何使用 5 个 CompletableFutures 异步执行 20 个 Runnable 任务 或 1 个任务 20 次 这就是我所拥有的 Runnable task gt long startTime System currentTi
  • Eclipse - 即使java文件有编译错误也会自动生成类文件

    我创建了一个简单的 java 文件 有编译错误 已删除 在第 4 行 public class Test public static void main String args System out println Hi 保存后 如果我看到
  • Play 2.4,错误:包play.*不存在

    我想开始使用 play 框架 2 4 4 并想遵循教程 我正在关注这个 YouTube 视频 https www youtube com watch v bLrmnjPQsZc从他们的网站 使用 play java 模板并将其导入 Inte
  • 对 Java 安全性和 BouncyCastle API 感到茫然和困惑

    我一直在尝试理解 Java 的 BouncyCastle 加密 API 不幸的是 我发现 Java 密码学总体上被服务提供者接口和术语所掩盖 以至于我无法理解任何东西的实际作用 我已经尝试反复阅读必要的文档 但它仍然难以理解 引入了许多远远
  • 将 1GB 文件的内容流式传输到单列下的 sqlite 表

    下面的实现给出了具有 4 GB 堆空间的 1 GB 大小的文件的内存不足错误 Files lines 将返回一个流 但在运行 Collectors joining 时会出现堆错误 我们可以使用 jooq 和 jdbc 保留原始行分隔符来流式
  • 纯java adb客户端[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 ADB http developer android com tools help adb html分
  • Java / Scala Future 由回调驱动

    简洁版本 我怎样才能创建一个Promise
  • 如何使用 spring data jpa 调用数据库函数?

    我想从 Spring Boot 应用程序调用数据库函数 该函数将返回解密的值 是否可以使用spring data jpa调用数据库函数 如果可以的话怎么办 如果无法使用 spring data jpa 是否有其他方法可以从 Spring B
  • 更改Java日期的格式[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有格式为 Date 的对象 107 2013 12 00 00 AM 我的期望值 2013 07 01 我如何做到这一点 我正在尝试使用这
  • 将 Scala 库转换为 DLL (.NET)

    我正在尝试从 scala 类创建一个 Dll 我将 IntelliJ 与 SBT 一起使用 我已经找到了一种使用 ikvm converter 将 jar 文件转换为 Dll 的方法 现在的问题是 当我在 SBT 下使用 package 从
  • 如何解决找不到 com.google.cloud.Service 的类文件

    我正在尝试将 JSON 数据上传到 gcs 由于我之前没有使用谷歌云 所以我开始将随机字符串上传到 gcs 但在创建存储服务对象时我陷入了困境 Maven 依赖
  • Java 中 float 和 double 基元的比较

    我发现了Java的一个奇怪的角落 我觉得很奇怪 double dd 3 5 float ff 3 5f System out println dd ff 输出 正确 double dd 3 2 float ff 3 2f System ou
  • 如何在java中模拟SHIFT+鼠标按键

    我想将鼠标指针移动到特定位置并执行 SHIFT 鼠标右键单击 我可以将鼠标移动到某个位置 但无法模拟鼠标单击 Robot r new Robot r mouseMove x1 y1 我应该做什么来模拟预期的鼠标点击 我认为您只需要一点额外的
  • 与嵌套泛型集合的混淆

    请帮助我理解为什么add1 and add4 报告错误以及原因add2 and add3 不 具体来说 请举例说明如果编译器允许其中每一个进行编译 则会产生不良后果的示例 class InnerTypeConfusion interface
  • JPA:如何在不加载延迟加载集的情况下计算子记录数

    我正在编写一个 J2EE JPA Spring 3 应用程序 试图保持纯粹的 JPA 2 0 我想获得子对象的计数而不必加载它们 因为这显然是一个昂贵的操作 例如 这是一个简化的示例 Organisation OrgID OrgName E
  • 逆变方法参数类型

    wiki 逆变方法参数类型 https en wikipedia org wiki Covariance and contravariance 28computer science 29 Contravariant method argum

随机推荐

  • Android混合开发快速上手掌握

    目录 一 混合开发简介 二 Android Js互调 2 1 准备自己的html文件 2 2 WebView控件的准备设置 2 3 Android调用Js代码 2 4 Js调用Android方法和传参数 三 常用的几个方法和注意点 3 1
  • 计算机概论抱佛脚

    操作系统 1 提供了在用户和电脑硬件之间的接口 2 没有操作系统的时候是人工设置接线板 直接使用计算机硬件系统 后来是批处理系统 3 软件分类 软件应用软件 系统软件 系统软件工具软件 操作系统 操作系统 外壳 核心 4 Shell是用户和
  • KDB数据库的简单入门

    公司从sybase换到kdb 高度类似oracle 网上资料少找到一些命令 一 下面普及一下KDB产品基本操作 1 K DB启动 kdboot h kdboot 2 k db关闭 kddown kddown h 3 k DB登陆 kdsql
  • WPF编程学习——窗口

    本文目录 1 窗口的外观 2 窗口的位置 3 窗口的大小 4 窗口的可见性和状态 5 窗口的生命周期 1 窗口的外观 WPF中默认窗口框架的外观 主要取决于Icon Title WindowsStyle ResizeMode等属性 Icon
  • Python自然语言处理 NLTK 库用法入门教程【经典】

    本文来源于公众号 csdn2299 喜欢可以关注公众号 程序员学府 本文实例讲述了Python自然语言处理 NLTK 库用法 分享给大家供大家参考 具体如下 在这篇文章中 我们将基于 Python 讨论自然语言处理 NLP 本教程将会使用
  • 在开发过程中应该如何管理枚举类型数据[onJava8] [GPT-4]

    时间 2023 04 12 标签 Java 枚举类型 在开发过程中 为了保持代码的整洁和可维护性 我们可以采用以下几种方式来管理不同的枚举类型数据 单独创建枚举类文件 将每个枚举类型放在一个单独的 Java 文件中 这种方式可以让枚举类型更
  • 对于模板class里输入输出运算符的重载

    先看代码 pragma once include
  • 【C++】C++入门

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 一 命名空间 1 作用域限定符 二 命名空间namespa
  • [Data Structure]图的建立与遍历(c语言)

    图的建立 图的建立过程 初始化一个没有边的图 插入边构件图 一 邻接矩阵表示法 邻接矩阵表示法 通过一个矩阵来表示一张图 以下是结构体构建过程 typedef struct GNode PtrToGNode typedef PtrToGNo
  • 6 款 超好用的 Python 时间库

    六个Python的时间日期库 Dateutil Arrow Moment Maya Delorean Freezegun 内建的 datetime 模块 在介绍其他库之前 让我们回顾以下如何使用datetime模块将日期字符串转换为Pyth
  • java实现postman中form-data传参方式

    postman中几种传参方式区别 1 form data form data主要是以键值对的形式来上传参数 同时参数之间以 分隔符分开 同时也可以上传文件 文件上传要指定文件类型 具体可以看下面的图 2 x www form urlenco
  • 电脑低配,电脑配置低怎么办 如何让电脑运行速度加快

    电脑配置低怎么办 有一些电脑由于配置比较低 所以电脑的运行速度就会变的很慢 如果想要加快电脑在运行时候的速度 那么就需要在硬件或者软件上面进行优化或者提升 那么今天小编就从几个方面来解决配置低的电脑应该如何加快电脑的运行速度 电脑配置低怎么
  • xman 厦门邀请赛 pwn1 babystack writeup

    题目描述 这个题目针对现在的我还是有点难度的 花费了我三天的时间 最后发现原因竟是因为字符转化为整型的过程中多加了好多0 分析思路 1 首先查看文件的详细信息 tucker ubuntu xman pwn pwn1 file babysta
  • MySQL(五)——MySQL索引优化实战(多表联查优化)

    系列文章目录 MySQL 一 索引底层数据结构与算法 MySQL 二 Explain详情与索引最佳实践 MySQL 三 MySQL的内部组件结构及bin log归档 MySQL 四 MySQL索引优化实战 MySQL 五 MySQL索引优化
  • C++ static数据成员和函数

    static 在类的构造函数里初始化static变量显然是不合理的 其实我们可以在类中对static成员变量初始化的 就是使用关键字const进行修饰 只有静态整型常量才能在类中初始化 static const 与const static是
  • 【ArcPy视频教程】基于 ArcGIS Pro 的 ArcPy 教程(录制中)

    Arcpy视频教程 基于 ArcGIS Pro 的 ArcPy 教程 录制中 视频合集 基础01 环境搭建 基础02 几何和游标 上 基础02 几何和游标 下 实例01 网络图商API 上 实例01 网络图商API 下 实例01 网络图商A
  • 数据可视化笔记5 时间数据可视化

    文章目录 时间数据的趋势性 周期性 季节性 随机波动 时间序列数据特征 时间数据可视化设计的三个维度 时间数据可视化图形类型 离散时间数据可视化 连续时间数据可视化 概括 时间数据的趋势性 周期性 季节性 随机波动 时间序列差分 分解 相关
  • 【Linux】shell脚本实战-if多分支条件语句详解

    前言 前面我们已经学习过单分支语句和双分支语句的使用 双分支语句就是在单分支语句的基础上又加了一层结果项 今天我们来探讨下多分支语句 顾名思义 多分支语句就是在双分支语句基础上又加了一个可能性的结果 如果你还没有学习单双分支条件语句 建议参
  • [1121]dependency中的classifier属性

    classifier元素用来帮助定义构件输出的一些附属构件 附属构件与主构件对应 比如主构件是 kimi app 2 0 0 jar 该项目可能还会通过使用一些插件生成 如 kimi app 2 0 0 javadoc jar kimi a
  • 深入研究java.lang.Runtime类

    转自 http lavasoft blog 51cto com 62575 15565 一 概述 Runtime类封装了运行时的环境 每个 Java 应用程序都有一个 Runtime 类实例 使应用程序能够与其运行的环境相连接 一般不能实例