Java運行流程
實際上當JVM將所需要的.class文件加載到JVM進程之中,那么這個過程就需要有一個類加載器(ClassLoader),有了類加載器的好處在于:可以隨意指定程序.class文件的所在路徑。
JVM:Java虛擬機,所有的程序都要求運行在JVM上,是因為考慮到了可移植性問題,可是如果要想真正去執行程序,你絕對不可能離開操作系統的支持。在Java里面可以使用native實現本地C函數的調用。但是這些都屬于程序運行的輔助手段,而真正的程序運行都在“運行時數據區”之中
運行時數據區
在整個的運行時數據區之中,分為如下幾塊內存空間:
堆內存:保存所有引用數據類型的真實信息;
棧內存:基本類型、運算、指向堆內存的指針;
-
方法區:所有定義的方法的信息都保存在方法區之中,此區屬于共享區;
- 程序計數器:
是一個非常小的內存空間,小的可以忽略;
- 本地方法棧:
每一次執行遞歸的方法處理的時候實際上都會將上一個方法入棧;
在整個Java之中存在有對象池的概念,對象池是對整個常量池的一個規則破壞,因為在JVM啟動的時候所有的常量都已經分配好內存空間了,但是String中的intern()方法卻可以打破這種限制,動態的進行常量池的內容設置
對象訪問模式
Java的引用類型是最為重要的數據處理模型,而整個的引用數據類型數據處理之中會牽扯到:堆內存、棧內存、方法區。
所以下面以一個最簡單的程序代碼為主:
“Object obj = new Object()”
實例化了一個Object類對象:
“Object obj”:描述的是保存在棧內存之中,而保存有堆內存的引用,這個數據會保存在本地變量表中;
“new Object()”:一個真正的對象,對象保存在堆內存之中。直觀的思路整個引用的操作:
新定義的對象的名稱保存在本地變量表,而后在這塊區域里面需要確定要與之對應的棧內存空間
通過變量表中的棧地址可以找到堆內存
利用堆內存的對象進行本地方法的調用(方法區)
對于所有引用數據類型的訪問實際上是存在有兩種模式的
-
通過句柄訪問
通過直接指針訪問
但是在Java之中它直接利用的是對象保存模式,也就是說堆內存里面不再需要保存句柄,而直接保存具體的對象。就相當于省略了句柄到對象間的查找。而后這個對象可以直接進行Java方法區的調用。
總結:引用數據類型在HotSpot中都是直接進行的引用處理,沒有句柄池的概念。