[深入理解Java虛擬機器]第三章 概述:哪些記憶體需要回收?

Coding-lover發表於2015-10-05

說起垃圾收集(Garbage Collection,GC ) ,大部分人都把這項技術當做Java語言的伴生產物。事實上 ,GC的歷史比Java久遠 ,1960年誕生於MIT的Lisp是第一門真正使用記憶體動態分配和垃圾收集技術的語言。當Lisp還在胚胎時期時,人們就在思考GC需要完成的3件事情:

  • 哪些記憶體需要回收?
  • 什麼時候回收?
  • 如何回收?

經過半個多世紀的發展,目前記憶體的動態分配與記憶體回收技術已經相當成熟,一切看起來都進入了“自動化”時代,那為什麼我們還要去了解GC和記憶體分配呢?答案很簡單:當需要排查各種記憶體溢位、記憶體洩漏問題時,當垃圾收整合為系統達到更高併發量的瓶頸時,我們就需要對這些“自動化”的技術實施必要的監控和調節。

把時間從半個多世紀以前撥回到現在,回到我們熟悉的Java語言。第2章介紹了Java記憶體執行時區域的各個部分,其中程式計數器、虛擬機器棧、本地方法棧3個區域隨執行緒而生,隨執行緒而滅;棧中的棧幀隨著方法的進入和退出而有條不紊地執行著出棧和入棧操作。每一個棧幀中分配多少記憶體基本上是在類結構確定下來時就已知的(儘管在執行期會由JIT編譯器進行一些優化,但在本章基於概念模型的討論中,大體上可以認為是編譯期可知的),因此 這幾個區域的記憶體分配和回收都具備確定性,在這幾個區域內就不需要過多考慮回收的問題 ,因為方法結束或者執行緒結束時,記憶體自然就跟隨著回收了。而Java堆和方法區則不一 樣 ,一個介面中的多個實現類需要的記憶體可能不一樣,一個方法中的多個分支需要的記憶體也可能不一樣,我們只有在程式處於執行期間時才能知道會建立哪些物件,這部分記憶體的分配和回收都是動態的,垃圾收集器所關注的是這部分記憶體,本章後續討論中的“ 記憶體”分配與回收也僅指這一部分記憶體。

相關文章