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

  • 2021 年 5 月 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。

 

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

 

 

 

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

 

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

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