【深入Java虚拟机JVM 06】垃圾收集概述
說明:文章所有內容均摘自《深入理解Java虛擬機:JVM高級特性與最佳實踐(第二版)》
?
說起垃圾收集(Garbage Collection,GC),大部分人都把這項技術當做Java語言的伴生產物。事實上,GC的歷史比Java久遠,1960年誕生于MIT的Lisp是第一門真正使用內存動態(tài)分配和垃圾收集技術的語言。
當Lisp還在胚胎時期時,人們就在思考GC需要完成的3件事情:
- 哪些內存需要回收?
- 什么時候回收?
- 如何回收?
?
經過半個多世紀的發(fā)展,目前內存的動態(tài)分配與內存回收技術已經相當成熟,一切看起來都進入了“自動化”時代,那為什么我們還要去了解GC和內存分配呢?
答案很簡單:當需要排查各種內存溢出、內存泄漏問題時,當垃圾收集成為系統達到更高并發(fā)量的瓶頸時,我
們就需要對這些“自動化”的技術實施必要的監(jiān)控和調節(jié)。
把時間從半個多世紀以前撥回到現在,回到我們熟悉的Java語言。前面介紹了Java內存運行時區(qū)域的各個部分,其中程序計數器、虛擬機棧、本地方法棧3個區(qū)域隨線程而生,隨線程而滅;棧中的棧幀隨著方法的進入和退出而有條不紊地執(zhí)行著出棧和入棧操作。每一個棧幀中分配多少內存基本上是在類結構確定下來時就已知的(盡管在運行期會由JIT編譯器進行一些優(yōu)化,但在本章基于概念模型的討論中,大體上可以認為是編譯期可知的),因此這幾個區(qū)域的內存分配和回收都具備確定性,在這幾個區(qū)域內就不需要過多考慮回收的問題,因為方法結束或者線程結束時,內存自然就跟隨著回收了。而Java堆和方法區(qū)則不一樣,一個接口中的多個實現類需要的內存可能不一樣,一個方法中的多個分支需要的內存也可能不一樣,我們只有在程序處于運行期間時才能知道會創(chuàng)建哪些對象,這部分內存的分配和回收都是動態(tài)的,垃圾收集器所關注的是這部分內存,后續(xù)文章討論中的“內存”分配與回收也僅指這一部分內存。
?
總結
以上是生活随笔為你收集整理的【深入Java虚拟机JVM 06】垃圾收集概述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Spring注解系列14】@Profi
- 下一篇: 【深入Java虚拟机JVM 07】JVM