架構師訓練營 week9 作業
请简述 JVM 垃圾回收原理。
如何判斷對象是否存活:
JVM 通過一種可達性分析算法進行垃圾對象的識別,具體過程是:從線程棧幀中的局部變量,或者是方法區的靜態變量出發,將這些變量引用的對象進行標記,然後看這些被標記的對像是否引用了其他對象,繼續進行標記,所有被標記過的對像都是被使用的對象,而那些沒有被標記的對象就是可回收的垃圾對象了。
垃圾回收的主要三種方法:
清理:將垃圾對象佔據的內存清理掉,其實 JVM 並不會真的將這些垃圾內存進行清理,而是將這些垃圾對象佔用的內存空間標記為空閒,記錄在一個空閒列表裡,當應用程序需要創建新對象的時候,就從空閒列表中找一段空閒內存分配給這個新對象。
壓縮:從堆空間的頭部開始,將存活的對象拷貝放在一段連續的內存空間中,那麼其餘的空間就是連續的空閒空間。
複製:將堆空間分成兩部分,只在其中一部分創建對象,當這個部分空間用完的時候,將標記過的可用對象複製到另一個空間中。
常用垃圾回收器算法:
串行回收器:每次垃圾回收會啟用一個線程並同時暫停其他線程。如果回收時間長,對應用程序會有較大影響。
並行回收器:垃圾回收時啟用多個線程,並行處理。在處理的過程中也會暫停應用線程。
並行回收器 CMS:
在初始化標記時 => 暫停應用線程
應用並行執行
直到在垃圾回收之前 => 再次暫停線程進行重標記,
最終執行垃圾回收時與應用程序並行執行。減少了對應用程序的影響。
G1 回收器:與 CMS 類似,只是每個階段都以多線程的方式執行。
![](https://static001.geekbang.org/infoq/26/26a3f1d8c59a4dfadbc4c28ac7d460bd.png)
设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
設計原則
靜態化
併發控制,防秒殺器
簡化流程
前端優化
主要的挑战和问题以及應對
對現有網站的衝擊
秒殺系統獨立佈署,與原先系統完全隔離
separate domain, 不同的集群使用不同的 domain
高併發下對系統,資料庫的影響
頁面內容靜態化,將所有可以靜態化的東西全部靜態化,不讓使用者訪問到應用服務器
服務器準備
style 服務器
圖片服務器
靜態服務服務器
交易服務器
突然增加的網路服務
CDN,有需要的話必須求助於網路公司
跳過秒殺頁面直接下單
動態生成下單頁面
超賣?
不同階段閥門的設計
![](https://static001.geekbang.org/infoq/a6/a632c451975c74fb2d52a83f1cbdf2f7.png)
失敗時?
domain 部分,直接把相關 domain redirect 到預先定義好的萬能 error page
備用機器
停止非核心業務集群
萬能 error page => 秒殺活動結束
任何錯誤都導到這邊
設計原則
靜態化
併發控制,防秒殺器
簡化流程
前端優化
![](https://static001.geekbang.org/infoq/d8/d89e0298ba0cf7e2ea6b19a9d5129715.png)
评论