1、形成體系化的思想。
10年積累的成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有留壩免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
當(dāng)做一件事(開發(fā)一個系統(tǒng)、解決一個問題)的時候,可以按照一定的體系去下手,這個體系可以理解為思維意識。少了很多無從下手、從零開始的過程,從而提升效率。這一點事需要個人長久的總結(jié)和豐富的經(jīng)驗!
2、開闊自己的視野。
從不同方面去尋找自己解決問題的思路,增加自己的選擇空間,會讓你權(quán)衡更全面,分析更透徹,從而理解更深入,解決問題也更到位。做技術(shù),不能只看技術(shù)!一個技術(shù)大牛,多少都會對歷史,對藝術(shù)有一些了解。
1、代碼
很多技術(shù)人員拿到一個性能優(yōu)化的需求以后,都會向緩存、分庫分表、異步、多線程、JVM優(yōu)化等方向去思考。其實,很多時候應(yīng)該從代碼入手。代碼優(yōu)化的點很多很多,舉幾個例子:
1、當(dāng)已經(jīng)知道list大小的時候,直接指定list大小,可以有效避免list默認(rèn)大小不夠,而進(jìn)行復(fù)制擴(kuò)容。 2、變量聲明的位置能局部不全局,可以有效避免長久占用內(nèi)存而不能被GC回收。 3、for循環(huán)里大量聲明變量,以致于消耗內(nèi)存。 等等吧
所以,要多加注意代碼層面的優(yōu)化,優(yōu)化的空間很大,很可能代碼優(yōu)化之后就能滿足性能要求,而不必增加設(shè)備來支持訪問量!
2、SQL優(yōu)化
SQL優(yōu)化,個人認(rèn)為可以從五個層面入手。
*SQL語句優(yōu)化 關(guān)鍵字的使用like、join、in、exist *SQL索引優(yōu)化 索引的創(chuàng)建、索引的大小設(shè)置 *SQL引擎優(yōu)化 根據(jù)業(yè)務(wù)需求,選擇最適合的引擎 *數(shù)據(jù)庫設(shè)計優(yōu)化 我個人認(rèn)知,主要是范式的設(shè)計??梢赃m當(dāng)冗余數(shù)據(jù),以減少數(shù)據(jù)庫操作。 *數(shù)據(jù)庫連接池優(yōu)化 連接池監(jiān)控數(shù)、連接池方案的選擇(這一塊個人沒使用過)
3、緩存優(yōu)化
緩存在一個系統(tǒng)里或多或少都會涉及的。至于什么數(shù)據(jù)放入緩存,放入一個什么樣的緩存,都是值得仔細(xì)斟酌的。 使用緩存的情況,個人感覺有兩種:
短時間內(nèi)相同數(shù)據(jù)重復(fù)查詢多次且數(shù)據(jù)更新不頻繁,這個時候可以選擇先從緩存查詢,查詢不到再從數(shù)據(jù)庫加載并回設(shè)到緩存的方式。 高并發(fā)查詢熱點數(shù)據(jù),后端數(shù)據(jù)庫不堪重負(fù)。
選型考慮:
如果數(shù)據(jù)量小,并且不會頻繁地增長又清空(這會導(dǎo)致頻繁地垃圾回收),那么可以選擇本地緩存。具體的話,如果需要一些策略的支持(比如緩存滿的逐出策略),可以考慮Ehcache;如不需要,可以考慮HashMap;如需要考慮多線程并發(fā)的場景,可以考慮ConcurentHashMap。 目前從資源的投入度、可運維性、是否能動態(tài)擴(kuò)容以及配套設(shè)施來考慮,我們優(yōu)先考慮Tair。除非目前Tair還不能支持的場合(比如分布式鎖、Hash類型的value),我們考慮用redis。
當(dāng)然,使用緩存后,會面臨很多問題,最大的一個問題就是數(shù)據(jù)一致性。這些就可以根據(jù)業(yè)務(wù)需要而制定不同的方案。
4、多線程
在一個系統(tǒng)里,在一定情況下使用多線程可以加快響應(yīng)時間,比如一些異步任務(wù),啟動多線程去處理就好了,還有一些離線任務(wù)也不需要等待完成再返回等等。但是線上對響應(yīng)時間要求較高的場合,盡量少用多線程,尤其是服務(wù)線程需要等待任務(wù)線程的場合(很多重大事故就是和這個息息相關(guān)),如果一定要用,可以對服務(wù)線程設(shè)置一個最大等待時間。
使用多線程又帶來另一個問題,就是代碼的復(fù)雜性。所以,建議如果單機(jī)單線程能夠滿足業(yè)務(wù)需求的盡量使用單機(jī)單線程,如果滿足不了,則可以使用單機(jī)多線程,如果依然不能滿足,再考慮多機(jī)多線程。
使用多線程時,可以考慮使用線程池,線程池的優(yōu)點有兩個:
1、提高性能,節(jié)省線程創(chuàng)建和銷毀的開銷,節(jié)省資源。 2、可以利用線程池完成一些功能,比如限流??梢员U蠙C(jī)器極限壓力下的穩(wěn)定處理能力。
5、JVM調(diào)優(yōu)
JVM是Java WEB項目的基石,可以根據(jù)項目特點進(jìn)行JVM調(diào)優(yōu)。我所了解到的,只是調(diào)整一些GC回收機(jī)制和回收策略。比如新生代與老生代比值、eden與survivor比值、觸發(fā)cms回收的old區(qū)比率閾值等。比如把大對象放入老年代等等。
當(dāng)然,調(diào)優(yōu)的路上很遠(yuǎn)也很長。包括技術(shù)的選型,監(jiān)控的使用,軟件的使用甚至硬件的使用。今天簡單說這么多!
更多精彩內(nèi)容,歡迎關(guān)注微信公眾號:Java小筆記(ijavanote)