【发布时间】:2012-12-17 13:31:14
【问题描述】:
对于一些背景, 据我所知,当我们启动一个 java 应用程序时,JVM 会为应用程序分配一个堆空间和一个堆栈。此堆用于存储应用程序创建的所有对象。
我的问题是,如果我从我的 java 代码中调用 Shell 脚本,脚本使用的内存是从 JVM 堆空间分配还是使用系统内存空间。
【问题讨论】:
-
请看我更新的答案。
对于一些背景, 据我所知,当我们启动一个 java 应用程序时,JVM 会为应用程序分配一个堆空间和一个堆栈。此堆用于存储应用程序创建的所有对象。
我的问题是,如果我从我的 java 代码中调用 Shell 脚本,脚本使用的内存是从 JVM 堆空间分配还是使用系统内存空间。
【问题讨论】:
将使用系统内存。
Java 将调用fork() 系统调用,该系统调用将复制父内存(当前正在使用的 JVM 内存)以便能够运行子内存(您尝试运行的命令)。
一般来说,当你执行一个进程时,你必须先fork()再exec()。分叉通过复制当前进程来创建一个子进程。然后,您调用exec() 将“进程映像”更改为新的“进程映像”,实质上是在子进程中执行不同的代码。这就是您创建新进程以执行其他程序/脚本的方式。
见:
【讨论】: