標籤:constant 數字 直接 複製 感受 計數 收集器 nat const
為方便後面學習的理解,記錄一下!
運行時資料區
1.線程共用
1.1方法區(Method Area)
1.1.1運行時常量池(Runtime Constant Pool)
1.2堆(Heap)
2.線程私人
2.1虛擬機器棧(VM Stack)
2.2本地方法棧(Native Method Stack)
2.3程式計數器(Program Counter Register)
3.直接記憶體(Direct Memory)
虛擬機器棧:
線程私人,生命週期與線程同步,用來執行Java方法。
每個java方法執行時都會建立一個棧幀,用來儲存局部變數表,運算元棧,動態連結,方法出口等資訊,方法執行過程即出棧和入棧的過程
程式計數器:
佔有著一小塊記憶體空間,是線程私人的,可以看作是程式啟動並執行行號指標,用來記錄當前線程運行時下一條需要執行的指令,在JAVA虛擬機器中,位元組碼解譯器工作時通過改變計數器的值來選取下一條需要執行位元組碼指令(可以理解為代碼,因為當執行的是Native方法時,計數器的值為空白,這個時候執行的不是Java代碼)。
多線程實質上是cpu在多個線程上不停的切換,給每個線程在一個時間段內都有一小塊已耗用時間,由於cpu切換太快,所以我們感受到的是多個線程在同時運行。程式計數器就是java虛擬機器為保證多線程的情況下cpu能準確地執行下一條指令而存在的。
本地方法棧:
和虛擬機器棧一樣,不過不同之處在於虛擬機器棧是為Java方法服務,而本地方法棧是為Native方法服務。
Java堆:
所有線程共用的一塊地區,目的是存放執行個體對象,因此Java堆也是垃圾收集器主要回收的地區。
方法區:
所有線程共用,用來存放已載入的類資訊、常量、靜態變數、即時編譯後的代碼等。
由於方法區中的資訊一般都是需要經常用到,因此也基本上不會被回收。
運行時常量池:
方法區用來存放常量的一塊地區,所謂常量也就是基本值,無法被改變的如一個數字,一段字串等,除了編譯期間產生的常量,運行期間產生的常量也會被儲存在裡面。
直接記憶體:
通常來說,java應用不會只是封閉在虛擬機器中,當需要與外界互動時必然是資料的交流,使用外部資料時外部的記憶體相對於虛擬機器來說就是Native堆,也就是直接記憶體,NIO(New Input/Out)類就是基於通道(Chanel)和緩衝(Buffer)的Io流,可以通過Native函數庫直接操作本地記憶體(Native堆),避免了在Java堆和Native堆中來回複製資料(這也是為什麼NIO流比IO流效率高的原因)。
Java虛擬機器學習--記錄運行時資料區域