您好,登錄后才能下訂單哦!
JVM的GC收集器概念是什么,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
java在運行時,生成的對象都在堆里存放著,有些對象的生命周期很短,只幾行代碼運行完就沒用了.沒用了之后不能放任他在堆里, 要進行回收,把空間空出來,給后面的對象.
我們常用收拾屋子來比喻jvm清理堆.這里, 我們不僅僅有個房子, 我們還可以想得再大膽一些,天降一女俠當老婆,是家里的一把手,掌管整個家. 不久,又天降一大胖小子, 小子性格獨立,也有自己的一塊小空間.然后小刀就要開始打掃衛生,收拾房子了!
于生活中, 就是我要開始打掃衛生了, 大家先別動,讓我看看哪些東西是現在女俠和小子沒有在用的,又散落在外面占用空間, 當然我也不敢讓她們停太長時間, 所以趁他們停下來的時候,趕緊掃一眼,先把他們手上沒有用到的東西記下來, 然后趕緊讓她們繼續玩樂.
于JVM中,就是應用先停下來,然后GC工作線程,趕緊掃描一遍,看看哪些對象是還有用,哪些是沒用的
這里其實是兩個概念, 一個是安全點, 一個是安全區域. 都是描述STW發生的時機, 要讓STW發生的時候,系統的對象引用關系不會改變.
在我要喊停女俠和小子的時候, 如果我一喊相當于按了定時器,把她們都定住了,然后我發現女俠還在倒水, 不太好, 只先解鎖女俠的鎖定, 讓她倒完水再停. 這是搶先式中斷現在生活中, 很少有這樣的.
更多的場景是, 她們的耳朵一直聽著我有沒有說話(輪詢狀態), 我一喊停. 然后她們趕緊把手里面的活停下來,或者去沙發坐著,或者去床上躺著等自己最近的安全點上主動停下.
安全區域: 如果我喊停的時候, 小子剛好在睡覺(線程在休眠,或者阻塞). 雖然沒有聽到我喊的停,但也是安全的.
有句話說是, 擒賊先擒王,要抓住事物的主要矛盾! 當家里的東西很亂的時候, 要問問女俠和小子是怎么回事, 過去一看, 好家伙, 原來女俠在教小子識物學字. 學一個字,找一個對應的物品. 這時候, 本掃地的只要拿著那個小本子看一看, 就能順著找到哪些是要用的 ,哪些是已經沒用的了.
在JVM中, 有一個根對象的概念, 就是堆里面的東西和他們有關系的就是要用的, 沒有關系的,就是可以回收的了.我們來這樣分類記憶
先是和類相關的:
類靜類屬性引用的對象
然后是和實例相關的:
虛擬棧中使用到的參數,局部變量,臨時變量
JNI中引用的對象
然后是JVM層面的:
常量引用的對象,如字符串常量池里的引用
所有被synchronized 持有的對象
虛擬機內部的引用,如Class對象, 常駐內存的異常對象,系統類加載器等等
縱觀現在對大數據量的處理,大都是分而治之, 劃區而治. 那區與區之間不可能為了查A區的某條信息,把整個B區都查一遍.
如小刀我現在在上海工作, 女俠在成都.那么在上海就會有個記憶集,里面存著, 有成都某某區某某街(精確度有不同的實現)到小刀的一條引用關系.
那哪一天上海要統計人員的時候, 來找到小刀了, 我說我在成都哪里哪里還有人, 那統計人員就到那個區域查一查, 看我有沒有說慌. 如確實有引用關系, 好,那小刀還有人關心著, 讓他繼續工作吧. 要是一查,發現沒有這個引用關系, 得了, 沒人要的小刀, 可以關進小黑屋嘍~!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。