使用HttpURLConnection时遇到的资源未释放的问题
来源:互联网 发布:淘宝买东西寄到澳洲 编辑:程序博客网 时间:2024/06/04 20:09
http://blog.sina.com.cn/s/blog_56beadc60100j9zu.html
今天自己写了一个压力测试的小程序,同时启100个线程,每个线程都串行地访问应用服务器上的一个jsp页面200次。在程序运行了一会儿以后,问题来了:
java.net.SocketException: No buffer space available (maximum connections reached?): connect at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182) at java.net.Socket.connect(Socket.java:516) at java.net.Socket.connect(Socket.java:466) at sun.net.NetworkClient.doConnect(NetworkClient.java:157) at sun.net.www.http.HttpClient.openServer(HttpClient.java:365) at sun.net.www.http.HttpClient.openServer(HttpClient.java:477) at sun.net.www.http.HttpClient.<init>(HttpClient.java:214) at sun.net.www.http.HttpClient.New(HttpClient.java:287) at sun.net.www.http.HttpClient.New(HttpClient.java:299) at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:796) at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:748) at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:673) at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:840)
到网上查了查,应该是资源耗尽了,但是没有找到解决的方法。
程序片断代码如下:
for (int j = 0; j < 200; j++) { long beginTime = System.currentTimeMillis(); URL url = new URL("..."); HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); httpURLConnection.setDoOutput(true); httpURLConnection.setRequestMethod("POST"); OutputStream os = httpURLConnection.getOutputStream(); keywordNum = random.nextInt(myKeywords.length); os.write(("keyword=" + myKeywords[keywordNum]).getBytes("UTF8")); os.flush(); os.close(); int i = 0; int contentLength = 0; contentLength = httpURLConnection.getContentLength(); long endTime = System.currentTimeMillis(); System.out.println("Thread '" + name + "' search keyword '" + myKeywords[keywordNum] + "' and get content in " + (endTime - beginTime) + " Millis, length=" + contentLength); }
后来想了想,既然资源没释放,释放就可以了。查了一下HttpURLConnection有个disconnect方法,但是加上后也没有用。再找,jdk的docs里说,HttpURLConnection这个对象关掉相关的InputStream和OutputStream可以释放掉相关资源,于是试了下,在contentLength = httpURLConnection.getContentLength();这行后面又加了2行:
InputStream is = httpURLConnection.getInputStream(); is.close();
问题解决了。
原来只是知道如果不调用httpURLConnection的getContentLength或其它get方法,请求是不会提交的,一般如果不需要也不会去调getInputStream,没想到还有个释放资源的问题。
- 使用HttpURLConnection时遇到的资源未释放的问题
- 未释放kafka资源导致的问题
- HttpUrlConnection使用时遇到的问题
- C#释放未托管的资源
- jni未释放资源问题
- 关于GDI资源使用后未释放,导致GDI对象猛增,程序花屏,异常退出的问题
- Android使用HttpURLConnection编程遇到的302重定向问题
- C#的资源释放问题
- 使用HttpURLConnection做代理时遇到的cookie放不进去的问题
- UIScrollView的动画未结束时释放崩溃问题
- 使用using关键字同时释放多个资源的问题
- 使用using关键字同时释放多个资源的问题
- 遇到一个数据库链接未释放问题
- 资源未释放引起的内存漏洞模拟
- 手动查看和删除IPC未释放的资源
- MySql数据库使用遇到的问题(服务未启动)
- 插件apk推出,资源释放的问题
- JDBC:JDBC资源释放的细节问题
- 使用Hibernate 基本原理,步骤,核心,实现增删查改
- 放麦子 你一定听说过这个故事。国王对发明国际象棋的大臣很佩服,问他要什么报酬,大臣说:请在第1个棋盘格放1粒麦子,在第2个棋盘格放2粒麦子,
- 第七周任务二
- Android 4.0 WIFI初始化与启动流程
- 正式开启android之旅
- 使用HttpURLConnection时遇到的资源未释放的问题
- PLSQL Developer首选项设置 用户界面 - 代码助手
- 高仿UC浏览器弹出菜单效果
- c++函数返回值与引用
- Java----AWT组件开发和Swing界面编程(二)
- 『HTML5挑战经典』是英雄就下100层-开源讲座(二)危险!英雄
- 关于inputStream.available()与HttpURLConnection.getContentLength()方法获取下载文件的大小
- Java中的final的三种用法
- 达内C++21天培训课程看完了!总结!明天开始打JAVA基础。