Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-4167874

URL-downloaded jar files can consume all available file descriptors


    • Subcomponent:
    • Resolved In Build:
    • CPU:
      generic, x86
    • OS:
      generic, windows_xp
    • Verification:


      The JarFile objects created by sun.net.www.protocol.jar.JarFileFactory never get garbage collected, even if the classloader that loaded them goes away. Since each one has an open file descriptor, if an RMI application or server loads classes from enough different jar codebases over time, the process runs out of file descriptors on Solaris, even if the classes have long since been garbage collected.

      Name: boT120536 Date: 05/20/2001

      java version "1.3.0"
      Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.0)
      Java HotSpot(TM) Client VM (build 1.3.0, mixed mode)

      When JarURLConnections to entries inside a JarFile are opened, the jarfile is
      cached, even when caching is explicitly turned off.

      Under Win32 systems, this has the side-effect that the file can no longer be
      modified (e.g. deleted). Under Linux this only results in filedescriptors being
      kept open as can be seen with 'lsof'.

      The source below reproduces this problem, assuming that there is a jarfile
      called 'localfile.jar'.

      --- BEGIN SOURCE ---import java.io.File;
      import java.io.InputStream;
      import java.net.URL;
      import java.net.URLConnection;
       * This class shows the caching bug in JarURLConnection
       * @author ###@###.###
      public class JarURLConnectionTestCase
           * This method opens a local file, opens a non-caching
           * URLConnection, opens a Stream on that connection, closes the
           * stream and tries to delete the file.
           * On Win32 systems, this will cause an exception because the file
           * is still referenced by the URLConnection-cache
          public static void main(String[] args)
              throws Exception
              URL entryURL
                  = new URL("jar:file:localfile.jar!/META-INF/MANIFEST.MF");
              URLConnection connection = entryURL.openConnection();
              // BUG: turn off caching; this does NOT work
              // open and close a stream
              InputStream stream = connection.getInputStream();// causes the caching
              // now delete the file. This fails, because the connection
              // keeps a cache-reference
              File file = new File("localfile.jar");
              System.err.println("Attempting to delete localfile.jar");
              if (!file.delete()) {
                  System.err.println("Deletion failed, bug exists!");
      --- END SOURCE ---

      According to our profiler, the caching happens in
      (Review ID: 124469)


          Issue Links



              • Assignee:
                michaelm Michael McMahon
                bscheiflsunw Bob Scheifler (Inactive)
              • Votes:
                0 Vote for this issue
                1 Start watching this issue


                • Created: