java进程调用外部程序时fork()+exec()分析

java进程调用一个外部程序,一般使用Runtime.getRuntime().exec(cmd)的方式启动。

以下是Runtime.getRuntime().exec(cmd) 的执行流程分析

分析SUN JDK 1.5 SRC,找到Runtime.getRuntime().exec(cmd)的执行流程:

java.lang.Runtime.exec(cmd);

--java.lang.ProcessBuilder.start();

----java.lang.ProcessImpl.start();

------Java_java_lang_UNIXProcess_forkAndExec() in j2se/src/solaris/native/java/lang/UNIXProcess_md.c

--------1). fork(); 2). execvp();

man fork知道,fork产生的子进程需要复制父进程在内存中的所有数据内容(代码段、数据段、堆栈段),由于全部复制开销较大,因此Linux已经采用copy-on-write机制,即只是复制页表,共享内容,在有改变的时候再去申请内存和复制数据。

参考:

http://my.oschina.net/jsan/blog/273672

你可能感兴趣的:(jvm,java)