天天看點

Java虛拟機之記憶體區域概述

Java虛拟機在執行Java程式的過程中會把他所管理的記憶體區域劃分為若幹個不同的資料區域,這些區域有各自的用途,以及建立和銷毀時間。

Java虛拟機之記憶體區域概述

1. 程式計數器

程式計數器是一塊較小的記憶體空間,他是目前線程程式所執行的位元組碼行号訓示器。位元組碼解釋器工作時就是通過改變這個計數器的值來選取下一條需要執行的位元組碼指令,分支、循環、跳轉、異常處理、線程等基礎功能都需要依賴這個計數器來完成。

Java虛拟機的多線程是通過線程輪換輪流切換配置設定處理器執行時間的方式來實作的。為了線程切換後能恢複到正确的執行位置,每條線程都需要一個獨立的程式計時器,各條線程之間計數器互不影響,獨立存儲,這類的記憶體區域為“線程私有的記憶體”。

2. Java虛拟機棧

與程式計數器一樣,Java虛拟機棧也是線程私有的,他的生命周期與線程相同。虛拟機棧描述的是Java方法執行的記憶體模型,每個方法在執行的同時會建立一個棧幀(Stack Frame)用于存儲局部變量表、操作數棧、動态連結、方法出等資訊。每一個方法從調用直至執行完的完成過程,就對應一個棧幀在虛拟機中入棧到出棧的過程。

3. 本地方法棧

本地方法棧與虛拟機棧發揮的作用是非常相似的,差別:

Java虛拟機棧:為虛拟機執行Java方法(位元組碼)服務。

本地方法棧:為虛拟機使用到的Native方法服務。

4. Java堆

Java Heap是Java虛拟機所管理的記憶體區域中最大的一塊。被所有線程共享的一塊記憶體區域。此記憶體區域的唯一目的存放對象執行個體,幾乎所有的對象執行個體都是在這裡配置設定記憶體。

Java堆是垃圾收集器管理的主要區域,是以很多時候被稱為“GC堆”。

現在收集器基本都采用分代收集算法,是以Java堆可細分為:新生代和老年代;再可細分為 Eden空間、From Survivor和To Survivor空間。

5. 方法區

方法區也是各個線程共享的記憶體區域,它用于存儲已被加載的類資訊、常量、靜态變量、即時器編譯的代碼等資料。

6. 運作時常量池

運作時常量池(Constant Pool Table)是方法區的一部分。class檔案中除了有類的版本、字段方法、接口等資訊外,還有一項資訊常量池,用于存放編譯期生成的各種字面量和符号引用,這部分内容将在類加載後進入方法區的運作時常量池中存放。

7. 直接記憶體

直接記憶體(Direct Memory) 并不是虛拟機運作時資料區的一部分,也不是Java虛拟機規範中定義的記憶體區域。但是這部分記憶體也被頻繁地使用。

NIO(New Input/Output)類是一種基于通道(Channel)與緩沖區(Buffer)的I/O方式,它可以使用Native函數庫直接配置設定對外記憶體,然後通過存儲在Java堆中的DirectByteBuffer對象作為這塊記憶體的引用進行操作。

本機直接記憶體的配置設定不會受到Java堆的大小限制。

繼續閱讀