Java启动新进程时内存有何变化?新进程一定会开启新JVM吗?
Java进程启动API相关问题解答
调用ProcessBuilder.start()或Runtime.getRuntime().exec()的底层行为
这两个API是Java提供的操作系统级进程创建入口,本质是封装了对应操作系统的原生进程创建接口(Linux下为fork/exec系列调用,Windows下为CreateProcess接口),会在当前运行的JVM进程之外,创建一个完全独立的操作系统进程,新进程拥有独立的PID、内存空间、文件句柄等系统资源,和父JVM进程默认互相隔离。
新进程是否会开启带独立栈、堆的新JVM?
该结果完全取决于你启动的目标程序类型:
- 如果你启动的目标是Java执行命令,比如调用
new ProcessBuilder("java", "-jar", "demo.jar").start()运行另一个Java包,这种场景下确实会启动一个全新的JVM实例,该JVM拥有完全独立的堆、栈、运行时常量池等内存区域,参数配置和父JVM完全独立,二者不存在内存共享。 - 如果你启动的是其他原生程序,比如
Runtime.getRuntime().exec("notepad")启动记事本,或者执行Linux的ls、ping等命令,新进程是原生程序的运行实例,完全不会涉及JVM启动,也不存在JVM的栈、堆结构。
创建新进程时一定会启动新JVM实例吗?
不会。这两个API是通用的进程启动工具,本身没有绑定JVM启动逻辑,只有当你明确传入Java启动命令作为执行目标时,才会触发新JVM的创建。绝大多数场景下启动非Java程序时,都不会产生新的JVM实例。
内容的提问来源于stack exchange,提问作者NoobCoder
相关产品推荐
相关产品推荐

