UNIXProcess improvements

Martin Buchholz martinrb at google.com
Wed Apr 21 23:15:43 UTC 2010


I now have the second part of my planned improvements to
Linux process handling, and is now a serious proposal.
for Michael and others to review.

http://cr.openjdk.java.net/~martin/webrevs/openjdk7/UNIXProcess/
http://cr.openjdk.java.net/~martin/webrevs/openjdk7/UNIXProcess2/

This is a huge performance and reliability improvement for
java programs that create many processes.
The program below (ManyProcesses) runs 4 times faster on my machine.

This doesn't try to address Solaris.

Martin

import java.util.*;
import java.util.concurrent.atomic.*;

public class ManyProcesses {
    public static void main(String[] args) throws Throwable {
        final int threadCount = 2;
        final int processCount = 2000;
        final AtomicLong count = new AtomicLong(0);
        Runnable r = new Runnable() {
          public void run() {
            try {
              for (int i = 0; i < processCount; i++) {
                Process p = new ProcessBuilder(new String[] {
"/bin/true" }).start();
                //if (p.waitFor() != 0) throw new Error();
//                 p.getInputStream().close();
//                 p.getOutputStream().close();
//                 p.getErrorStream().close();
                //count.getAndIncrement();
              }
            } catch (Throwable t) {
              throw new Error(t);
            }}};
        List<Thread> threads = new ArrayList<Thread>();
        for (int i = 0; i < threadCount; i++) {
          threads.add(new Thread(r));
        }

        for (Thread thread : threads) thread.start();
        //Thread.sleep(1000 * 10);
        //System.out.println(count.get());
        for (Thread thread : threads) thread.join();
        System.out.println(new Thread().getId());
    }
}

On Tue, Apr 20, 2010 at 08:58, Michael McMahon <Michael.McMahon at sun.com> wrote:
> Martin,
>
> Thanks for the answers. The changes look fine to me.
>
> - Michael.
>
> Martin Buchholz wrote:
>>
>> On Mon, Apr 19, 2010 at 09:04, Michael McMahon <Michael.McMahon at sun.com>
>> wrote:
>>
>>>
>>> Martin Buchholz wrote:
>>>
>>>>
>>>> On Fri, Apr 16, 2010 at 09:18, Mark Reinhold <mr at sun.com> wrote:
>>>>
>>>>
>>>>
>>>>>
>>>>> For now I suggest leaving old @author tags as-is.
>>>>>
>>>>>
>>>>
>>>> OK, done.
>>>>
>>>> Version 0.2 of the webrev is published.
>>>>
>>>> Martin
>>>>
>>>>
>>>
>>> Martin,
>>>
>>> From what I can see, you've cleaned up the code and the functional
>>> changes
>>> are the use of a thread pool, and an explicit (8 k sized) stack.
>>>
>>
>> Exceptions thrown in the "process reaper" thread,
>> which were not IOExceptions,
>> were not being caught, and would cause the user thread to hang.
>>
>>
>>>
>>> Also, the threads created now belong to the root thread group rather than
>>> the application's thread group.
>>>
>>
>> Well, they have to belong to some thread group,
>> and they get reused, so in general the thread group will have
>> no relation to the thread group of the user thread,
>> so may as well use the root thread group.
>> I stole this technique from elsewhere in the JDK.
>>
>>
>>>
>>> Is this so you can handle uncaught
>>> exceptions
>>> as you mentioned before, and if so, I guess some other change is coming
>>> to
>>> complete
>>> this work. Is that right?
>>>
>>
>> Yes.  This change by itself is a clear win,
>> except that because it is more memory efficient,
>> GC is less likely to get called,
>> which means file descriptors of defunct processes
>> are less likely to get cleaned up in the face of
>> lazy user code, which means it is more subject
>> to file descriptor exhaustion problems.
>> Which I would like to fix.
>>
>> Martin
>>
>>
>>>
>>> Thanks,
>>> Michael
>>>
>>>
>>>
>
>



More information about the core-libs-dev mailing list