您的位置:首页 > 理论基础 > 计算机网络

java小程序检测web的并发数---HttpClient和util包的concurrent

2015-06-19 08:11 656 查看
1.下载org.apache.commons.httpclient.jar文件。

2.利用HttpClient访问web网站(url)。

3.利用多线程测试并发数。java.util.concurrent包实现并发。

代码如下:

import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.methods.GetMethod;

public class Ceshi {

/**
* @param args
* @throws IOException
* @throws HttpException
* @throws InterruptedException
*/
public static void main(String[] args) throws HttpException, IOException, InterruptedException {
ExecutorService service=Executors.newFixedThreadPool(Integer.MAX_VALUE);
int i = 0;
for ( i= 0; i < 4000; i++) {
System.out.println("number " + (i+1) + " starts");
service.execute(new Runnable() {
@Override
public void run() {
try {
ceshi();
} catch (HttpException e) {
System.out.println("HttpException");
e.printStackTrace();
} catch (IOException e) {
System.out.println("IOException");
e.printStackTrace();
}
}
});
System.out.println("number " + (i+1) + " ends");
}

service.shutdown();

service.awaitTermination(300,TimeUnit.SECONDS);

System.out.println("ok");

}

private static void ceshi() throws HttpException, IOException{
HttpClient client = new HttpClient();

client.getHostConfiguration().setHost("9.186.62.58",8080,"http");

HttpMethod method = getGetMethod();//使用POST方式提交数据

client.executeMethod(method);

//打印服务器返回的状态

System.out.println(method.getStatusLine());

//打印结果页面

String response = new String(method.getResponseBodyAsString().getBytes("GB2312"));

//打印返回的信息

System.out.println(response);

method.releaseConnection();
}

private static HttpMethod getGetMethod(){

return new GetMethod("/BiMaiApp/airdetailpage?cityIDs=1");

}

}


View Code
在压力测试的环境下拥有大量的线程,当本地内存耗尽时,企图创建新的线程时抛出java.lang.OutOfMemoryError: unable to create new native thread异常。

系统创建的线程数的计算公式:

(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads

MaxProcessMemory 指的是一个进程的最大内存

JVMMemory JVM内存

ReservedOsMemory 保留的操作系统内存

ThreadStackSize 线程栈的大小

针对无法创建更多本地线程的情况,调整线程栈的大小,添加-Xss选项(线程栈的大小),设置为256k后再跑自动化,发现问题解决。

JAVA_OPTS="-Xms2048M -Xmx2048M -Xmn512M -Xss256k -XX:PermSize=512M….”

对于一般的内存泄漏导致的堆栈溢出,通常的错误信息主要有以下几种。

1. java.lang.OutOfMemoryError: Java heap space

2. java.lang.OutOfMemoryError: PermGen space

3. java.lang.OutOfMemoryError: Requested array size exceeds VM limit

4. java.lang.OutOfMemoryError: <reason> <stack trace> (Native method)

参考:http://bbs.csdn.net/topics/350248404
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: