當前位置:網站首頁>大廠面試必備:JVM-垃圾回收機制—垃圾回收中的概念,阿裏P7手把手教你

大廠面試必備:JVM-垃圾回收機制—垃圾回收中的概念,阿裏P7手把手教你

2021-08-20 01:20:40 天天熬夜敲代碼

3.示例代碼:

  • 被STW中斷的應用程序線程會在完成GC之後恢複,頻繁中斷會讓用戶感覺像是網速不快造成電影卡帶一樣, 所以我們需要减少STW的發生。
  • STW事件和采用哪款GC無關,所有的GC都有這個事件。
  • 哪怕是G1也不能完全避免Stop一the一world情况發生,只能說垃圾回收器越來越優秀,回收效率越來越高,盡可能地縮短了暫停時間。
  • STW是JVM在後臺自動發起和自動完成的。在用戶不可見的情况下,把用戶正常的工作線程全部停掉。
  • 開發中采用System.gc();會導致Stop一the一world的發生。
public class StopTheWorldDemo {
    public static class WorkThread extends Thread {
        List<byte[]> list = new ArrayList<byte[]>();

        public void run() {
            try {
                while (true) {
                    for(int i = 0;i < 1000;i++){
                        byte[] buffer = new byte[1024];
                        list.add(buffer);
                    }

                    if(list.size() > 10000){
                        list.clear();
                        System.gc();//會觸發full gc,進而會出現STW事件
                    }
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }

    public static class PrintThread extends Thread {
        public final long startTime = System.currentTimeMillis();

        public void run() {
            try {
                while (true) {
                    // 每秒打印時間信息
                    long t = System.currentTimeMillis() - startTime;
                    System.out.println(t / 1000 + "." + t % 1000);
                    Thread.sleep(1000);
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        WorkThread w = new WorkThread();
        PrintThread p = new PrintThread();
        w.start();
        p.start();
    }
}

輸出:
0.0
0.7
2.8
3.10
4.11
5.13
6.14


     
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.

四、垃圾回收行為的並行與並發

1.程序的並行和並發

1.程序的並發(Concurrent)
  • 在操作系統中,是指一個時間段中有幾個程序都處於己啟動運行到運行完畢之間,且這幾個程序都是在同一個處理器_上運行。
  • 並發不是真正意義上的“同時進行”,只是CPU把一個時間段劃分成幾個時間片段(時間區間),然後在這幾個時間區間之間來回切換,由於CPU處理的速度非常快,只要時間間隔處理得當,即可讓用戶感覺是多個應用程序同時在進行。
2.程序的並行(Parallel)
  • 當系統有一個以上CPU時,當一個CPU執行一個進程時,另一個CPU可以執行另一個進程,兩個進程互不搶占CPU資源,可以同時進行,我們稱之為並行(Parallel)。
  • 其實决定並行的因素不是CPU的數量,而是CPU的核心數量,比如一個CPU多個核也可以 並行。
  • 適合科學計算,後臺處理等弱交互場景
3.對比
  • 並發,指的是多個事情,在同一時間段內同時發生了。
  • 並行,指的是多個事情,在同一時間點上同時發生了。
  • 並發的多個任務之間是互相搶占資源的。
  • 並行的多個任務之間是不互相搶占資源的。
  • 只有在多CPU或者一個CPU多核的情况中,才會發生並行。否則,看似同時發生的事情,其實都是並發執行的。

2.垃圾回收的並發與並行

1.並行(Parallel)
  • 指多條垃圾收集線程並行工作,但此時用戶線程仍處於等待狀態。
  • 如ParNew、 Parallel Scavenge、 Parallel 0ld;
2.串行(Serial)
  • 相較於並行的概念,單線程執行。
  • 如果內存不够,則程序暫停,啟動JVM垃圾回收器進行垃圾回收。回收完,再啟動程序的線程。

3.並發(Concurrent)
  • 指用戶線程與垃圾收集線程同時執行(但不一定是並行的,可能會交替執行),垃圾回收線程在執行時不會停頓用戶程序的運行。
  • 用戶程序在繼續運行,而垃圾收集程序線程運行於另一個CPU上。
  • 如: CMS、G1

五、垃圾回收安全點Safe Point

1.GC安全點(Safepoint)

  • 程序執行時並非在所有地方都能停頓下來開始GC,只有在特定的比特置才能停頓下來開始GC,這些比特置稱為“安全點(Safepoint) ”
  • Safe Point的選擇很重要,如果太少可能導致GC等待的時間太長,如果太頻繁可能導致運行時的性能問題。大部分指令的執行時間都非常短暫,通常會根據“是否具有讓程序長時間執行的特征”為標准。比如:選擇些執行時間較長的指令作為Safe Point, 如方法調用、循環跳轉和异常跳轉等。
1.如何在GC發生時,檢查所有線程都跑到最近的安全點停頓下來呢?
  • 搶先式中斷: (目前沒有虛擬機采用了) 首先中斷所有線程。如果還有線程不在安全點,就恢複線程,讓線程跑到安全點。
  • 主動式中斷: 設置一個中斷標志,各個線程運行到Safe Point的時候主動輪詢這個標志,如果中斷標志為真,則將自己進行中斷掛起。

2.安全區域(Safe Region)

  • Safepoint機制保證了程序執行時,在不太長的時間內就會遇到可進入GC的Safepoint
  • 但是,程序“不執行”的時候呢?例如線程處於Sleep 狀態或Blocked狀態,這時候線程無法響應JVM的中斷請求,“走” 到安全點去中斷掛起,JVM也不太可能等待線程被喚醒。對於這種情况,就需要安全區域(Safe Region)來解决。
  • 安全區域是指在一段代碼片段中,對象的引用關系不會發生變化,在這個區域中的任何比特置開始GC都是安全的。我們也可以把Safe Region 看做是被擴展了的Safepoint。
1.程序實際執行時:
  • 當用戶線程運行到Safe Region的代碼時,首先標識已經進入了Safe Region,如果這段時間內發生GC,JVM會忽略標識為Safe Region狀態的用戶線程即用戶線程STW,等待JVM執行GC完畢。
  • 當用戶線程即將離開Safe Region時, 會檢查JVM是否已經完成GC,如果完成了,則用戶線程繼續運行,否則用戶線程必須等待直到收到可以安全離開SafeRegion的信號為止。

六、引用

在JDK 1.2版之後,Java對引用的概念進行了擴充,將引用分為强引用(Strong Reference)、軟引用(Soft Reference) 、弱引用(Weak Reference) 和虛引用(Phantom Reference) 4種,這4種引用强度依次逐漸减弱。

對於强、軟、弱、虛這四種引用對象的垃圾回收特點的描述,都是指的在引用關系還存在的情况下:

  • 强引用(StrongReference):最傳統的“引用”的定義,是指在程序代碼之中普遍存在的引用賦值,即類似“0bject obj=new object( )”這種引用關系。無論任何情况下,只要强引用關系還存在,垃圾收集器就永遠不會回收掉被引用的對象
  • 軟引用(SoftReference) :在系統將要發生內存溢出之前,會把這些對象列入回收範圍之中,以備進行第二次(第一次指的是回收了不可觸及的垃圾對象)垃圾回收的時候回收它們。如果這次回收後還沒有足够的內存,才會拋出內存溢出异常。
  • 弱引用(WeakReference) :被弱引用關聯的對象只能生存到下一次垃圾收集之前。當垃圾收集器工作時,無論內存空間是否足够,都會回收掉被弱引用關聯的對象。
  • 虛引用(PhantomReference) :一個對象是否有虛引用的存在,完全不會對其生存時 間構成影響,也無法通過虛引用來獲得一個對象的實例。為一個對象設置虛引用關聯的唯一目的就是能在這個對象被收集器回收時收到一個系統通知(回收跟踪)。

1.强引用: 不回收

  • 在Java程序中,最常見的引用類型是强引用(普通系統99%以上都是强引用),也就是我們最常見的普通對象引用,也是默認的引用類型。
  • 當在Java語言中使用new操作符創建一個新的對象, 並將其賦值給一個變量的時候,這個變量就成為指向該對象的一個强引用。
  • 强引用的對象是可觸及的(可達的),垃圾收集器就永遠不會回收掉被引用的對象。
  • 對於一個普通的對象,如果沒有其他的引用關系,只要超過了引用的作用域或者顯式地將相應(强)引用賦值為null,才可以當做垃圾被收集,當然具體回收時機還是要看垃圾收集策略。
  • 相對的,軟引用、 弱引用和虛引用的對象是軟可觸及、弱可觸及和虛可觸及的,在一定條件下,都是可以被回收的。所以,强引用是造成Java內存泄漏的主要原因之一。

2.軟引用: 內存不足即回收

  • 軟引用是用來描述一 些還有用,但非必需的對象。只被軟引用關聯著的對象,在系統將要發生內存溢出异常前,會把這些對象列進回收範圍之中進行第二次回收,如果這次回收還沒有足够的內存,才會拋出內存溢出异常。
  • 軟引用通常用來實現內存敏感的緩存。比如:高速緩存就有用到軟引用。如果還有空閑內存,就可以暫時保留緩存,當內存不足時清理掉,這樣就保證了使用緩存的同時,不會耗盡內存。
  • 垃圾回收器在某個時刻决定回收軟可達的對象的時候,會清理軟引用,並可選地把引用存放到一個引用隊列( Reference Queue)。
  • 類似弱引用,只不過Java虛擬機會盡量讓軟引用的存活時間長一些,迫不得.已才清理。
  • 軟引用:
    • 當內存足够: 不會回收軟引用的可達對象
    • 當內存不够時: 會回收軟引用的可達對象
  • 在JDK 1. 2版之後提供了java.lang.ref.SoftReference類來實現軟引用。

3.弱引用: 發現即回收

總目錄展示

該筆記共八個節點(由淺入深),分為三大模塊。

高性能。 秒殺涉及大量的並發讀和並發寫,因此支持高並發訪問這點非常關鍵。該筆記將從設計數據的動靜分離方案、熱點的發現與隔離、請求的削峰與分層過濾、服務端的極致優化這4個方面重點介紹。

一致性。 秒殺中商品减庫存的實現方式同樣關鍵。可想而知,有限數量的商品在同一時刻被很多倍的請求同時來减庫存,减庫存又分為“拍下减庫存”“付款减庫存”以及預扣等幾種,在大並發更新的過程中都要保證數據的准確性,其難度可想而知。因此,將用一個節點來專門講解如何設計秒殺减庫存方案。

高可用。 雖然介紹了很多極致的優化思路,但現實中總難免出現一些我們考慮不到的情况,所以要保證系統的高可用和正確性,還要設計一個PlanB來兜底,以便在最壞情况發生時仍然能够從容應對。筆記的最後,將帶你思考可以從哪些環節來設計兜底方案。


篇幅有限,無法一個模塊一個模塊詳細的展示(這些要點都收集在了這份《高並發秒殺頂級教程》裏),覺得有需要的碼友們,麻煩各比特轉發一下(可以幫助更多的人看到喲!) 點這裏,即可獲得免費下載的方式!!

由於內容太多,這裏只截取部分的內容。需要這份《高並發秒殺頂級教程》的小夥伴,麻煩各比特幫忙點贊分享支持一下(可以幫助更多的人看到喲!)

版權聲明
本文為[天天熬夜敲代碼]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2021/08/20210820012040268j.html

隨機推薦