首頁 >Java >Java基礎 >3分鐘了解JAVA中GC的概念

3分鐘了解JAVA中GC的概念

angryTom
angryTom轉載
2019-11-30 16:36:321687瀏覽

3分鐘了解JAVA中GC的概念

前言

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

3分鐘了解JAVA中GC的概念

做一件事情之前,我們一定要去知道為什麼要去做,這裡不只是指GC,更適用我們日常的學習和生活,知其然,知其所以然,方能百戰不殆。

(推薦影片:java影片教學)  

下面我們先去了解為什麼要有GC,以及GC 在JVM 中扮演了一個什麼樣的角色,起到了什麼的作用?

為什麼要有GC

用過C 的同學可能知道,物件所佔的內存在程式結束運作之前一直被佔用,在明確釋放之前不能分配給其它對象。如果我們不去手動的清除這些無用的對象,記憶體很快就被佔滿,而在JVM 中,GC 所起到的作用就是一個清道夫,它可以幫助我們去判定哪些對像是無用對象,怎麼進行垃圾收集,以及決定記憶體分代和記憶體分配的策略**。

可能有同學會問了,既然我們的 JVM 會給我們做 GC 的工作,為什麼我們還要去學習 GC 呢,一切交給 JVM 不好嗎?當然,在我們的日常情況下,我們通常不會去關心GC 的一些細節,但是當我們遇到內存洩露,內存溢出,高並發瓶頸的時候,我們就需要去對GC 開刀,進行更為細緻的監控和調節。

記憶體外洩:指程式中己動態分配的堆記憶體因某些原因程式未釋放或無法釋放,造成系統記憶體的浪費,導致程式運作速度減慢甚至系統崩潰等嚴重後果。

記憶體溢位:應用系統中存在無法回收的記憶體或使用的記憶體過多,最終使得程式運行要用到的記憶體大於能提供的最大記憶體。

那麼現在問題來了,我們要進行垃圾回收,首先我們需要知道垃圾在哪

垃圾在哪

前面我們講了JVM 的運行時記憶體區域,知道線程可以分為線程獨佔區和線程共享區,其中線程獨佔區(程式計數器,虛擬機棧,本地方法棧)的記憶體生命週期是和線程保持一致,且這幾個區域分配的記憶體大小跟類別的大小有關,也就是說,當我們的類別結構固定之後,這部分的記憶體就不會再發生更改,當方法或執行緒結束的時候,記憶體自然就跟隨著回收了.

而線程共享區的堆內存和方法區則不一樣,堆內存和方法區所用的內存是在編譯期間無法確定的,因為一個接口的不同實現,一個方法的不同控制條件分支所執行的程式碼可能完全相反,我們只有在運行時才知道會創建哪些對象,這部分的內存的分配和回收是動態的,而我們的GC 關注的就是該部分的內存。

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

本文來自php中文網,java教程欄目,歡迎學習!  

以上是3分鐘了解JAVA中GC的概念的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除