「這是我參與8月更文挑戰的第11天,活動詳情查看:8月更文挑戰」java
前面講了jVM
有哪些內存區域怎麼劃分的,何時會出現內存溢出的異常,學完了草原上的基本環境,咱們進入狼的篇章,等待你是否是跑題了,這跟狼有啥關係,由於若是把對象比喻成羊,那垃圾回收就是羣狼,狼來限制羊的數量,保證天然正常運轉,在蒙古,狼是神靈,每當有人去世,都會把屍體喂狼,狼在他們眼中就是神祕的存在,一樣,咱們的垃圾回收也有不少奧祕等着咱們揭開,那就和我一塊兒來看看吧。markdown
其實,最先垃圾回收不是誕生於java
語言的,最先是麻省的lisp
(呀呀呀,怎麼又是美國的),哎沒錯,認可吧,這貨1960
年就使用內存動態分配和垃圾收集技術的語言了,其實歸根結底垃圾回收主要解決三個問題:何時回收?回收哪塊啊?怎麼回收啊?併發
why
)?由於日常要排查各類內存溢出和泄漏的問題,還有就是高併發場景下須要對垃圾回收進行必要的監控和調節。高併發
前面提到了一些基礎,因此假設你們都不是小白了,咱們知道Java
中有三塊內存是和線程的生命週期是相同的,分別是:程序計數器、本地方法棧和虛擬機棧,咱們知道每一個方法的執行都會在棧中由線程建立一個棧幀,伴隨着方法的調用和結束進行着入棧和出棧的操做,每一個棧幀的大小都是能夠肯定下來的,說白了,這幾塊區域本身都內心有數,因此不是咱們考慮垃圾回收的對象。post
那就剩堆和方法區了,就這倆塊區域本身內心沒數,你就有疑問了這兩塊哪裏沒數了啊,那我問你哦(一本正經),方法區是幹嗎的?那還用說,存放類的信息和方法信息的啊,那好,那你知道一個接口有多少個實現類嘛?每一個類的內存是多少呢?方法裏會用到多少參數?佔多少內存,建立多少對象?支支吾吾不出來吧,因此啊,這兩快區域有很顯著的不肯定性,須要動態分配內存。spa
盡心盡力纔是對本身真實世界的不辜負,作任何事都要盡心盡力,什麼叫盡心盡力啊?線程
《狼圖騰》中有這樣一段描述:你要是想在草原生活下去,就必需要比狼聰明,比狼強大。code
誰敢和狼鬥啊,我敢保證碰見了絕對會發抖,就那犀利的眼神都能讓你的靈魂抖上一抖,可是你能穩定本身焦躁的心,你不怕,你不光不怕,還能和它對視,瞭解以後,還能用所學和它戰鬥,若是遭遇失敗,還能總結經驗再戰,直到打敗它,這就叫盡心盡力。orm
實際上,咱們每一個人的心理都住着一匹狼,慢慢地瞭解它,接近它,靠近它,最終馴服它(怎麼有種體內封印了一條九尾的感受),沒錯它就會變成你的力量,隨你征戰沙場。對象