真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SafePoint安全點是什么

這篇文章主要介紹“SafePoint安全點是什么”,在日常操作中,相信很多人在SafePoint安全點是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”SafePoint安全點是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

創(chuàng)新互聯(lián)公司專注于云州企業(yè)網(wǎng)站建設,成都響應式網(wǎng)站建設公司,商城建設。云州網(wǎng)站建設公司,為云州等地區(qū)提供建站服務。全流程按需規(guī)劃網(wǎng)站,專業(yè)設計,全程項目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務

前提概要

safepoint又稱為安全點,它是hotspot等JVM中的一個重要概念。下面我們分部分了解下safepoint是什么、safepoint的作用、safepoint是如何實現(xiàn)的以及作為開發(fā)者有哪些需要注意的地方。

SafePoint安全點是什么

JVM的主要任務是執(zhí)行Java程序,而JVM運行時本身也是一個程序,但是為了執(zhí)行Java程序JVM還有不少輔助工作,比如進行GC、JIT編譯等等。一般會把運行在JVM上的用戶Java程序稱為mutator。

GC為例,JVM中一般的GC都使用可達性分析,也就是從應用程序的一些GC Root(比如運行中的線程棧里的方法棧幀中本地變量表、操作數(shù)表中的引用、靜態(tài)變量引用等)開始通過引用進行引用圖遍歷,如果在JVM遍歷的過程中mutator也在運行,則mutator則可能會修改這個對象圖的引用關(guān)系,如果JVM不對這種并發(fā)修改進行特殊處理,可能導致一些非可回收對象沒有被遍歷到,從而被標記成垃圾對象而被錯誤的回收。(切記標記的都是存活的對象,而不是要被清除的,此外不會之遍歷不到就會被立刻回收,還需要考慮finalize方法進行再一次判斷)。

如果要完全并發(fā)GC,JVM的實現(xiàn)成本會比較大,并且很多情況下整體的吞吐量是會降低的。(聯(lián)想下并發(fā)編程中cas原子操作和加鎖的使用,如果競爭比較激烈使用加鎖效率更高,因為能夠減少cas循環(huán)的cpu消耗

因此在很多GC收集器中都會有一些StopTheWorld階段,這個StopTheWorld就是safepoint。在safepoint中不會有mutator操作對象,并且線程棧和heap中每個位置的數(shù)據(jù)類型也是確定的(比如一個8bit的數(shù)據(jù)是long還是對象引用)。

一個線程要么在safepoint中,要么不在safepoint中。上面提到的StopTheWorld指的是全局safepoint(針對hotspot),也就是要求所有線程都處于safepoint狀態(tài)。后面如果沒有特別說明safepoint也指的是全局safepoint。

safepoint是如何實現(xiàn)的

JVM如何通知線程進入safepoint

在hotspot實現(xiàn)中safepoint是協(xié)作式的,當JVM需要mutator進入safepoint時,會設置一個狀態(tài)標記表示要進入safepoint了,每個mutator線程都會在合適的時機檢查這個狀態(tài)標記,如果發(fā)現(xiàn)需要進入safepoint則會暫停自己

這里的合適的時機的選取,既要不那么頻繁,避免增大運行時開銷(不能每走一步看一次),也不能太久不檢查,避免進入safepoint進入太慢(需要線程們都進入safepoint狀態(tài)才行,如果有一個線程一直干活不檢查safepoint會影響其他線程,畢竟其他線程都在等著)。

  • 如果是compiled code(JIT編譯后的代碼),JIT會在某些地方插入檢查代碼,比如方法調(diào)用返回和循環(huán)跳回的地方

  • 如果是interpreted code(解釋執(zhí)行),JVM有兩個字節(jié)碼分發(fā)表,如果需要進入safepoint,則JVM會切換到有safepoint狀態(tài)檢查的那個分發(fā)表上。

各個線程如何檢查是否要進入safepoint

為了盡量減少開銷,hotspot中safepoint的狀態(tài)檢查的實現(xiàn)方式是讀取一個內(nèi)存值,如果需要進入safepoint,則將這個內(nèi)存頁設置成被保護的,這樣就會觸發(fā)一個page fault,然后就可以通過異常處理進入safepoint了。這種方式比準確讀取一個內(nèi)存值(比如一個boolean數(shù)據(jù))要輕量(因為需要內(nèi)存同步)

大家可能會想到如果一個線程處于sleep,線程在執(zhí)行JNI代碼時也處于safepoint中,并且其他的”阻塞”狀態(tài)也是在safepoint中,比如Thread.sleep,如果要退出線程要退出safepoint需要JVM允許,這樣就不會出現(xiàn)sleep狀態(tài)的線程在其他線程進入safepoint后突然運行這種情況了。

有哪些會引發(fā)safepoint的情況

除了一些GC階段需要safepoint內(nèi)執(zhí)行,其他的比較常見的操作有。

revoke bias

(偏向鎖撤銷,頻繁看到偏向鎖撤銷可以考慮關(guān)閉偏向鎖-XX:-UseBiasedLocking)

dump線程棧

無論是通過jstack還是通過jmx的,ThreadMXBean.getThreadInfo(maxDepth>0的情況)還是Thread.getAllStackTraces等方法,都會觸發(fā)safepoint,如果線程非常多則可能導致比較長時間的暫停。

class redefinition

(通過Instrument對象對類進行retransform或redefine)

code deoptimization

如何排查safepoint相關(guān)問題

在JVM啟動參數(shù)上增加一些參數(shù)可以打印出應用暫停和safepoint相關(guān)信息。

如果版本<=jdk8

-XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime 
-XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1

如果版本>jdk8

-Xlog:gc*=info::time,tags,tid 
-Xlog:safepoint=info::time,tags,tid

一個示例

[2020-05-18T09:18:55.978-0800][19459][safepoint    ] Application time: 1.0038747 seconds
[2020-05-18T09:18:55.978-0800][19459][safepoint    ] Entering safepoint region: ThreadDump
[2020-05-18T09:18:55.980-0800][19459][safepoint    ] Leaving safepoint region
[2020-05-18T09:18:55.980-0800][19459][safepoint    ] Total time for which application threads were stopped: 0.0017502 seconds, Stopping threads took: 0.0000312 seconds

這個表示應用線程運行了1.0038747秒后,因為ThreadDump開始進入safepoint,應用線程被暫停了0.0017502秒,暫停這些線程花了0.0000312秒

到此,關(guān)于“SafePoint安全點是什么”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
網(wǎng)站標題:SafePoint安全點是什么
文章來源:http://weahome.cn/article/jpjeoh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部