In Java when does a URL connection close?

JavaExceptionUrlConnection

Java Problem Overview


When does java let go of a connections to a URL? I don't see a close() method on either URL or URLConnection so does it free up the connection as soon as the request finishes? I'm mainly asking to see if I need to do any clean up in an exception handler.

try {
  URL url = new URL("http://foo.bar");
  URLConnection conn = url.openConnection();
  // use the connection
}
catch (Exception e) {
  // any clean up here?
}

Java Solutions


Solution 1 - Java

If you cast to an HttpURLConnection, there is a disconnect() method. If the connection is idle, it will probably disconnect immediately. No guarantees.

Solution 2 - Java

It depends on the specific protocol specified in the protocol. Some maintain persistent connections, other close their connections when your call close in the input or outputstream given by the connection. But other than remembering to closing the streams you opened from the URLConnection, there is nothing else you can do.

From the javadoc for java.net.URLConnection

> Invoking the close() methods on the > InputStream or OutputStream of an > URLConnection after a request may free > network resources associated with this > instance, unless particular protocol > specifications specify different > behaviours for it.

Solution 3 - Java

I had to download several hunders of files at a time and meet the problem.

You may check your app's open descriptors with the following command:

adb shell ps

Find your application PID in the list and use another command:

adb shell run-as YOUR_PACKAGE_NAME ls -l  /proc/YOUR_PID/fd

I see about 150 open descriptors on a usual launch. And there are 700+ when files are downloading. Their number decreases only after some minutes, looks like Android frees them in the background, not when you can close on a stream.

So we can't be sure when the connection closes actually.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiontimdisneyView Question on Stackoverflow
Solution 1 - JavaJames SchekView Answer on Stackoverflow
Solution 2 - JavakasperjjView Answer on Stackoverflow
Solution 3 - JavaArtem MostyaevView Answer on Stackoverflow