小師妹學JVM之:JVM中的Safepoints

簡介

java程序員都據說過GC,你們也都知道GC的目的是掃描堆空間,而後將那些標記爲刪除的對象從堆空間釋放,以提高可用的堆空間。今天咱們會來探討一下隱藏在GC背後的一個小祕密Safepoints。java

GC的垃圾回收器

小師妹:F師兄,GC的垃圾回收器的種類爲何會有這麼多呀?使用起來不是很麻煩。而且我據說CMS在JDK9zhong已經被廢棄了。程序員

小師妹,這麼多垃圾回收器實際是在JVM的發展過程當中創建起來的,在以前的文章中,咱們講到了目前的GC回收器有這樣幾種。spring

  1. 基於分代技術的回收器

Concurrent mark sweep (CMS) ,CMS是mark and swap的升級版本,它使用多個線程來對heap區域進行掃描,從而提高效率。併發

因爲CMS的參數複雜性和性能問題,CMS已經在JDK9中被廢棄了。

Serial garbage collection,使用單一的線程來進行垃圾回收操做,其好處就是不須要和其餘的線程進行交互。若是你是單核的CPU,那麼最好就是選擇Serial garbage collection,由於你不能充分利用多核的好處。一樣的它也經常用在比較小型的項目中。jvm

Parallel garbage collection,若是你是多核處理器,那麼Parallel GC多是你的選擇。spring-boot

Parallel GC是JDK8中的默認GC。而在JDK9以後, G1是默認的GC。

G1 garbage collection,G1=Garbage First,它是爲替換CMS而生的,最先出如今java7中。性能

G1將heap區域劃分紅爲多個更小的區域,每一個小區域都被標記成爲young generation 或者old generation。從而運行GC在更小的範圍裏運行,而不是影響整個heap區域。區塊鏈

  1. 非基於分代技術的回收器

Z Garbage Collection,ZGC是一個可擴展的,低延遲的GC。ZGC是併發的,並且不須要中止正在運行的線程。優化

ZGC是在JDK11中引入的。

固然還有正在研發中的其餘GC。spa

更多精彩內容且看:

分代回收器中的問題

小師妹:F師兄,分代回收器很差嗎?爲何還有新的ZGC等基於非分代技術的回收器?

分代垃圾回收器中有一個很是常見的現象就是"Stop The World"。什麼是Stop the world呢?

就是說在GC的時候,爲了進行垃圾回收,須要全部的線程都要暫停執行。全部的線程都暫停執行。

固然G1雖然是基於分代技術,可是G1其實是不會"Stop The World"的。

JVM定義了一些Root對象,從這些對象開始,找出他們引用的對象,組成一個對象圖。全部在這個圖裏面的對象都是有效的對象,反之不在對象圖中的對象就應該被回收。有效的對象將會被Mark爲alive。

這些Root對象包括:正在執行的方法中的本地對象和輸入參數。活動的線程,加載類中的static字段和JNI引用。

safepoints

爲了實現STW的功能,JVM須要提供一個機制,讓全部的線程能夠在某一個時刻同時停下來。這個停下來的時刻就叫作safepoints。

注意,這些停下來的線程不包括運行native code的線程。由於這些線程是不屬於JVM管理的。

JVM中的代碼執行其實有兩種方式,一種是JIT編譯成爲機器碼,一種是解釋執行。

在JIT中,直接將檢查代碼編譯進入了機器碼中。經過設置相應的標記位,從而在線程運行的過程當中執行暫停的指令。

仍是舉一個上篇文章中咱們提到的JMH的例子:

@Benchmark
    public void test1() {
        int length = array.length;
        for (int i = 0; i < length; i=i+1)
            array[i] ++;
    }

咱們看一下它的assembly code:

能夠看到其中有個test的指令,這個test指令就是生成的safe points。

經過設置標誌位,就能夠在線程運行時執行暫停操做。

若是是解釋執行的話,JVM保存了兩個字節碼的調度table,當須要safepoint的時候,JVM就進行table的切換,從而開啓safepoint。

safepoint通常用在什麼地方

通常狀況下,GC,JIT的反代碼優化,刷新code cache,類重定義 ,偏向鎖撤銷和其餘的一些debug操做。

咱們能夠經過使用-XX:+PrintGCApplicationStoppedTime來print safepints的暫停時間。

-XX:+PrintSafepointStatistics –XX:PrintSafepointStatisticsCount=1這兩個參數能夠強制JVM打印safepoint的一些統計信息。

總結

Safepoint是垃圾回收中一個很是重要的概念,但願你們可以有所瞭解。

本文做者:flydean程序那些事

本文連接:http://www.flydean.com/jvm-jit-safepoints/

本文來源:flydean的博客

歡迎關注個人公衆號:程序那些事,更多精彩等着您!

相關文章
相關標籤/搜索