java網(wǎng)絡(luò)編程的經(jīng)典和使用的案例 Java編程中的性能優(yōu)化如何實(shí)現(xiàn)?
Java編程中的性能優(yōu)化如何實(shí)現(xiàn)?我認(rèn)為性能優(yōu)化應(yīng)該分為兩步:第一步:尋找性能瓶頸,第二步:性能調(diào)優(yōu);下面分別分析:步驟1:找到性能瓶頸。通常,性能瓶頸的出現(xiàn)是外部處理系統(tǒng)的資源消耗過(guò)多和性能不足;或
Java編程中的性能優(yōu)化如何實(shí)現(xiàn)?
我認(rèn)為性能優(yōu)化應(yīng)該分為兩步:第一步:尋找性能瓶頸,第二步:性能調(diào)優(yōu);
下面分別分析:
步驟1:找到性能瓶頸。
通常,性能瓶頸的出現(xiàn)是外部處理系統(tǒng)的資源消耗過(guò)多和性能不足;或者資源消耗不多,但節(jié)目效果還是很慢;
資源主要消耗在cpu、文件io、網(wǎng)絡(luò)io和內(nèi)存上。當(dāng)某種資源消耗過(guò)多時(shí),系統(tǒng)會(huì)反應(yīng)緩慢。
外部處理系統(tǒng)性能不足主要是由于其他系統(tǒng)或數(shù)據(jù)庫(kù)提供的功能響應(yīng)速度不夠。外部系統(tǒng)響應(yīng)慢也可能是資源消耗過(guò)大造成的,所以數(shù)據(jù)庫(kù)響應(yīng)慢可以調(diào)優(yōu)。
資源消耗低的主要原因是程序代碼效率不高、資源利用不充分或程序結(jié)構(gòu)不合理;
1.1cpu消耗分析
可以通過(guò)top、pidstat等相關(guān)命令,找出各種類型的cpu消耗比例。最常見(jiàn)的類型是us和sy,分別代表用戶進(jìn)程消耗和線程間切換消耗。如果us太高,可以找到相關(guān)的線程ID,然后分析代碼;如果sy太高,是否會(huì)導(dǎo)致太多線程切換?
1.2文件io消耗
要跟蹤一個(gè)線程的文件IO消耗,可以通過(guò)pidstat查找,可以查到每秒的kb讀寫次數(shù);找到若干個(gè)讀寫kb的線程,然后用jstack找到相關(guān)的java代碼,然后進(jìn)行分析;
1.3網(wǎng)絡(luò)io消耗
你可以通過(guò)sar分析網(wǎng)絡(luò)消耗,但是你可以 不要具體說(shuō)明每個(gè)線程消耗的網(wǎng)絡(luò)io。只能轉(zhuǎn)儲(chǔ)線程,找到產(chǎn)生大量網(wǎng)絡(luò)IO的線程。
1.4內(nèi)存消耗
結(jié)合top或pidstat和jvm 的內(nèi)存分析工具;需要區(qū)分jvm外的物理內(nèi)存和jvm堆區(qū)的內(nèi)存;如果是jvm外的物理內(nèi)存,要分析程序中的直接ByteBuffer,如果是jvm堆,可以通過(guò)jvisualvm分析;
1.5資源消耗少但還是慢。
主要原因是:鎖競(jìng)爭(zhēng)激烈,硬件資源利用不足,數(shù)據(jù)量增加。
步驟2:性能調(diào)優(yōu)
2.1jvm調(diào)優(yōu)
主要包括每一代的規(guī)模,GC策略等。世代規(guī)模設(shè)置:避免將世代規(guī)模設(shè)置得過(guò)小或過(guò)大;避免幸存者面積過(guò)小或過(guò)大;新生代生存周期的合理設(shè)定;GC策略根據(jù)吞吐量?jī)?yōu)先級(jí)或延遲優(yōu)先級(jí)設(shè)置策略;
2.2程序調(diào)諧
1.CPU消耗嚴(yán)重解決。
us太高主要是因?yàn)閳?zhí)行線程可以在沒(méi)有任何掛起動(dòng)作的情況下運(yùn)行;Sy太高主要是因?yàn)閯?chuàng)建的線程太多,導(dǎo)致線程上下文切換;
2.文件IO消耗嚴(yán)重解決。
文件IO消耗嚴(yán)重的主要原因是多個(gè)線程向同一個(gè)文件寫入大量數(shù)據(jù),導(dǎo)致文件很快變得非常大。但是寫入速度越來(lái)越慢,導(dǎo)致線程之間對(duì)文件鎖的競(jìng)爭(zhēng)非常激烈。常見(jiàn)的調(diào)優(yōu)方法有異步文件寫入、批量讀寫、限流和文件大小限制;
3.網(wǎng)絡(luò)IO消耗嚴(yán)重解決。
主要原因是同時(shí)發(fā)送或接受的數(shù)據(jù)包太多,解決方法是限制流量;
4.內(nèi)存消耗嚴(yán)重解決。
解決方案:釋放不必要的引用,使用對(duì)象緩存池,采用合理的緩存失效策略,使用softReference和WeakReferenc
新人的java之路,該怎么開(kāi)始?
學(xué)習(xí)零基礎(chǔ)Java需要掌握最基本的Java語(yǔ)法和編程框架,編程工具的安裝和使用等。,但是一定要記得邊學(xué)邊練編程,進(jìn)一步實(shí)現(xiàn)項(xiàng)目實(shí)戰(zhàn)!你可以看看老杜 的嗶哩嗶哩Java Zero Foundation介紹,這是目前第一個(gè)突破1000萬(wàn)大關(guān)的Java視頻教程。老杜也是學(xué)生非常敬佩和喜歡的老師。視頻教程的代碼格式極其規(guī)范,非常適合零基礎(chǔ)的人觀看。而且基本視頻教程都是老杜上課錄的。入門是零基礎(chǔ),視頻質(zhì)量超高,非常適合零基礎(chǔ)的小白入門!