子进程将继承父进程调用fork()之前的所有系统资源,当然包括代码段。
但是,父子进程的地址空间一开始是共享的。只有当父子进程中的任何一个企图修改其中的内容时才进行复制,这就是copy on write。ref:https://zhidao.baidu.com/question/295061482.html问题:
执行fork之后,
1.子进程会继承父进程的定时任务吗?
2.子进程会占有父进程本来占有的端口(如父进程原来用于监听外部请求的端口)吗?ps:
问题起因:看了这片文章(http://blog.csdn.net/vernonzheng/article/details/8644936)最后的分析
:“因此我分析,问题的原因可能是这样的,虽然Linux早已在fork()中采用copy-on-write机制,但是JVM调用fork()后,Java进程里的其它线程往往会被调度回来继续执行,修改了自己的内存,而这个时候execvp()还没有执行,于是悲剧就发生了,内存都要重新复制一遍。“
但是,父子进程的地址空间一开始是共享的。只有当父子进程中的任何一个企图修改其中的内容时才进行复制,这就是copy on write。ref:https://zhidao.baidu.com/question/295061482.html问题:
执行fork之后,
1.子进程会继承父进程的定时任务吗?
2.子进程会占有父进程本来占有的端口(如父进程原来用于监听外部请求的端口)吗?ps:
问题起因:看了这片文章(http://blog.csdn.net/vernonzheng/article/details/8644936)最后的分析
:“因此我分析,问题的原因可能是这样的,虽然Linux早已在fork()中采用copy-on-write机制,但是JVM调用fork()后,Java进程里的其它线程往往会被调度回来继续执行,修改了自己的内存,而这个时候execvp()还没有执行,于是悲剧就发生了,内存都要重新复制一遍。“
1.子进程也会监听父进程打开的端口?就是外部请求会被子进程和父进程两者接收和处理?子进程接收到请求会像父进程原本的逻辑一样处理?
2.定时任务是指父进程原本起了一个线程在不停的运行,比如该线程每sleep了3秒之后执行一个任务,相当于一个定时任务。那么子进程会继承父进程的正在运行的线程吗?
解决方法:
1、新起一个Java进程,通过socket与主进程通信。这样运行Runtime.exec时只会将新进程内存加倍。
2、坐等JDK1.7发布。该bug在JDK1.7中被Fix。ref:迟一刀 : http://bbs.csdn.net/topics/370027519