这是* nix(和linux)自从时间曙光(或mmus黎明)以来一直工作的方式。
要在*
nixes上创建新进程,请调用fork()。fork()使用其所有内存映射,文件描述符等创建调用过程的副本。内存映射是写时复制的,因此(在最佳情况下)实际上不会复制任何内存,而仅复制这些映射。接下来的exec()调用将当前的内存映射替换为新的可执行文件的映射。因此,fork()/
exec()是创建新进程的方式,而这正是JVM使用的方式。
需要注意的是,繁忙的系统上存在大量进程,父级可能会继续运行一会儿,然后子级exec()会导致大量内存被复制,从而导致写时复制。在VM中,内存可以移动很多,以方便垃圾收集器产生更多的副本。
“解决方法”是做您已经做的事情,创建一个外部轻量级进程来处理产生新进程的过程,或者使用比fork /
exec更轻量级的方法来产生进程(而linux没有,并且无论如何都会这样做)需要更改jvm本身)。Posix指定posix_spawn()函数,从理论上讲,可以在不复制调用进程的内存映射的情况下实现posix_spawn()函数-
但在Linux上不是这样。



