Brian McCallister writes Java Daemonization with posix_spawn(2), or as I like to think of it, Spawn of Java. The problem description:
The traditional way of daemonizing a process involves forking the process and daemonizing it from the current running state. This doesn’t work so well in Java because the JVM relies on several additional worker threads, and
forkonly keeps the thread calling
fork. So, basically, you need to start a new JVM from scratch to create a child process.
The traditional way of launching a new program is to
execthe program you wish to start. Sadly, this also fails on Java because the calls to
execare seperate, non-atomic (in the platonic sense, not the JMM sense) operations. There is no guarantee that the exec will be reached, or that the memory state of the JVM will even be sound when the exec is reached, because you could be in the middle of a garbage collection and pointers could be all over. In practice, this would happen exceptionally rarely, at least. Charles Nutter has talked about this problem in JRuby as well.
Visit Brian's post for the solution.
(You may also enjoy his related POSIX from Java post.)