代碼優化

一,多線程算法

  從資源利用的角度看,使用多線程的緣由主要有兩個:IO阻塞與多CPU。當前線程進行IO處理的時候,會被阻塞釋放CPU以等待IO操做完成,因爲IO操做(無論是磁盤IO仍是網絡IO)一般都須要較長的時間,這時CPU能夠調度其餘的線程進行處理。理想的系統Load是既沒有進程(線程)等待也沒有CPU空閒,利用多線程IO阻塞與執行交替進行,可最大限度利用CPU資源。使用多線程的另外一個緣由是服務器有多個CPU,要想最大限度地使用這些CPU,必須啓動多線程。數據庫

  啓動線程數=【任務執行時間 / (任務執行時間 - IO等待時間)】 * CPU內核數編程

  即:若是任務是CPU計算型任務,那麼線程數最多不超過CPU內核數;若是任務須要等待磁盤操做,網絡響應,那麼多啓動的線程有助於提升任務併發度,提升系統吞吐能力,改善系統性能;安全

  解決線程安全的主要手段主要有如下幾點:服務器

  1,將對象設爲無狀態(雖然從面向對象的角度,這是一種不良設計);網絡

      2,使用局部對象;數據結構

  3,併發訪問資源時使用鎖;多線程

 

二,資源複用併發

  系統運行時,要儘可能減小那些開銷很大的系統資源的建立和鎖毀,好比數據庫鏈接,網絡通訊鏈接,線程,複雜對象等。從編程角度,資源複用主要有兩種模式:單例對象池;對於每一個WEB請求,WEB應用服務器都須要建立一個獨立的線程去處理,這方面,應用服務器也採用線程池的方式。這些所謂的鏈接池,線程池,本質上都是對象池,即鏈接,線程都是對象,池管理的方式也基本相同;性能

 

三,數據結構

  字符串散列算法Time33:

hash(i) = hash(i - 1) * 33 + str[i]

      Time33雖然能夠較好地解決衝突,但有可能類似字符串的HashCode也比較接近,這種狀況下,一個可行的方案是對字符串取信息指紋,再對信息指紋求HashCode,因爲字符串微小的變化就能夠引發信息指紋(MD5)的巨大不一樣,所以能夠得到較好的隨機散列。

 

四,垃圾回收

     理解垃圾回收機制有助於優化和參數調優,以及編寫內存安全的代碼。

     以JVM爲例,其內存主要可劃分爲堆(heap)和堆棧(stack)。堆棧用於存儲線程上下文信息,如方法參數,局部變量靠等。堆則是存儲對象的內存空間,對象的建立和釋放,垃圾回收就在這裏進行。

   在JVM分代垃圾回收機制中,將應用程序可用的堆空間分爲年輕代(Young Generation) 和年老代(old Generation),又將年輕代分爲Eden區(Eden Space),From區和To區,新建對象老是在Eden區中被建立,當Eden區空間已滿,就觸發一次YoungGC,將還被使用的對象複製對From區,這樣整個Eden區都是未被使用的空間,可供繼續使用,當Eden區再次用完,再觸發一次Young GC,將Eden區和From區還在被使用的對象複製到To區,下一次Young GC則是將Eden區和To區還被使用的對象複製到From區。所以通過屢次Young GC,某些對象會在From區和To區屢次複製,若是超過某個閾值對象還未被釋放,則將該對象複製到Old Generation。若是Old Generation空間也用完,那麼就會觸發Full GC,即所謂的全量回收,全量回收會對系統性能產生較大影響,所以應該根據系統業務特色和對象生命週期合理設置Young Generation 和 Old Generation 的大小,儘可能減小Full GC。事實上,某些WEB應用在整個運行期間能夠作到從不進行Full GC。

相關文章
相關標籤/搜索