激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 快速理解Java垃圾回收和jvm中的stw

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

2021-01-16 10:42Chasing_Dreams Java教程

這篇文章主要介紹了快速理解Java垃圾回收和jvm中的stw,涉及Java代碼的停頓,jvm中的線程等相關內容,還是十分不錯的,需要的朋友可以參考。

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

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

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

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

1. JIT相關,比如Code deoptimization, Flushing code cache ;

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

3. Biased lock revocation 取消偏向鎖 ;

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

監控安全點看看JVM到底發生了什么?

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

-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

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

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

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

如何打印出事哪種原因導致的停頓呢?

再多加兩個參數:-XX:+PrintSafepointStatistics -XX: PrintSafepointStatisticsCount=1

此時,在stdout中會打出類似的內容

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: 安全點里的總線程數

initially_running: 安全點時開始時正在運行狀態的線程數

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

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

spin: 等待線程響應

safepoint號召的時間

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

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

cleanup: 清理所用時間

vmop: 真正執行VM Operation的時間

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

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

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

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

總結

本文關于快速理解Java垃圾回收jvm中的stw的介紹就到這里,希望對大家有所幫助,有什么問題可以隨時留言,小編會及時回復大家的。

原文鏈接:http://blog.csdn.net/b_11111/article/details/52725494

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲第五色综合网 | 成片免费大全 | 91精品国产一区二区三区动漫 | 中国av一级片 | 成人黄色免费网址 | 欧美亚洲国产成人 | 国产乱弄 | 黄色大片在线免费看 | 欧美顶级毛片在线播放小说 | 最新国产毛片 | 国产精品久久久久av | 日韩精品中文字幕在线观看 | 美女视频黄a视频免费全过程 | 免费看污视频在线观看 | 国产精品免费一区二区 | 91精品国产乱码久久久久久久久 | 精品国产观看 | 欧美久久久久久久久 | 日韩在线视频导航 | 色妞视频男女视频 | 羞羞的小视频 | 国产手机在线视频 | 中国杭州少妇xxxx做受 | 天天碰天天操 | 亚洲第一页综合 | a黄在线观看 | 看免费5xxaaa毛片 | 成年人视频免费看 | 欧美综合在线观看 | 影视免费观看 | 亚洲艳情网站 | 黄色特级 | 欧美18—19sex性护士中国 | 99国产精品国产免费观看 | 性毛片视频| 欧美成人免费香蕉 | 亚洲影院在线播放 | 久久久精品精品 | h视频在线免费看 | 91看片在线观看视频 | 午夜在线成人 |