使用HttpURLConnection時遇到的資源未釋放的問題


http://blog.sina.com.cn/s/blog_56beadc60100j9zu.html



今天自己寫了一個壓力測試的小程序,同時啟100個線程,每個線程都串行地訪問應用服務器上的一個jsp頁面200次。在程序運行了一會兒以后,問題來了:

 
  1. java.net.SocketException: No buffer space available (maximum connections reached?): connect  
  2.  at java.net.PlainSocketImpl.socketConnect(Native Method)  
  3.  at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)  
  4.  at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)  
  5.  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)  
  6.  at java.net.Socket.connect(Socket.java:516)  
  7.  at java.net.Socket.connect(Socket.java:466)  
  8.  at sun.net.NetworkClient.doConnect(NetworkClient.java:157)  
  9.  at sun.net.www.http.HttpClient.openServer(HttpClient.java:365)  
  10.  at sun.net.www.http.HttpClient.openServer(HttpClient.java:477)  
  11.  at sun.net.www.http.HttpClient.<init>(HttpClient.java:214)  
  12.  at sun.net.www.http.HttpClient.New(HttpClient.java:287)  
  13.  at sun.net.www.http.HttpClient.New(HttpClient.java:299)  
  14.  at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:796)  
  15.  at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:748)  
  16.  at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:673)  
  17.  at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:840)  


到網上查了查,應該是資源耗盡了,但是沒有找到解決的方法。
程序片斷代碼如下:

 
  1. for (int j = 0; j < 200; j++) {  
  2.     long beginTime = System.currentTimeMillis();  
  3.     URL url = new URL("...");  
  4.     HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();  
  5.     httpURLConnection.setDoOutput(true);  
  6.     httpURLConnection.setRequestMethod("POST");  
  7.     OutputStream os = httpURLConnection.getOutputStream();  
  8.       
  9.     keywordNum = random.nextInt(myKeywords.length);  
  10.       
  11.     os.write(("keyword=" + myKeywords[keywordNum]).getBytes("UTF8"));  
  12.     os.flush();  
  13.     os.close();  
  14.     int i = 0;  
  15.     int contentLength = 0;  
  16.     contentLength = httpURLConnection.getContentLength();  
  17.     long endTime = System.currentTimeMillis();  
  18.     System.out.println("Thread '" + name + "' search keyword '" + myKeywords[keywordNum] + "' and get content in " + (endTime - beginTime) + " Millis, length=" + contentLength);  
  19.    }  


后來想了想,既然資源沒釋放,釋放就可以了。查了一下HttpURLConnection有個disconnect方法,但是加上后也沒有用。再找,jdk的docs里說,HttpURLConnection這個對象關掉相關的InputStream和OutputStream可以釋放掉相關資源,於是試了下,在contentLength = httpURLConnection.getContentLength();這行后面又加了2行:

 
  1. InputStream is = httpURLConnection.getInputStream();  
  2. is.close();  


問題解決了。
原來只是知道如果不調用httpURLConnection的getContentLength或其它get方法,請求是不會提交的,一般如果不需要也不會去調getInputStream,沒想到還有個釋放資源的問題。

 

==============================================================

簡單的概括下釋放httpUrlConnection的資源就是:

調用HttpURLConnection的disConnecn方法,還要關掉關聯的inputStream和outputStream


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM