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機制,即只是複製頁表,共享內容,在有改變的時候再去申請內存和複製數據。
參考: