免费A级毛片无码专区网站-成人国产精品视频一区二区-啊 日出水了 用力乖乖在线-国产黑色丝袜在线观看下-天天操美女夜夜操美女-日韩网站在线观看中文字幕-AV高清hd片XXX国产-亚洲av中文字字幕乱码综合-搬开女人下面使劲插视频

一文講清楚 JVM Safe Point

【一文講清楚 JVM Safe Point】

一文講清楚 JVM Safe Point

文章插圖
大家好 , 我是樹(shù)哥 。
關(guān)于 Safe Point 是 JVM 中很關(guān)鍵的一個(gè)概念 , 但我估計(jì)有不少同學(xué)不是很懂 。于是今天跟大家來(lái)深入聊聊 Safe Point , 希望通過(guò)這篇文章能解答這樣幾個(gè)問(wèn)題:
  1. 什么是 Safe Point?
  2. 為啥需要 Safe Point?
  3. Safe Point 與 Stop the World 的關(guān)系?
什么是 Safe Point正如 Safe Point 名稱的寓意一樣 , Safe Point 是一個(gè)線程可以安全停留在這里的代碼點(diǎn) 。當(dāng)我們需要進(jìn)行 GC 操作的時(shí)候 , JVM 可以讓所有線程在 Safe Point 處停留下來(lái) , 等到所有線程都停在 Safe Point 處時(shí) , 就可以進(jìn)行內(nèi)存引用分析 , 從而確定哪些對(duì)象是存活的、哪些對(duì)象是不存活的 。
為什么讓大家更加場(chǎng)景化地理解 Safe Point 這個(gè)概念 , 可以設(shè)想如下場(chǎng)景:
  1. 當(dāng)需要 GC 時(shí) , 需要知道哪些對(duì)象還被使用 , 或者已經(jīng)不被使用可以回收了 , 這樣就需要每個(gè)線程的對(duì)象使用情況 。
  2. 對(duì)于偏向鎖(Biased Lock) , 在高并發(fā)時(shí)想要解除偏置 , 需要線程狀態(tài)還有獲取鎖的線程的精確信息 。
  3. 對(duì)方法進(jìn)行即時(shí)編譯優(yōu)化(OSR 棧上替換) , 或者反優(yōu)化(bailout 棧上反優(yōu)化) , 這需要線程究竟運(yùn)行到方法的哪里的信息 。
對(duì)于上面這些操作 , 都需要知道現(xiàn)場(chǎng)的各種信息 , 例如寄存器有什么內(nèi)容 , 堆使用情況等等 。在做這些操作的時(shí)候 , 線程需要暫停 , 等到這些操作完成才行 , 否則會(huì)有并發(fā)問(wèn)題 , 這就需要 Safe Point 的存在 。
因此 , 我們可以將 Safe Point 理解成代碼執(zhí)行過(guò)程中的一些特殊位置 , 當(dāng)線程執(zhí)行到這個(gè)位置時(shí) , 線程可以暫停 。Safe Point 處保存了其他位置沒(méi)有的一些當(dāng)前線程信息 , 可以提供給其他線程讀取 , 這些信息包括:線程上下文信息 , 對(duì)象的內(nèi)部指針等 。
而 Stop the World 就是所有線程同時(shí)進(jìn)入 Safe Point 并停留在那里 , 等待 JVM 進(jìn)行內(nèi)存分析掃描 , 接著進(jìn)行內(nèi)存垃圾回收的時(shí)間 。
為啥需要 Safe Point前面我們說(shuō)到 , Safe Point 其實(shí)就是一個(gè)代碼的特殊位置 , 在這個(gè)位置時(shí)線程可以暫停下來(lái) 。而當(dāng)我們進(jìn)行 GC 的時(shí)候 , 所有線程都要進(jìn)入到 Safe Point 處 , 才可以進(jìn)行內(nèi)存的分析及垃圾回收 。根據(jù)這個(gè)過(guò)程 , 其實(shí)我們可以看到:Safe Point 其實(shí)就是柵欄的作用 , 讓所有線程停下來(lái) , 否則如果所有線程都在運(yùn)行的話 , JVM 無(wú)法進(jìn)行對(duì)象引用的分析 , 那么也無(wú)法進(jìn)行垃圾回收了 。
此外 , 另一個(gè)重要的 Java 線程特性 —— interrupted 也是根據(jù) Safe Point 實(shí)現(xiàn)的 。當(dāng)我們?cè)诖a里寫(xiě)入 Thread.interrupt() 時(shí) , 只有線程運(yùn)行到 Safe Point 處時(shí)才知道是否發(fā)生了 interrupted 。因此 , Safe Point 也承擔(dān)了存儲(chǔ)線程通信的功能 。
總結(jié)簡(jiǎn)單地說(shuō) , Safe Point 就是人為規(guī)定出的一些代碼位置 , 在這些位置上線程可以暫停下來(lái) , 從而讓 JVM 可以進(jìn)行內(nèi)存對(duì)象引用分析等操作 。此外 , Safe Point 處也會(huì)存儲(chǔ)一些特殊的信息 , 從而支持 Java 的某些特性 , 例如:Java 的 interrupt 特性需要到 Safe Point 處才能知道 。

經(jīng)驗(yàn)總結(jié)擴(kuò)展閱讀