title: java.net.SocketException: Too many open files
body: <p>I have a java app which runs just fine (on Ubuntu 10.04) for few hours until it hits "java.net.SocketException: Too many open files". The code for Sender.java can be found <a href="https://code.google.com/p/android-marketplace-crawler/source/browse/crawler/src/com/marketplace/io/Sender.java">here</a> </p>
  
  <p>Is it because I create a new instance of <code>HttpPut</code> and <code>HttpPost</code> for each thread? I'm using apache-commons HTTPClient 4. </p>
  
  <p>Here's the exception log:</p>
  
  <pre><code>java.net.SocketException: Too many open files
      at java.net.Socket.createImpl(Socket.java:414)
      at java.net.Socket.connect(Socket.java:544)
      at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:123)
      at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:133)
      at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149)
      at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:108)
      at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:415)
      at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:641)
      at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:576)
      at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:554)
      at com.marketplace.io.Sender.doBasicHttpPost(Sender.java:434)
      at com.marketplace.io.Sender.appVisualExists(Sender.java:223)
      at com.marketplace.io.Sender.addVisualToCollection(Sender.java:350)
      at com.marketplace.service.ImageThread.run(ImageThread.java:136)
      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
      at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
      at java.util.concurrent.FutureTask.run(FutureTask.java:166)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
      at java.lang.Thread.run(Thread.java:636)
  </code></pre>