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