zoukankan      html  css  js  c++  java
  • 使用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

  • 相关阅读:
    java内存回收机制
    scala学习
    [java实现]找一个数组的最大和的连续子数组(时间复杂度 O(n))
    linux 进程的创建
    linux中的进程和线程
    linux 文件系统
    gdb 调试程序
    makefile
    linux下的gcc编译器
    socket 网络编程
  • 原文地址:https://www.cnblogs.com/toSeeMyDream/p/8228002.html
Copyright © 2011-2022 走看看