「每日五分鐘,玩轉 JVM」:GC 概覽

前言

GC(Garbage Collection)是咱們在學習 JVM 的過程當中不可避免的一道坎,接下來,咱們就來系統的學習一下 GC。併發

image-20191107213453385

作一件事情以前,咱們必定要去知道咱們爲何要去作,這裏不只僅指 GC,更適用咱們平常的學習和生活,知其然,知其因此然,方能百戰不殆。高併發

下面咱們先去了解爲何要有 GC,以及 GC 在 JVM 中扮演了一個什麼樣的角色,起到了什麼的做用?學習

爲何要有 GC

用過 C++ 的同窗可能知道,對象所佔的內存在程序結束運行以前一直被佔用,在明確釋放以前不能分配給其它對象。若是咱們不去手動的清除這些無用的對象,內存很快就被佔滿,而在 JVM 中,GC 所起到的做用就是一個清道夫,它能夠幫助咱們去斷定哪些對象是無用對象怎麼進行垃圾收集,以及決定內存分代和內存分配的策略**。spa

可能有同窗會問了,既然咱們的 JVM 會給咱們作 GC 的工做,咱們爲何還要去學習 GC 呢,一切交給 JVM 很差嗎?固然,在咱們的平常狀況下,咱們通常不會去關心 GC 的一些細節,可是當咱們遇到內存泄露,內存溢出,高併發瓶頸的時候,咱們就須要去對 GC 開刀,進行更爲細緻的監控和調節。線程

內存泄露:指程序中己動態分配的堆內存因爲某種緣由程序未釋放或沒法釋放,形成系統內存的浪費,致使程序運行速度減慢甚至系統崩潰等嚴重後果。

內存溢出:應用系統中存在沒法回收的內存或使用的內存過多,最終使得程序運行要用到的內存大於能提供的最大內存。對象

那麼如今問題來了,咱們要進行垃圾回收,首先咱們須要知道垃圾在哪blog

垃圾在哪

前面咱們講了JVM 的運行時內存區域,知道線程能夠分爲線程獨佔區和線程共享區,其中線程獨佔區(程序計數器,虛擬機棧,本地方法棧)的內存生命週期是和線程保持一致,且這幾個區域分配的內存大小跟類的大小有關,也就是說,當咱們的類結構固定以後,這部分的內存就不會再發生更改,且當方法或線程結束的時候,內存天然就跟隨着回收了.接口

而線程共享區的堆內存和方法區則不同,堆內存和方法區所用的內存是在編譯期間沒法肯定的,由於一個接口的不一樣實現,一個方法的不一樣控制條件分支所執行的代碼可能徹底相反,咱們只有在運行時才知道會建立哪些對象,這部分的內存的分配和回收是動態的,而咱們的 GC 關注的就是該部分的內存。生命週期

打個比方來講:JVM 若是是一輛車,線程獨佔區的就像是零件,在出廠時這些零件的壽命基本上都是已知的,線程共享區就像是汽油,汽油的消耗跟咱們所採用的路線有關,因此咱們關注的部分就是這部分會動態變化的,好比如何開車才能更省油~內存

知道了垃圾在什麼位置會出現,咱們下一步就須要去斷定在這些區域的有哪些是垃圾~

下節預告

本節內容到這裏先告一段落,下一節咱們來學習,怎麼去斷定是否爲垃圾~

公衆號

相關文章
相關標籤/搜索