最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

快速理解Java垃圾回收和jvm中的stw

 更新時間:2017年10月10日 14:21:39   作者:Chasing_Dreams  
這篇文章主要介紹了快速理解Java垃圾回收和jvm中的stw,涉及Java代碼的停頓,jvm中的線程等相關(guān)內(nèi)容,還是十分不錯的,需要的朋友可以參考。

Java中Stop-The-World機制簡稱STW,是在執(zhí)行垃圾收集算法時,Java應用程序的其他所有線程都被掛起(除了垃圾收集幫助器之外)。Java中一種全局暫?,F(xiàn)象,全局停頓,所有Java代碼停止,native代碼可以執(zhí)行,但不能與JVM交互;這些現(xiàn)象多半是由于gc引起。

GC時的Stop the World(STW)是大家最大的敵人。但可能很多人還不清楚,除了GC,JVM下還會發(fā)生停頓現(xiàn)象。

JVM里有一條特殊的線程--VM Threads,專門用來執(zhí)行一些特殊的VM Operation,比如分派GC,thread dump等,這些任務,都需要整個Heap,以及所有線程的狀態(tài)是靜止的,一致的才能進行。所以JVM引入了安全點(Safe Point)的概念,想辦法在需要進行VM Operation時,通知所有的線程進入一個靜止的安全點。

除了GC,其他觸發(fā)安全點的VM Operation包括:

1. JIT相關(guān),比如Code deoptimization, Flushing code cache ;

2. Class redefinition (e.g. javaagent,AOP代碼植入的產(chǎn)生的instrumentation) ;

3. Biased lock revocation 取消偏向鎖 ;

4. Various debug operation (e.g. thread dump or deadlock check);

監(jiān)控安全點看看JVM到底發(fā)生了什么?

最簡單的做法,在JVM啟動參數(shù)的GC參數(shù)里,多加一句:

-XX:+PrintGCApplicationStoppedTime

它就會把全部的JVM停頓時間(不只是GC),打印在GC日志里。

2016-08-22T00:19:49.559+0800: 219.140: Total time for which application threads were stopped: 0.0053630 seconds

這是個很有用的必配參數(shù),可以打出幾乎一切的停頓……

但是,在JDK1.7.40以前的版本,它居然沒有打印時間戳,所以只能知道JVM停了多久,但不知道什么時候停的。此時一個土辦法就是加多一句“ -XX:+PrintGCApplicationConcurrentTime”,打印JVM在兩次停頓之間的正常運行時間(同樣沒有時間戳),但好歹能配合有時間戳的GC日志,反推出Stop發(fā)生的時間了。

2016-08-22T00:19:50.183+0800: 219.764: Application time: 5.6240430 seconds

如何打印出事哪種原因?qū)е碌耐nD呢?

再多加兩個參數(shù):-XX:+PrintSafepointStatistics -XX: PrintSafepointStatisticsCount=1

此時,在stdout中會打出類似的內(nèi)容

vmop [threads: total initially_running wait_to_block]1913.425: GenCollectForAllocation [ 55 2 0 ] [time: spin block sync cleanup vmop] page_trap_count[ 0 0 0 0 6 ] 0

此日志分兩段,第一段是時間戳,VM Operation的類型,以及線程概況

total: 安全點里的總線程數(shù)

initially_running: 安全點時開始時正在運行狀態(tài)的線程數(shù)

wait_to_block: 在VM Operation開始前需要等待其暫停的線程數(shù)

第二行是到達安全點時的各個階段以及執(zhí)行操作所花的時間,其中最重要的是vmop

spin: 等待線程響應

safepoint號召的時間

block: 暫停所有線程所用的時間

sync: 等于 spin+block,這是從開始到進入安全點所耗的時間,可用于判斷進入安全點耗時

cleanup: 清理所用時間

vmop: 真正執(zhí)行VM Operation的時間

可見,那些很多但又很短的安全點,全都是RevokeBias,詳見 偏向鎖實現(xiàn)原理, 高并發(fā)的應用一般會干脆在啟動參數(shù)里加一句"-XX:-UseBiasedLocking"取消掉它。另外還看到有些類型是no vm operation, 文檔上說是保證每秒都有一次進入安全點(如果這秒已經(jīng)GC過就不用了),給一些需要在安全點里進行,又非緊急的操作使用,比如一些采樣型的Profiler工具,可用-DGuaranteedSafepointInterval來調(diào)整,不過實際看它并不是每秒都會發(fā)生,時間不定。

在實戰(zhàn)中,我們利用安全點日志,發(fā)現(xiàn)過有程序定時調(diào)用Thread Dump等等情況。不過因為安全點日志默認輸出到stdout,因為性能及stdout日志的整潔性等原因,我們平時默認沒有開啟它。只有在需要時才打開。

再再增加下面三個參數(shù),可以知道更多VM里發(fā)生的事情。可惜JVM不會因為設了這三個參數(shù),就把安全點日志轉(zhuǎn)移到vm.log里面來,而是白白打印了兩次。

