title: ForkJoinPool - Why program is throwing OutOfMemoryError?
body: <p>I wanted to try out ForkJoinPool in Java 8 so i wrote a small program for searching all the files whose name contains a specific keyword in a given directory.</p>
  
  <p><strong>Program</strong>:</p>
  
  <pre><code>public class DirectoryService {
  
      public static void main(String[] args) {
          FileSearchRecursiveTask task = new FileSearchRecursiveTask("./DIR");
          ForkJoinPool pool = (ForkJoinPool) Executors.newWorkStealingPool();
          List&lt;String&gt; files = pool.invoke(task);
          pool.shutdown();
          System.out.println("Total  no of files with hello" + files.size());
      }
  
  }
  
      class FileSearchRecursiveTask extends RecursiveTask&lt;List&lt;String&gt;&gt; {
          private String path;
          public FileSearchRecursiveTask(String path) {
              this.path = path;
          }
  
          @Override
          protected List&lt;String&gt; compute() {
              File mainDirectory = new File(path);
              List&lt;String&gt; filetedFileList = new ArrayList&lt;&gt;();
              List&lt;FileSearchRecursiveTask&gt; recursiveTasks = new ArrayList&lt;&gt;();
              if(mainDirectory.isDirectory()) {
                  System.out.println(Thread.currentThread() + " - Directory is " + mainDirectory.getName());
                  if(mainDirectory.canRead()) {
                      File[] fileList = mainDirectory.listFiles();
                      for(File file : fileList) {
                          System.out.println(Thread.currentThread() + "Looking into:" + file.getAbsolutePath());
                          if(file.isDirectory()) {
                              FileSearchRecursiveTask task = new FileSearchRecursiveTask(file.getAbsolutePath());
                              recursiveTasks.add(task);
                              task.fork();
                          } else {
                              if (file.getName().contains("hello")) {
                                  System.out.println(file.getName());
                                  filetedFileList.add(file.getName());
                              }
                          }
                      }
                  }
  
                  for(FileSearchRecursiveTask task : recursiveTasks) {
                    filetedFileList.addAll(task.join());
                  }
  
          }
          return filetedFileList;
  
      }
  }
  </code></pre>
  
  <p>This program works fine when directory doesn't have too many sub-directories and files but if its really big then it throws OutOfMemoryError.</p>
  
  <p>My understanding is that max number of threads (including compensation threads) are bounded so why their is this error?  Am i missing anything in my program?</p>
  
  <pre><code>Caused by: java.lang.OutOfMemoryError: unable to create new native thread
  at java.lang.Thread.start0(Native Method)
  at java.lang.Thread.start(Thread.java:714)
  at java.util.concurrent.ForkJoinPool.createWorker(ForkJoinPool.java:1486)
  at java.util.concurrent.ForkJoinPool.tryCompensate(ForkJoinPool.java:2020)
  at java.util.concurrent.ForkJoinPool.awaitJoin(ForkJoinPool.java:2057)
  at java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:390)
  at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:719)
  at FileSearchRecursiveTask.compute(DirectoryService.java:51)
  at FileSearchRecursiveTask.compute(DirectoryService.java:20)
  at java.util.concurrent.RecursiveTask.exec(RecursiveTask.java:94)
  at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
  at java.util.concurrent.ForkJoinPool$WorkQueue.tryRemoveAndExec(ForkJoinPool.java:1107)
  at java.util.concurrent.ForkJoinPool.awaitJoin(ForkJoinPool.java:2046)
  at java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:390)
  at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:719)
  at FileSearchRecursiveTask.compute(DirectoryService.java:51)
  at FileSearchRecursiveTask.compute(DirectoryService.java:20)
  at java.util.concurrent.RecursiveTask.exec(RecursiveTask.java:94)
  at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)   
  </code></pre>