1. 程式人生 > 其它 >溫故而知新之串列埠usart

溫故而知新之串列埠usart

程式計數器:

  是當前執行緒所執行的位元組碼的行號指示器,每條執行緒都要有一個獨立的程式計數器,這類記憶體也稱為“執行緒私有”的記憶體。正在執行java方法的話,計數器記錄的是虛擬機器位元組碼指令的地址(當前指令的地址)。如果還是Native方法,則為空。這個記憶體區域是唯一一個在虛擬機器中沒有規定任何OutOfMemoryError情況的區域。

虛擬機器棧:

  是描述java方法執行的記憶體模型,每個方法在執行的同時都會建立一個棧幀(Stack Frame)用於儲存區域性變量表、運算元棧、動態連結、方法出口等資訊。每一個方法從呼叫直至執行完成的過程,就對應著一個棧幀在虛擬機器棧中入棧到出棧的過程。
  棧幀( Frame)是用來儲存資料和部分過程結果的資料結構,同時也被用來處理動態連結 (Dynamic Linking)、 方法返回值和異常分派( Dispatch Exception)。

堆:

  建立的物件和陣列都儲存在Java堆記憶體中,也是垃圾收集器進行垃圾收集的最重要的記憶體區域。由於現代VM採用分代收集演算法, 因此Java堆從GC的角度還可以細分為: 新生代(Eden區、From Survivor區和To Survivor區)和老年代。

本地方法棧:

  本地方法區和Java Stack作用類似, 區別是虛擬機器棧為執行Java方法服務, 而本地方法棧則為Native方法服務, 如果一個VM實現使用C-linkage模型來支援Native呼叫, 那麼該棧將會是一個C棧,但HotSpot VM直接就把本地方法棧和虛擬機器棧合二為。

方法區/永久代:

  用於儲存被JVM載入的類資訊、常量、靜態變數、即時編譯器編譯後的程式碼等資料.執行時常量池(Runtime Constant Pool)是方法區的一部分。Class檔案中除了有類的版本、欄位、方法、介面等描述等資訊外,還有一項資訊是常量池(Constant Pool Table),用於存放編譯期生成的各種字面量和符號引用,這部分內容將在類載入後存放到方法區的執行時常量池中。

  永久儲存區域,主要存放Class和Meta(元資料)的資訊,Class在被載入的時候被放入永久區域,它和和存放例項的區域不同,GC不會在主程式執行期對永久區域進行清理。所以這也導致了永久代的區域會隨著載入的Class的增多而脹滿,最終丟擲OOM異常。

1.8改為元空間的本質和永久代類似,元空間與永久代之間最大的區別在於:元空間並不在虛擬機器中,而是使用本地記憶體。因此,預設情況下,元空間的大小僅受本地記憶體限制。類的元資料放入 native memory, 字串池和類的靜態變數放入java堆中,這樣可以載入多少類的元資料就不再由MaxPermSize控制, 而由系統的實際可用空間來控制。