Runtime 是单例工具类,通过 getRuntime() 获取实例,提供 exec 执行命令、内存/CPU 状态观测、gc/exit/shutdownHook 生命周期控制及与 System 协同实现跨平台调用。

Runtime 类本身不是面向对象设计的“对象”,它是一个单例工具类,所有交互都通过静态获取实例 + 方法调用完成,不涉及继承、多态或封装实例状态。所谓“面向对象方式”在这里应理解为:以 Java 的类和方法为单位组织逻辑,利用封装好的接口安全调用底层能力,而非直接写 C 或系统调用。
获取 Runtime 实例并执行外部命令
每个 JVM 进程中只有一个 Runtime 实例,必须通过 Runtime.getRuntime() 获取,不能 new,也不能子类化:
- 使用 exec(String command) 执行简单命令(如
"ls -l"或"netstat -an") - 更健壮的方式是传入字符串数组:
exec(new String[]{"ping", "-c", "3", "baidu.com"}),避免 shell 解析歧义 - 务必捕获
IOException和InterruptedException,并显式处理子进程的输入/错误流,否则可能阻塞
读取系统运行时状态信息
Runtime 提供了无需权限即可获取的底层资源视图,属于“只读观测”层:
- availableProcessors():返回操作系统报告的可用逻辑 CPU 数(对云服务器弹性核数有参考价值)
- freeMemory()、totalMemory()、maxMemory():反映 JVM 堆内存当前使用边界,不是系统全局内存
- 注意:这些值是近似快照,非实时精确值;如需系统级内存/CPU 使用率,仍需 exec 调用
top、ps或/proc文件(Linux)
安全控制 JVM 生命周期
部分方法体现“运行时治理”能力,但需谨慎使用:
- gc() 是建议式触发,不保证立即执行,仅作提示;现代 JVM 已基本不需要手动调用
- exit(int status) 会强制终止整个 JVM 进程,等效于 System.exit();生产环境应避免无条件调用
- addShutdownHook(Thread hook) 可注册退出前回调,用于释放资源、写日志等,是较安全的生命周期挂钩方式
与 System 类协同构建完整环境视图
Runtime 不提供系统属性或环境变量访问能力,这部分由 System 承担,二者配合才构成完整交互链:
- 用 System.getProperty("os.name") 判断是 Linux 还是 Windows,再决定 exec 什么命令
- 用 System.getenv("HOME") 获取用户主目录,作为 exec 子进程的工作路径(dir 参数)
- 组合使用可写出跨平台脚本调用逻辑,例如:在 Linux 调
kill -9,在 Windows 调taskkill /F /PID











