標記-清除算法:標記-清除分為標記 和清除 兩個階段,首先通過可達性分析,標記出所有需要回收的對象,然后統一回收所有被標記的對象。
復制算法:為了解決碎片空間的問題,出現了復制算法? 將內存分成兩塊,每次申請內存時都使用其中的一塊,當內存不夠時,將這一塊內存中所有存活的復制到另一塊上。然后把已使用的內存清理掉
標記-整理算法:標記之后不直接清理,而是將所有存活對象都移動到內存的一端,移動結束后直接清理掉剩余部分
分代回收:內存劃分成新生代和老生代,分配的依據是對象的生存周期,經過的GC次數。對象創建時,一般在新生代申請內存,當經歷一次GC之后如果還存活,那么對象年齡+1 當年齡超過一定值后,如果對象還存活,那么該對象進入老年代
checked exception和unchecked exception
受檢查異常,Java代碼在編譯過程中,如果受檢查異常沒有catch或者throws關鍵字處理的話,就沒辦法通過編譯
不受檢查異常:runTimeException 不處理不受檢查異常也可通過編譯
多線程安全
synchronized 關鍵字? volatile關鍵字? 用于變量 確保所有線程看到的是該變量的最新值,而不是存儲在本地寄存器中的副本。reentrantLock類 鎖管理? 原子類 如AtomicInteger,AtomicLong? 線程局部變量:threadLocal可以為每個線程提供獨立的變量副本,并發集合
新生代:新生代分為Eden Space和Survivor Space。Eden Space中,大多數新創建的對象首先存放在這里。Eden區較小,當Eden區滿時,會觸發一次Minor GC (新生代垃圾回收)。
老年代:經歷過多次Minor GC仍存活的對象會被移動到老年代。老年代中的對象生命周期較長,因此稱為Full GC
G1垃圾回收
初始時,所有區域都處于空閑狀態
創建一些對象,挑出一些空閑區域作為伊甸園區存儲這些對象
當伊甸園區需要垃圾回收時,挑出一個空閑區域作為幸存者區,用復制算法復制存活對象,需要暫停用戶線程
隨著時間流逝,伊甸園區的內存又不足了
將伊甸園以及幸存者區中的存活對象,采用復制算法,復制到新的幸存區,其中較老對象晉升至老年代
當老年代占用內存超過閾值后,觸發并發標記,這時無需暫停用戶線程
并發標記之后,會有重新標記階段解決漏標問題,此時需要暫停用戶線程
這些都完成后就知道了老年代有哪些存活對象,隨后進入混合收集階段,此時不會對所有老年代區域進行回收,而是根據暫停時間目標優先回收價值高的區域
基于Redis的延遲隊列實現
開始->發送延遲消息->消息存入Zset->輪詢Redis(Zset)->到達執行時間->執行任務
next-key lock:臨建鎖 是Record Lock+Gap Lock的組合? 鎖定一個范圍,并且鎖定記錄本身
內存淘汰策略
隨機淘汰
淘汰整個鍵值中最久未使用的鍵值
淘汰整個鍵值中最少使用的鍵值
鍵入URL
瀏覽器會判斷所請求的資源是否在緩存里
DNS解析
建立TCP連接
泛型:編譯器可以對泛型參數進行檢測,并且通過泛型參數可以指定傳入的對象類型
泛型類
泛型接口
泛型方法
binlog 和 redo log 有什么區別
binlog是MySQL的Server層實現的日志,所有存儲引擎都可以使用
redo log是InnoDB存儲引擎實現的日志
binlog是追加寫,寫滿了一個文件,就創建一個新的文件繼續寫,保存的是全量的日志
redolog是循環寫,日志空間大小是固定的,全部寫滿就從頭開始,保存未被刷入磁盤的臟頁日志
@Autowired:是Spring定義的注解
@Resource:是Java定義的注解
@Autowired:是先根據類型byType查找,如果存在多個Bean再根據名稱byName進行查找
@Resource:是Java定義的注解 先根據名稱查找 如果名稱查找不到,再根據類型進行查找
@Autowired:支持屬性注入,構造方法注入和Setter注入
@Resource:支持屬性注入和Setter注入?
Spring MVC 執行流程
前端控制器DispatcherServlet? 查詢HandlerMapping 處理器映射器{key:url,value:"類名#方法名”}
返回處理器執行鏈 HandlerExecutionChain
請求執行Handler 處理器適配器(處理參數,處理返回值)
請求處理 處理器Handler? 返回json
什么情況下使用CMS,什么情況使用G1
cms
低延遲需求:適用于對停頓時間要求敏感的應用程序
老年代收集:主要針對老年代的垃圾回收
碎片化管理:容易出現內存碎片,可能需要定期進行full gc來壓縮內存空間
g1
大堆內存:適用于需要管理大內存堆的場景,能夠有效處理數GB以上的堆內存
對內存碎片敏感:G1通過緊湊整理來減少內存碎片,降低了碎片化對性能的影響
比較平衡的性能:G1在提供較低停頓時間的同時,也保持了相對較高的吞吐量
ReentrantLock
實現Lock接口,是一個可重入且獨占式的鎖,和synchronized關鍵字。默認使用非公平鎖,可以通過構造器來顯示的指定使用公平鎖
start方法和run方法
用start方法來啟動線程,真正實現了多線程運行,這時無需等待run方法執行完畢而直接繼續執行下面的代碼,通過調用Thread類的start()方法來啟動一個線程
用run方法只是類的一個普通方法