搜尋

首頁  >  問答  >  主體

java - Full Gc过程会发生stop the world,这里jvm是怎么处理的呢?【面试题】

在不采用cms垃圾收集器或者在cms垃圾收集器初始标记和重新标记阶段,都会发生stop the world,也就是会暂停用户线程的执行,jvm是如何暂停所有用户线程的?烦请知道的朋友帮忙解答一下~
在实际场景中,可能gc的时间很短,但是暂停所有用户线程会用去很大一部分时间,这个时间又是如何得知的呢?

迷茫迷茫2889 天前927

全部回覆(4)我來回復

  • PHP中文网

    PHP中文网2017-04-18 10:07:31

    JVM有個叫做「安全點」和「安全區域」的東西,在發生GC時,所有的執行緒都會執行到「安全點」停下來。
    在需要GC的時候,JVM會設定一個標誌,當執行緒執行到安全點的時候會輪詢偵測這個標誌,如果發現需要GC,則執行緒會自己掛起,直到GC結束才恢復運作。

    還有另一個策略是在GC發生時,直接把所有線程都掛起,然後檢測所有線程是否都在安全點,如果不在安全點則恢復線程的執行,等執行到安全點再掛起。

    但是對於一些沒有獲得或無法獲得CPU時間的線程,就沒辦法等到它執行到安全點了,所以這個時候只要這個線程是在安全區域的,也可以進行GC,安全區域是一段代碼段,在這段程式碼段中物件的引用關係不會發生變化,所以這個時候進行GC也是安全的。

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-18 10:07:31

    安全暫停執行緒的Java方法不太穩定,我覺得Full GC時應該使用的是native方法。
    拿個關注學習一下。 。

    回覆
    0
  • 怪我咯

    怪我咯2017-04-18 10:07:31

    盡量避免出現full gc,減少使用大數組。

    回覆
    0
  • 迷茫

    迷茫2017-04-18 10:07:31

    gc不會很頻繁,只會在內存不足時發生(當然也不是絕對的),所以進行stop the world不會很頻繁,這保證了不會很影響用戶線程,而用戶線程都有一個安全區,stop the world就需要等待所有的線程都在安全區內,有可能出現有些很長時間的操作會等很久才能到達安全區,這導致stop the world可能會比gc本身等待的時間還要長,而解決這個問題的辦法就是安全區的設定上要合理,例如循環內部可以暫停和循環做完才可以暫停就會有很大差異。而安全區具體怎麼設定,就要看jvm廠商的決策了

    回覆
    0
  • 取消回覆