Java中的?stop?the?world是什么呢
一、概述;
從字面上講,就是停止這個(gè)世界,看到這個(gè)字眼,就覺得這是可怕的事情,那到底什么是stop-the-world?
stop-the-world,簡(jiǎn)稱 STW,指的是 GC 事件發(fā)生過程中,會(huì)產(chǎn)生應(yīng)用程序的停頓。停頓產(chǎn)生時(shí)整個(gè)應(yīng)用程序線程都會(huì)被暫停,沒有任何響應(yīng),有點(diǎn)像卡死的感覺,這個(gè)停頓稱為 STW。
舉例:
可達(dá)性分析算法中枚舉根節(jié)點(diǎn)(GC Roots)會(huì)導(dǎo)致所有Java執(zhí)行線程停頓。
停頓的原因:
- 分析工作必須在一個(gè)能確保一致性的快照中進(jìn)行
- 一致性指整個(gè)分析期間整個(gè)執(zhí)行系統(tǒng)看起來像被凍結(jié)在某個(gè)時(shí)間點(diǎn)上
- 如果出現(xiàn)分析過程中對(duì)象引用關(guān)系還在不斷變化,則分析結(jié)果的準(zhǔn)確性無(wú)法保證
二、為什么需要STW(stop the world)
垃圾回收是根據(jù)可達(dá)性分析算法,搜索GC Root根的引用鏈,將不在引用鏈上的對(duì)象當(dāng)做垃圾回收,設(shè)想我們執(zhí)行某個(gè)方法的時(shí)候,此時(shí)產(chǎn)生了很多局部變量,剛好老年代滿了需要進(jìn)行Full gc,如果不停止線程,垃圾回收正在根據(jù)這些局部變量也就是GC Root根搜索引用鏈,此時(shí)這個(gè)方法結(jié)束了,那么這些局部變量就都會(huì)被銷毀,這些引用鏈的GC Root根都銷毀了,這些引用當(dāng)然也成了垃圾對(duì)象,這樣就會(huì)導(dǎo)致在垃圾回收的過程中還會(huì)不斷的產(chǎn)生新的垃圾。
但是Stop-The-World的結(jié)果是比較嚴(yán)重的,如果用戶正在瀏覽你的網(wǎng)站,應(yīng)用程序突然Stop-The-World,所有線程被掛起,那么用戶就會(huì)感覺你的網(wǎng)站卡住了,盡管gc時(shí)間是比較快的,但是如果并發(fā)量比較大,用戶感知是比較明顯的,會(huì)影響用戶體驗(yàn)。
簡(jiǎn)明地說:
java進(jìn)行垃圾回收時(shí)使用可達(dá)性分析,從GC Root向下判斷對(duì)象是否有引用,如果不把所有線程進(jìn)入safe points并阻塞起來就會(huì)出現(xiàn)對(duì)象上一秒沒有引用被刪除,后一秒又出現(xiàn)引用,導(dǎo)致錯(cuò)誤的產(chǎn)生
三、stop-the-world示例:
被 STW 中斷的應(yīng)用程序線程會(huì)在完成 GC 之后恢復(fù),頻繁中斷會(huì)讓用戶感覺像是網(wǎng)速不快造成電影卡頓一樣,所以我們需要減少 STW 的發(fā)生。
STW 事件和采用哪款 GC 無(wú)關(guān),所有的 GC 都有這個(gè)事件。
哪怕是G1也不能完全避免Stop一the一world情況發(fā)生,只能說垃圾回收器越來越優(yōu)秀,回收效率越來越高,盡可能地縮短了暫停時(shí)間。
STW是JVM在后臺(tái)自動(dòng)發(fā)起和自動(dòng)完成的。在用戶不可見的情況下,把用戶正常的工作線程全部停掉。
開發(fā)中采用System.gc();會(huì)導(dǎo)致Stop一the一world的發(fā)生。
源碼:
import java.util.ArrayList; import java.util.List; public class StopTheWorldDemo { public static void main(String[] args) { WorkThread w = new WorkThread(); PrintThread p = new PrintThread(); w.start(); p.start(); } public static class WorkThread extends Thread { List<byte[]> list = new ArrayList<byte[]>(); public void run() { try { while (true) { for (int i = 0; i < 1000; i++) { byte[] buffer = new byte[1024]; list.add(buffer); } if (list.size() > 10000) { list.clear(); System.gc();//會(huì)觸發(fā)full gc,進(jìn)而會(huì)出現(xiàn)STW事件 } } } catch (Exception ex) { ex.printStackTrace(); } } } public static class PrintThread extends Thread { public final long startTime = System.currentTimeMillis(); public void run() { try { while (true) { // 每秒打印時(shí)間信息 long t = System.currentTimeMillis() - startTime; System.out.println(t / 1000 + "." + t % 1000); Thread.sleep(1000); } } catch (Exception ex) { ex.printStackTrace(); } } } }
運(yùn)行結(jié)果:
從結(jié)果可以看出:
W線程當(dāng)中的GC觸發(fā)了STW,進(jìn)而干擾了P線程有規(guī)律性打印。打印變得雜亂無(wú)章
源碼下載:
gitee.com/charlinchenlin/koo-erp
到此這篇關(guān)于Java中的 stop the world是什么呢的文章就介紹到這了,更多相關(guān)java stop the world內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決idea不支持SpringBoot yml文件的圖文教程
這篇文章主要介紹了解決idea不支持SpringBoot yml文件,需要的朋友可以參考下2018-06-06SpringMVC數(shù)據(jù)響應(yīng)詳細(xì)介紹
Spring MVC 是 Spring 提供的一個(gè)基于 MVC 設(shè)計(jì)模式的輕量級(jí) Web 開發(fā)框架,本質(zhì)上相當(dāng)于 Servlet,Spring MVC 角色劃分清晰,分工明細(xì),本章來講解SpringMVC數(shù)據(jù)響應(yīng)2023-02-02Java中八種基本數(shù)據(jù)類型的默認(rèn)值
這篇文章主要介紹了Java中八種基本數(shù)據(jù)類型的默認(rèn)值 的相關(guān)資料,需要的朋友可以參考下2016-07-07logback的UNDEFINED_PROPERTY屬性源碼執(zhí)行流程解讀
這篇文章主要為大家介紹了logback的UNDEFINED_PROPERTY屬性源碼執(zhí)行流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11Spring cloud oauth2如何搭建認(rèn)證資源中心
這篇文章主要介紹了Spring cloud oauth2如何搭建認(rèn)證資源中心,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11從Android源碼剖析Intent查詢匹配的實(shí)現(xiàn)
這篇文章主要介紹了從Android源碼剖析Intent查詢匹配的實(shí)現(xiàn),Intent部分的源碼為Java代碼,需要的朋友可以參考下2015-07-07JavaWeb實(shí)現(xiàn)郵件發(fā)送功能
這篇文章主要為大家詳細(xì)介紹了JavaWeb實(shí)現(xiàn)郵件發(fā)送功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12Spring Cloud Nacos 和 Eureka區(qū)別解析
Spring Cloud Nacos 和 Spring Cloud Eureka 都是 Spring Cloud 微服務(wù)框架中的服務(wù)注冊(cè)和發(fā)現(xiàn)組件,用于幫助開發(fā)者輕松地構(gòu)建和管理微服務(wù)應(yīng)用,這篇文章主要介紹了Spring Cloud Nacos 和 Eureka區(qū)別,需要的朋友可以參考下2023-08-08JPA框架實(shí)現(xiàn)分頁(yè)查詢和條件查詢功能詳解
這篇文章主要介紹了JPA框架實(shí)現(xiàn)分頁(yè)查詢和條件查詢功能,JPA是Java Persistence API的簡(jiǎn)稱,在過去很多數(shù)據(jù)庫(kù)的增刪查改操作都是用這個(gè)框架操作的,感興趣想要詳細(xì)了解可以參考下文2023-05-05