-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=/dev/shm/vm.log

總結(jié)

本文關(guān)于快速理解Java垃圾回收和jvm中的stw的介紹就到這里,希望對大家有所幫助,感興趣的朋友可以參閱:淺談Java回收對象的標記和對象的二次標記過程 、Java虛擬機裝載和初始化一個class類代碼解析 、Java中map遍歷方式的選擇問題詳解等,有什么問題可以隨時留言,小編會及時回復大家的。

相關(guān)文章

  • 談談我對Spring Bean 生命周期的理解

    談談我對Spring Bean 生命周期的理解

    Spring Bean 的生命周期在整個 Spring 中占有很重要的位置,掌握這些可以加深對 Spring 的理解。這篇文章主要介紹了Spring Bean 生命周期,需要的朋友可以參考下
    2018-03-03
  • 利用POI生成EXCEL文件的方法實例

    利用POI生成EXCEL文件的方法實例

    Apache POI 是用Java編寫的免費開源的跨平臺的 Java API,Apache POI提供API給Java程式對Microsoft Office格式檔案讀和寫的功能,下面這篇文章主要給大家介紹了關(guān)于利用POI生成EXCEL文件的相關(guān)資料,需要的朋友可以參考下
    2018-07-07
  • Mybatis-Plus中and()和or()的使用與原理詳解

    Mybatis-Plus中and()和or()的使用與原理詳解

    最近發(fā)現(xiàn)MyBatisPlus還是挺好用的,下面這篇文章主要給大家介紹了關(guān)于Mybatis-Plus中and()和or()的使用與原理的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • Spring Boot 3.x 集成 Eureka Server/Client的詳細過程

    Spring Boot 3.x 集成 Eureka Server/Cl

    隨著SpringBoot 3.x版本的開發(fā)嘗試,本文記錄了在集成Eureka Server/Client時所遇到的問題和解決方案,文中詳細介紹了搭建服務、配置文件和測試步驟,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • 舉例分析Python中設計模式之外觀模式的運用

    舉例分析Python中設計模式之外觀模式的運用

    這篇文章主要介紹了Python中設計模式之外觀模式的運用,外觀模式主張以分多模塊進行代碼管理而減少耦合,需要的朋友可以參考下
    2016-03-03
  • 如何實現(xiàn)Java的ArrayList經(jīng)典實體類

    如何實現(xiàn)Java的ArrayList經(jīng)典實體類

    ArrayList是Java集合框架中一個經(jīng)典的實現(xiàn)類。他比起常用的數(shù)組而言,明顯的優(yōu)點在于,可以隨意的添加和刪除元素而不需考慮數(shù)組的大小。下面跟著小編一起來看下吧
    2017-02-02
  • Java通用BouncyCastle實現(xiàn)的DES3加密的方法

    Java通用BouncyCastle實現(xiàn)的DES3加密的方法

    這篇文章主要介紹了Java通用BouncyCastle實現(xiàn)的DES3加密的方法,本文給大家介紹的非常詳細,對大家的學習或工作,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Springboot連接數(shù)據(jù)庫及查詢數(shù)據(jù)完整流程

    Springboot連接數(shù)據(jù)庫及查詢數(shù)據(jù)完整流程

    今天給大家?guī)淼氖顷P(guān)于Springboot的相關(guān)知識,文章圍繞著Springboot連接數(shù)據(jù)庫及查詢數(shù)據(jù)完整流程展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Spring?Boot監(jiān)控SQL運行情況的全過程

    Spring?Boot監(jiān)控SQL運行情況的全過程

    這篇文章主要給大家介紹了關(guān)于Spring?Boot監(jiān)控SQL運行情況的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家學習或者使用SpringBoot具有一定的參考學習價值,需要的朋友可以參考下
    2022-02-02
  • JAVA設計模式之備忘錄模式原理與用法詳解

    JAVA設計模式之備忘錄模式原理與用法詳解

    這篇文章主要介紹了JAVA設計模式之備忘錄模式,簡單說明了備忘錄模式的概念、原理并結(jié)合實例形式分析了java備忘錄模式的具體定義及使用方法,需要的朋友可以參考下
    2017-08-08

最新評論

莒南县| 新野县| 宕昌县| 游戏| 桓台县| 宁阳县| 巨鹿县| 云安县| 宁都县| 辽宁省| 滁州市| 龙胜| 通城县| 青龙| 景泰县| 城口县| 昭通市| 太仆寺旗| 揭东县| 永寿县| 徐闻县| 荣昌县| 甘谷县| 南川市| 河南省| 威远县| 青海省| 武威市| 弋阳县| 礼泉县| 慈溪市| 长泰县| 蒙城县| 泗阳县| 辽中县| 武宣县| 漳州市| 巴楚县| 封丘县| 日喀则市| 武鸣县|