什麼是jvm?
答:虛拟機
什麼是GC
答記憶體回收機制
那麼接下來我們用Java來簡單說明一下Java中的虛拟機的記憶體回收機制到底是怎麼樣的。
衆所周知,Java是具有自動記憶體回收的,不等同于C,還需要程式猿考慮什麼時候去回收該資源,雖然說更靈活。但是無異于加大了程式開發的負擔。
那麼我們知道了Java是“自動化”的,為啥還要了解他呢?
開發經驗足的朋友都有過記憶體溢出之類的經曆,但是我們卻對他沒有辦法?在你了解GC之前肯定是這樣的,之後,就不一定了。
GC實作發生是在虛拟機記憶體中的,細緻一點來說在堆記憶體區域。
那麼再細分來說可以說,GC分别對待三種資料記憶體:年輕代、老年代、永久代。
那麼都這樣說了,那就是表明它對待不同對象有不同的處理方案。
這裡我們就長話短說了:
新生代:采用的是複制算法,簡單來說,就是将一片記憶體中還存活的資料對象,挨個複制到另一個記憶體片中取,這樣我們是不是可以了解為,在一個鴨棚,有天老闆抓了20隻鴨子殺了吃了,那麼假設鴨棚的鴨子都不會動哈,那麼鴨棚肯定會多出好多個空位(也就是記憶體碎片)。這個時候我們采用複制算法,将鴨棚A的鴨子一隻隻趕到鴨棚B(鴨棚B剛好容量為剩餘鴨子的數量)這個時候,我們就可以對記憶體進行回收處理了。那麼弊端也就很明顯了,就是你要想回收記憶體,必須要是一個養鴨大戶,每個記憶體片都要有對應的鴨棚B。
老年代:采用的是标記-清除算法,就是将标記中的記憶體片然後清除,比如老闆今天發現五隻鴨子死掉了,并且他們的羽毛上都有一個紅點标記着,這個時候,老闆進鴨棚直接提走丢掉這五隻鴨子了。這種回收算法了,就可以快速的把不用的記憶體片清理回收了,但是你想,這樣直接把标記的鴨子踢出去,那麼肯定有好多個空位,這個時候是不是很多記憶體碎片,那麼這個時候我們衍生出一種新的算法“标記-壓縮-清除算法”,這個時候,你踢出鴨子後,然後我們再對記憶體片進行一個壓縮操作,這個時候就對記憶體碎片進行一個去除了。