讲师中心 微信公众号
AI工具推荐 视频效率加速

详解Java Runtime类应用_执行系统命令、获取内存信息与退出管理

星杰姑娘_1559

星杰姑娘_1559

发布时间:2026-02-22 16:08:03

|

179人浏览过

|

来源于php中文网

原创

执行exec()没反应或卡住,主因是未处理子进程的输入/输出流,缓冲区满导致阻塞;必须显式读取或丢弃getInputStream()和getErrorStream()。

详解java runtime类应用_执行系统命令、获取内存信息与退出管理

Runtime.getRuntime().exec() 执行命令为什么没反应或卡住

调用 exec() 后程序没报错、也没输出,甚至主线程卡死——大概率是没处理子进程的输入/输出流。Java 不会自动消费子进程的 stdout 和 stderr,缓冲区满后子进程就会阻塞(比如 ping 输出太多、ls -l 在管道场景下)。

  • 必须显式读取 Process.getInputStream() 和 Process.getErrorStream(),哪怕只是丢弃:
    process.getInputStream().transferTo(new ByteArrayOutputStream());
  • 别用 process.waitFor() 前不读流,尤其在 Windows 上执行 cmd /c dir 类命令时极易卡死
  • 推荐用 ProcessBuilder 替代 exec():它默认继承父进程的流(可设 inheritIO()),也更容易控制工作目录和环境变量
  • 注意路径分隔符:Windows 用 \ 或正斜杠 / 都行,但 Java 字符串里写 "C:\Program Files" 要双反斜杠;Linux 下避免硬编码 /home/user,优先用 System.getProperty("user.home")

getRuntime().freeMemory() / totalMemory() / maxMemory() 数值为什么和 top/jstat 差很多

这三个方法返回的是 JVM 堆内存的当前视图,不是操作系统级内存占用。它们只反映 GC 后堆的可用/已用/上限,完全不包含元空间、直接内存、线程栈、JIT 代码缓存等。

  • freeMemory() 是“当前空闲堆”,不是“还能分配多少”——因为可能触发 GC 后才释放;它甚至可能比上次调用还大(GC 刚发生)
  • maxMemory() 默认等于 -Xmx 值,但如果没设 -Xmx,它会随堆动态扩容,返回的是当前最大允许值,不是物理内存上限
  • 想看真实内存占用?用 ManagementFactory.getOperatingSystemMXBean() 获取 getCommittedVirtualMemorySize()(JDK 8+)或解析 /proc/self/status(Linux)
  • 监控场景下,别轮询 freeMemory() 判断“内存是否紧张”——它波动剧烈,且和 OOM 无直接关系;应结合 MemoryUsage 从 MemoryPoolMXBean 获取各代使用率

Runtime.getRuntime().exit() 和 System.exit() 有什么区别

没区别。System.exit(int) 内部就是调用 Runtime.getRuntime().exit(int)。两者都会终止 JVM,触发 shutdown hooks,并返回退出码给操作系统。

Java注释规范Skills
Java注释规范Skills

当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。

下载
  • 不要在 Web 容器(Tomcat/Spring Boot)里调用它们:会杀死整个 JVM,不是只退出当前请求
  • 退出码非 0(如 exit(1))表示异常终止,Shell 脚本里可用 $? 检查;但 Java 程序中,除非是脚本启动的独立工具类应用,否则基本不该主动 exit
  • 如果想“退出当前逻辑”而非整个 JVM,用 return、抛业务异常、或明确 break/continue,而不是 exit()
  • shutdown hook 里禁止再调用 exit(),会导致死锁——JVM 正在执行 hook 时已禁用新 hook 注册和 exit 调用

Runtime 类为什么不能直接 new,且 getRuntime() 总是返回同一个实例

因为 Runtime 是单例,构造函数私有,且 JVM 在启动时就创建了唯一实例。这是早期 Java 的典型饿汉式单例,不是靠 synchronized 或双重检查实现的,而是由 JVM 硬编码保证。

立即学习“Java免费学习笔记(深入)”;

  • 调用多次 Runtime.getRuntime() 返回的确实是同一对象,== 比较结果为 true;但别拿它做全局状态容器——没有线程安全保证,也没有 clear/reset 方法
  • 不能 new Runtime():编译直接报错,构造函数是 private Runtime()
  • 这个单例不参与任何类加载器隔离:即使在不同 ClassLoader 加载的代码里调用 getRuntime(),拿到的仍是 VM 级单例,共享所有状态(比如 shutdown hooks 是全局注册的)
  • 现代代码中,真正需要直接操作 Runtime 的场景极少;执行命令优先用 ProcessBuilder,内存监控优先走 MXBean,退出逻辑尽量避免 exit —— Runtime 类本身,就是个被时代部分架空的遗留接口
实际用的时候,最容易忘的是 exec 后的流处理,还有把 freeMemory 当系统内存看。这两处一错,问题现象和根因之间隔着整整一个 JVM 层。

热门AI工具

更多
Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

相关专题

更多
如何配置Tomcat环境变量
如何配置Tomcat环境变量

配置Tomcat环境变量需要在系统中添加CATALINA_HOME变量,并将Tomcat的安装路径添加到PATH变量中。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

845

2023.10.26

idea如何集成Tomcat
idea如何集成Tomcat

idea集成Tomcat的步骤:1、添加Tomcat服务器配置;2、配置项目部署;3、运行Tomcat服务器;4、访问项目;5、注意事项;6、关闭Tomcat服务器。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

304

2024.02.23

怎么查看Tomcat源代码
怎么查看Tomcat源代码

查看Tomcat源代码的步骤:1、下载Tomcat源代码;2、在IDEA中导入Tomcat源代码;3、查看源代码;4、理解Tomcat的工作原理;5、参与社区和贡献;6、注意事项;7、持续学习和更新;8、使用工具和插件。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

489

2024.02.23

常见的tomcat漏洞有哪些
常见的tomcat漏洞有哪些

常见的tomcat漏洞有:1、跨站脚本攻击;2、跨站请求伪造;3、目录遍历漏洞;4、缓冲区溢出漏洞;5、配置漏洞;6、第三方组件漏洞。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

305

2024.02.23

tomcat日志乱码怎么解决
tomcat日志乱码怎么解决

tomcat日志乱码的解决办法:1、修改tomcat的日志编码设置;2、检查ide的编码设置;3、检查操作系统的编码设置;4、使用过滤器处理日志;5、检查外部系统的编码设置;6、检查文件编码方式等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

348

2024.02.23

weblogic和tomcat有哪些区别
weblogic和tomcat有哪些区别

weblogic和tomcat的区别:1、功能;2、性能;3、规模;4、价格;5、安全性;6、配置和管理;7、社区支持;8、集成能力;9、升级和更新;10、可靠性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

349

2024.02.23

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

581

2024.02.23

tomcat启动闪退怎么解决
tomcat启动闪退怎么解决

tomcat启动闪退的解决办法:1、检查java环境;2、检查环境变量配置;3、检查端口被占用;4、检查配置文件编码;5、检查启动时需要的配置文件;6、检查相关文件是否丢失;7、检查防火墙和杀毒软件设置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

322

2024.02.23

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

100

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn