java面試一日一題:如何設計一款垃圾回收器

迷茫中守候發表於2021-05-15

問題:如果讓你設計一個垃圾回收器,你會考慮哪些問題

分析:該問題主要考察對java中垃圾回收器的理解,要理解怎麼回收;一款好的垃圾回收器有哪些衡量指標

回答要點:

主要從以下幾點去考慮,

1、垃圾回收執行緒和使用者執行緒的關係;

2、垃圾回收器的衡量指標;

3、基於垃圾回收演算法有哪些垃圾回收器

 

上篇文章分享了垃圾回收的演算法,有了垃圾回收的演算法就要使用,垃圾回收器就是實現了垃圾回收演算法。

要設計一款垃圾回收器,要考慮以下幾個問題,

垃圾回收執行緒和使用者執行緒的關係

這句話要怎麼理解,一個java程式中有很多執行緒,可以分為使用者執行緒和JVM自帶的執行緒,其中使用者執行緒就是我們寫的程式執行的執行緒,是開發人員可以控制的;JVM自帶的執行緒是java虛擬機器自己的執行緒,用來處理系統的邏輯,就比如,一個作業系統分為系統程式和使用者程式是一樣的,一個JVM就可以看作是一個作業系統。要進行垃圾回收,在JVM中就要有GC執行緒,這個是JVM提供的。

瞭解了GC執行緒,那麼GC執行緒和使用者執行緒是什麼關係?這個問題就是兩個執行緒的關係,知道多執行緒的同學,都瞭解執行緒併發與並行

併發

所謂併發是指在同一時刻一個CPU上只執行一個執行緒,多個執行緒要交替執行(獲得CPU的執行時間)。現在處理器都是多核的,從使用者層面上來看是在同一個時刻多個執行緒在執行。

並行

所謂並行是指在同一時刻多個CPU上執行多條執行緒,多個執行緒並行執行,互不影響,不會因為未到CPU時間而等待;

 

在垃圾回收執行緒和使用者執行緒上我們希望垃圾回收器可以在單核CPU下,是併發執行,在多核CPU下可併發且並行,充分利用多核的優勢,提升效能;

一款好的垃圾回收器有哪些衡量指標

垃圾回收肯定要佔有時間的,一款好的垃圾回收器要使用者執行緒佔有CPU的時間越長越好,最終目標是所有的CPU時間都在執行使用者執行緒的邏輯,當然這個是不可能的;另外在進行垃圾回收的時候如果是併發的情況,那麼肯定就有暫停時間,因為在單核CPU下併發是同一時刻只有一個執行緒在執行,那麼垃圾回收執行緒在執行的話,程式相當於在暫停,所以暫停是一個很重要的指標;

吞吐量/率

吞吐量指的是使用者執行緒執行的時間佔JVM執行時間,公式如下

吞吐量=使用者執行緒執行時間/(使用者執行時間+GC時間),一款優秀的垃圾回收器,其吞吐量肯定是高的,也就是

停頓時間(延遲)

停頓時間指的是使用者執行緒的停頓時間,在垃圾回收的過程中,要暫停使用者執行緒的執行,這個暫停時間對響應要求不高的程式來說是可以接受的,如果是要求延遲低的程式,那麼停頓時間就必須短。停頓時間短會帶來另外一個問題,垃圾回收的頻率問題。

垃圾回收的頻率

垃圾回收的頻率是每隔多久執行一次GC。

 

垃圾回收器主要關注吞吐量和停頓時間即可,要求高吞吐量必然要垃圾回收的頻率降低,頻率降低必然導致每次垃圾回收時間長,停頓時間便是長的;低吞吐量那麼垃圾回收的頻率肯定大,每次執行的時間會變短,也就是停頓時間會變短;吞吐量和停頓時間是一個反相關性的關係,

 

 

 

在執行頻率不變的前提下,要想吞吐量變大,只能壓縮停頓時間,也就是說吞吐量和停頓時間是反相關性。

 

有不正之處,歡迎指正,感謝

參考:https://www.cnblogs.com/yuexiaoyun/articles/14003015.html

相關文章