????????JVM,即Java虛擬機,其是Java程序的運行環境,是Java技術的核心組成部分,本次就JVM的自動內存管理詳細展開:
? ? ? ? JVM的內存區域分為2大類,即線程私有的和線程共享的,前者分為3大塊,虛擬機棧、本地方法棧、程序計數器。后者分為2大塊,堆與方法區。
? ? ? ? 首先是私有的3大塊區域:
? ? ? ? ? ? ? ? 1、程序計數器:程序計數器是一個較小的內存區域,其用于記錄當前線程所執行的字節碼指令的地址。每一個線程都有一個自己的程序計數器,其可以使線程切換時,快速的恢復到正確的執行位置。程序計數器的劃分和管理是實現JVM高效運行和內存管理的基礎。
? ? ? ? ? ? ? ? 2、虛擬機棧:其生命周期與線程一樣,在創建線程時,會自動創建一個虛擬機棧,在每個方法在執行時,都會創建一個棧幀,其用于存儲局部變量表、操作數棧、動態鏈接和方法出口等信息。每一個方法調用時,這個棧幀就會入棧,方法結束時,則會出棧。即每一個方法被調用直至執行完畢的過程,就對應著一個棧幀在虛擬機棧中從入棧到出棧的過程。
? ? ? ? ? ? ? ? 不過,值得注意的是,在虛擬機棧中局部變量表部分中,?放了編譯期可知的各種Java虛擬機基本數據類型(boolean、bytechar、short、int、 float、long、double)、對象引用(reference),它并不等同于對象本身,可能是一個指向對象起始地址的引用指針,也可能是指向一個代表對象的句柄或者其他與此對象相關的位置)和returnAddress類型(指向了一條字節碼指令的地址)。。這些數據類型在局部變量表中的存儲空間以局部變量槽(Slot)來表示,其中64位長度的long和double類型的數據會占用兩個變量槽,其余的數據類型只占用一個。
? ? ? ? ? ? ? ? 3、本地方法棧:其與虛擬機棧功能接近,只不過其是為虛擬機使用到的本地方法服務。
? ? ? ? 然后是線程共享的2個區域:
? ? ? ? ? ? ? ? 1、堆:堆是JVM管理的內存中最大的一塊,其主要作用是存放對象實例和數組。堆也是垃圾收集器管理的內存區域,所以通常會被進一步劃分為新生代、老年代、永久代等。不過無論從什么角度,無論如何劃分,都不會改變堆中存儲內容的共性,無論是哪個區域,存儲的都只能是對象的實例,將堆細分的目的只是為了更好地回收內存,或者更快地分配內存。
? ? ? ? ? ? ? ? 2、方法區:其用于存儲已被虛擬機加載的類型信息、常量、靜態變量、即時編譯器編譯后的代碼緩存等數據。