總結篇:大型網站技術架構-性能(二)

前言:上次我說到緩存這塊的東西,不過由於最近工作時間忙,項目催時間,出現了一些奇葩的問題,個人QQ空間都有記錄每次遇到問題的解決方法,這就是經驗吧,接着上面的來!

緩存預熱

  1. 這個解釋簡單點,就是把常用的一些元數據,比如城市地名、類目等等,這些數據可以在啓動時加載數據庫中的全部數據到緩存中進行預熱,(把一些常用的數據提前加載好)。

分佈式緩存架構

  1. 首先說明下什麼是分佈式緩存,分佈式緩存指緩存部署在多個服務器組成的集羣中,以集羣的方式提供緩存服務,它的架構方式有兩種,第一是:JBoss Cache爲代表的需要更新同步的分佈式緩存,另一個也是我用的最多的,Memcached爲代表的不互相通信的分佈式緩存。我主要說下Memcached哦,畢竟我這個是用的最多的。

Memcached

  1. 首先它是使用的TCP協議通信,只要支持該協議的客戶端都可以和Memcached服務器通信,(TCP協議後面要了解下,這個基本沒怎麼看過,哈哈),Memcached服務端通信模塊基於Libevent(這玩意我也不知道是啥,等我後面有時間在研究哈,不過太深奧的它估計就看看吧,畢竟我還是以JAVA爲主,後面會寫點基礎的東西)。Memcached是固定分配空間的,它的原理要畫個圖來說下,文字先說下,就是一個大空間看成N個小空間B 然後N個小空間B有包含N個小小空間C ,然後這個小小空間C大小是固定的,而相同空間大小的小小空間C又被組在一起看成一個,slab_class,然後每次放數據的時候是放在最小的slab_calss裏面的,然後就沒了。

代碼優化

  1. 多線程的使用有助於提高任務併發度,提高系統吞吐能力,改善系統性能,但是使用多線程需要注意的問題就是線程安全問題,(就是N個線程併發對一個數據修改,導致數據混亂)。當然這是有解決的方法的。
    1. 將對象設計爲無狀態對象 (對象本身不存儲狀態信息)
    2. 使用局部對象
    3. 併發訪問資源時使用鎖、或者緩存 (別弄成死鎖了啊)

資源複用

  1. 減少開銷很大的系統資源的創建和銷燬,資源複用的主要兩種模式是:單例和對象池

垃圾回收

  1. 這個也是蠻重要的,爲什麼呢,因爲理解垃圾回收機制有助於程序優化和參數調優,和編寫內存安全的代碼啊。就拿JVM來說,它的內存主要劃分爲,堆和堆棧,堆棧用於存儲線程上下文信息;堆是存儲對象的內存空間,對象的創建和釋放、垃圾回收就在這裏進行的哦,通過對對象生命週期的觀察,發現大部分對象的生命週期都很短,然後這部分對象產生的垃圾應該被更快的收集,然後釋放內存,這就是JVM分代垃圾回收,當然搞java的必須對JVM很瞭解,所以這個也是後面的任務之一啊,額,繼續吧,在JVM分代垃圾回收機制中,將應用程序可用的堆空間分爲 年輕代和老年代,年輕代有分爲Eden區、Form區和To區,新的對象總是在Eden區被創建,然後Eden區空間滿了,就觸發一次年輕代的垃圾回收,將還被使用的對象複製到Form區,這樣Eden未被使用的空間又可以繼續創建對象咯,當Eden區再用完的時候會再次觸發年輕代垃圾回收,把Eden區和Form區還在被使用的對象複製到To區,再然後多次觸發年輕代垃圾回收,對象會在Form區和To區多次複製,要是超過某個閥值對象還沒有被釋放,就將該對象複製到老年區,要是老年區的空間也用完了,就會觸發Full GC(全量回收),而全量回收會對系統的性能產生很大影響,所以要儘量的減少Full GC 。(這個後面在看看這本書)
    《實戰Java虛擬機:JVM故障診斷與性能優化》
存儲性能優化 (這個就不說了,畢竟我現在確實看不懂這個)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章