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