1. 程式人生 > >Java的記憶體結構

Java的記憶體結構

Java中的記憶體結構

在說明他們在記憶體中如何儲存之前,先要對記憶體中的儲存區域進行講解。

儲存資料的地方有:

1、暫存器(程式計數器Program Counter Register)

在CPU內部,是最快的儲存區。在位元組碼直譯器工作時,就是通過改變程式計數器的值來選取下一條要執行的指令,分支、迴圈、跳轉、等基礎功能都是依賴此技術區完成的。在java多執行緒方面,多執行緒就是通過執行緒輪流切換而達到的,同一時刻,一個核心只能執行一個指令,所以,對於每一個程式來說,必須有一個計數器來記錄程式的執行進度,這樣,當執行緒恢復執行的時候,才能從正確的地方開始,所以,每個執行緒都必須有一個獨立的程式計數器,這類計數器為執行緒私有的記憶體。如果一個執行緒正在執行一個Java方法,則計數器記錄的是位元組碼的指令的地址,如果執行的一個Native方法,則計數器的記錄為空,此記憶體區是唯一一個在Java規範中沒有任何OutOfMemoryError情況的區域。

2、棧(Stacks)

位於RAM(通用隨機訪問儲存器)中,分配儲存的方法速度僅次於暫存器。建立程式時,系統必須知道儲存在棧內所有項(iterm)的確切生命週期,以便上下移動指標,這一約定限制了程式的靈活性。儲存的內容是基本型別的變數和物件的引用變數(地址)。當超過當超過變數的作用域後,Java會自動釋放掉該變數,記憶體空間可以立即被另作他用。

3、堆(Heap)

也為與RAM中,用於存放物件例項和陣列。在使用堆儲存時,能夠動態的分配記憶體空間,而不需要知道儲存的資料的生命週期。這種動態分配記憶體大小的代價是用堆進行儲存分配和清理時比用棧更花費時間。由Java虛擬機器的自動垃圾回收器來回收不再使用的資料。

4、其他記憶體區

Java虛擬機器中還有與垃圾收集器相關的記憶體區域,如方法區(method area)、常量區(constant pool)以及本地棧(method stack)。

此外JVM中的堆還包括三種空間: 1. 持久代(permanent generation):保留JVM存放類和方法的反射物件。 2. 舊生代(old generation):用來存放tenured的物件。 3. 新生代(young generation):用來存放新建的物件和aged物件。新生代包括eden和兩個survivor space。eden用來存放新建立的物件,survivor space用來存放還沒有tenured的物件