java並發測試
我不想再繼續吐槽翻譯,的確有些話理解起來有些費勁,但就內容而言,這本書當吃無愧堪稱JAVA並發領域的一朵明珠,光芒萬丈的指引著並發這條路。(如果你有能力就讀英文版的,既然要吐槽中文版,還是就事論事的好) 前年的時候看過一邊,當時覺得讀這本書的時候用個新的成語來形容就是——不明覺厲。 近兩年各種並發開始流行,其實也流行了幾十年了,可以負責任的說網上你能看到的幾乎所有中文關於JAVA並發的理解和解讀幾乎都可以在這本書上找到。 個人感覺還是應該上來介紹JMM的,這樣至少能提起很大興趣。此書的翻譯堪稱晦澀難懂,如果不是硬著頭皮讀下來,嘗試去理解,這真不是水平的問題,真難以想像花了10幾個小時愣是把這本書再次讀完了。 其實這本書讀完後你最大的收獲應該是能夠去理解那些現今相當牛逼的JAVA領域的並發庫和框架了,當然你的收獲還有就是特別小心的使用鎖,發布可見性,活躍性,性能和測試等等。 這本書包含的內容涉及之廣、之深不能全部一下子消化完,例子非常具有代表性和針對性,值得你面對並發時再次讀讀這本書,如果接觸的不多或者只是剛剛了解並發,也非常適合你對整個JAVA世界的並發領域有個認識,重讀會有更進一步的理解,JAVA的並發真是令人瞠目結舌,無法形容,強大和靈活到一定地步了,當然這份強大是用龐大付出代價的。 個人感覺看完後,真是應該再把JDK里關於並發的庫仔細讀讀。 雖然這本書是在講JAVA的並發,但是如果有別的語言經驗的同學也應該推薦讀讀,讓你了解下JAVA世界的並發是如此的精彩和復雜詭異。 雖然不能完全記住書中的細節,但建好索引就足夠了,待日後用時可以再次翻閱。
2. JAVA如何寫一個純並發的壓力測試
importjava.io.BufferedReader;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.InputStreamReader;
importjava.io.PrintWriter;
importjava.net.HttpURLConnection;
importjava.net.URL;
importjava.util.HashMap;
importjava.util.Map;
importjava.util.concurrent.ExecutorService;
importjava.util.concurrent.Executors;
importjava.util.concurrent.Semaphore;
publicclassConcurrentTest{
privatestaticintthread_num=200;
privatestaticintclient_num=460;
privatestaticMapkeywordMap=newHashMap();
static{
try{
InputStreamReaderisr=newInputStreamReader(newFileInputStream(
newFile("clicks.txt")),"GBK");
BufferedReaderbuffer=newBufferedReader(isr);
Stringline="";
while((line=buffer.readLine())!=null){
keywordMap.put(line.substring(0,line.lastIndexOf(":")),"");
}
}catch(Exceptione){
e.printStackTrace();
}
}
publicstaticvoidmain(String[]args){
intsize=keywordMap.size();
//TODOAuto-generatedmethodstub
ExecutorServiceexec=Executors.newCachedThreadPool();
//50個線程可以同時訪問
finalSemaphoresemp=newSemaphore(thread_num);
//模擬2000個客戶端訪問
for(intindex=0;index<client_num;index++){
finalintNO=index;
Runnablerun=newRunnable(){
publicvoidrun(){
try{
//獲取許可
semp.acquire();
System.out.println("Thread:"+NO);
Stringhost="http://10.99.23.42:7001/KMQueryCenter/query.do?";
Stringpara="method=getQueryResult&pageNum=1&pageSize=5&"
+"queryKeyWord="
+getRandomSearchKey(NO)
+"&questionID=-1&questionIdPath=-1&searchType=1"
+"&proLine=&proSeries=&proType="+NO;
System.out.println(host+para);
URLurl=newURL(host);//此處填寫供測試的url
HttpURLConnectionconnection=(HttpURLConnection)url
.openConnection();
//connection.setRequestMethod("POST");
//connection.setRequestProperty("Proxy-Connection",
//"Keep-Alive");
connection.setDoOutput(true);
connection.setDoInput(true);
PrintWriterout=newPrintWriter(connection
.getOutputStream());
out.print(para);
out.flush();
out.close();
BufferedReaderin=newBufferedReader(
newInputStreamReader(connection
.getInputStream()));
Stringline="";
Stringresult="";
while((line=in.readLine())!=null){
result+=line;
}
//System.out.println(result);
//Thread.sleep((long)(Math.random())*1000);
//釋放
System.out.println("第:"+NO+"個");
semp.release();
}catch(Exceptione){
e.printStackTrace();
}
}
};
exec.execute(run);
}
//退出線程池
exec.shutdown();
}
(finalintno){
Stringret="";
intsize=keywordMap.size();
//intwanna=(int)(Math.random())*(size-1);
ret=(keywordMap.entrySet().toArray())[no].toString();
ret=ret.substring(0,ret.lastIndexOf("="));
System.out.println(" "+ret);
returnret;
}
}
3. java的壓力測試和並發測試
你在loadrunner 中的JAVAVUSER編寫開發就行了,測試代碼是根據你的需求來開發編寫的,不是通用的代碼!
4. 用java的netty框架寫了一個udp服務端,怎麼測試它能承受的並發壓力
主從Reactor多線程Nio結構,主從Reactor線程模型的特點是:服務端用於接收客戶端連接的不再是個1個單獨的NIO線程,而是一個獨立的NIO線程池。Acceptor接收到客戶端TCP連接請求處理完成後(可能包含接入認證等),將新創建的SocketChannel注冊到IO線程池(sub reactor線程池)的某個IO線程上,由它負責SocketChannel的讀寫和編解碼工作。Acceptor線程池僅僅只用於客戶端的登陸、握手和安全認證,一旦鏈路建立成功,就將鏈路注冊到後端subReactor線程池的IO線程上,由IO線程負責後續的IO操作。
利用主從NIO線程模型,可以解決1個服務端監聽線程無法有效處理所有客戶端連接的性能不足問題。
它的工作流程總結如下:
從主線程池中隨機選擇一個Reactor線程作為Acceptor線程,用於綁定監聽埠,接收客戶端連接;
Acceptor線程接收客戶端連接請求之後創建新的SocketChannel,將其注冊到主線程池的其它Reactor線程上,由其負責接入認證、IP黑白名單過濾、握手等操作;
步驟2完成之後,業務層的鏈路正式建立,將SocketChannel從主線程池的Reactor線程的多路復用器上摘除,重新注冊到Sub線程池的線程上,用於處理I/O的讀寫操作。
5. java多線程怎麼測試
測試並發的性能嗎?可以用Jmeter進行模擬多線程測試
6. java jvm 並發和並行的區別
並發(concurrency)和並行(parallellism)是:
解釋一:並行是指兩個或者多個事件在同一時刻發生;而並發是指兩個或多個事件在同一時間間隔發生。
解釋二:並行是在不同實體上的多個事件,並發是在同一實體上的多個事件。
解釋三:在一台處理器上「同時」處理多個任務,在多台處理器上同時處理多個任務。如hadoop分布式集群
所以並發編程的目標是充分的利用處理器的每一個核,以達到最高的處理性能。
7. 只通過java代碼,保證並發量過萬的方法有哪些
另外一個回復是簡單的建議,限於代碼層面跟計算資源緊張的情況。
說說我的理論:
1、想要這么大的並發量,申請買幾台比較好的機器,帶寬加到足夠大應該不是問題。
2、網路層的負載均衡考慮一下,這應該也不是啥問題,這么大並發量,別告訴我客戶網路設計很垃圾。高端點的網路設備都沒有。
3、軟體層的結構,看用戶給什麼樣的機器,如果經濟型的機器,考慮分布式運算,分布式再從軟體層面做集群或主從。根據計算密集型還是IO密集型選擇適合的設備。計算密集型的業務,需要強悍的CPU(可以用多C,未必是頻率高的)+內存。IO密集型的業務需要,速度快的存儲,越快越好。有極致要求的考慮固態存儲設備。
4、並發設計,java中主要是線程的應用。能拆分成多任務的運算一定拆成多任務。盡量壓榨cpu資源,現在的工作站不會寫並發程序,真浪費cpu資源。
5、資料庫並發的考量,以前說mysql不如oracle現在還有人有這論調。使用的時候把參數調整到最優狀態。如緩存到內存中數據大小,內存要夠,就把全部表數據載入到內存中。mysql的innodb調整兩三個參數就行。資料庫IO訪問,mysql有測算IO能力的參數,存儲夠好,可以調整到很大。
6、這么大的並發量,選擇適合的緩存器,可以用來緩存熱點數據,或加快分布式運算的IO訪問能力。(磁碟肯定沒內存塊,包括固態)
7、代碼編寫完後,對系統整體進行測試,評估,分析性能瓶頸,優化代碼。
能做到以上標准,tomcat+mysql跑一堆集群也不會慢。
8. java httpclient 並發量大怎麼辦
java httpclient 並發量大解決辦法:
首先你要增加一個關於非同步IO需要的包:
1、async-http-client包,可以在這里下載:https://oss.sonatype.org/content/repositories/releases/com/ning/async-http-client/1.6.2/
2、log4j的包,這個不用我說了,都知道在哪裡
3、slf4j-spi 的包,目前用1.5以上的版本比較多。
4、slf4j-log4j 的包,可以看出,slf4j是在log4j基礎上包裝的。
OK,就這幾個了,弄好後再看看下面這段代碼,通過使用它,性能可以得到明顯改善:
[java] view plain
AsyncHttpClient client = new AsyncHttpClient();
try {
Future<Response> f = client.prepareGet("http://www.google.com.hk/").execute();
System.out.println(f.get().getResponseBody("Big5"));//谷歌的輸出編碼集為Big5,反向解析結果的時候使用
}catch(...) {....}
這段代碼是不是超級簡單,可以通過上面描述的三種方式:
1、直接調用
2、將GetMethod或PostMethod對象作為共享對象反復使用。
3、使用AsyncHttpClient
這三種方法,非別使用一次調用、循環多次調用、並發調用來測試性能,後面兩者的性能比第一種方法的性能要高很多。
9. java開發中單tomcat能支持多少並發不同操作系統一樣么
Tomcat 默認是 150,也就是說同時支持 150 個並發,當然了,也可以將其改大,理論是想多大就多大。
具體能承載多少並發,需要看硬體的配置,CPU 越多性能越高,分配給 JVM 的內存越多性能也就越高,但也會加重 GC 的負擔。
當某個應用擁有 250 個以上並發的時候,應考慮應用伺服器的集群。
並發和同時在線用戶數是不一樣的,因為不同的用戶操作是有間隔的。如果邏輯復雜,請求執行時間過長,就會佔用過多的性能,導致同時在線用戶數下降,但是對並發沒有影響。
操作系統對於進程中的線程數有一定的限制:
Windows 每個進程中的線程數不允許超過 2000;
Linux 每個進程中的線程數不允許超過 1000;
另外,在 Java 中每開啟一個線程需要耗用 1MB 的 JVM 內存空間用於作為線程棧之用。
10. 關於java方法並發出現的問題,急!!!
多線程就是這樣的,你沒法預測執行順序。
如果需要執行完A方法在讓別的線程進入,那就用線程間同步的知識。
public synchronized list A() {……………
可能可以,主要看你解決的問題,這種情況,對象鎖是當前對象