Java運(yùn)行流程
實(shí)際上當(dāng)JVM將所需要的.class文件加載到JVM進(jìn)程之中署恍,那么這個(gè)過程就需要有一個(gè)類加載器(ClassLoader)庞钢,有了類加載器的好處在于:可以隨意指定程序.class文件的所在路徑寸谜。
JVM:Java虛擬機(jī),所有的程序都要求運(yùn)行在JVM上,是因?yàn)榭紤]到了可移植性問題幌绍,可是如果要想真正去執(zhí)行程序修械,你絕對(duì)不可能離開操作系統(tǒng)的支持趾牧。在Java里面可以使用native實(shí)現(xiàn)本地C函數(shù)的調(diào)用。但是這些都屬于程序運(yùn)行的輔助手段肯污,而真正的程序運(yùn)行都在“運(yùn)行時(shí)數(shù)據(jù)區(qū)”之中
運(yùn)行時(shí)數(shù)據(jù)區(qū)
在整個(gè)的運(yùn)行時(shí)數(shù)據(jù)區(qū)之中翘单,分為如下幾塊內(nèi)存空間:
堆內(nèi)存:保存所有引用數(shù)據(jù)類型的真實(shí)信息;
棧內(nèi)存:基本類型蹦渣、運(yùn)算哄芜、指向堆內(nèi)存的指針;
-
方法區(qū):所有定義的方法的信息都保存在方法區(qū)之中柬唯,此區(qū)屬于共享區(qū)认臊;
- 程序計(jì)數(shù)器:
是一個(gè)非常小的內(nèi)存空間,小的可以忽略锄奢;
- 本地方法棧:
每一次執(zhí)行遞歸的方法處理的時(shí)候?qū)嶋H上都會(huì)將上一個(gè)方法入棧美尸;
在整個(gè)Java之中存在有對(duì)象池的概念,對(duì)象池是對(duì)整個(gè)常量池的一個(gè)規(guī)則破壞斟薇,因?yàn)樵贘VM啟動(dòng)的時(shí)候所有的常量都已經(jīng)分配好內(nèi)存空間了师坎,但是String中的intern()方法卻可以打破這種限制,動(dòng)態(tài)的進(jìn)行常量池的內(nèi)容設(shè)置
對(duì)象訪問模式
Java的引用類型是最為重要的數(shù)據(jù)處理模型堪滨,而整個(gè)的引用數(shù)據(jù)類型數(shù)據(jù)處理之中會(huì)牽扯到:堆內(nèi)存胯陋、棧內(nèi)存、方法區(qū)。
所以下面以一個(gè)最簡(jiǎn)單的程序代碼為主:
“Object obj = new Object()”
實(shí)例化了一個(gè)Object類對(duì)象:
“Object obj”:描述的是保存在棧內(nèi)存之中遏乔,而保存有堆內(nèi)存的引用义矛,這個(gè)數(shù)據(jù)會(huì)保存在本地變量表中;
“new Object()”:一個(gè)真正的對(duì)象盟萨,對(duì)象保存在堆內(nèi)存之中凉翻。直觀的思路整個(gè)引用的操作:
新定義的對(duì)象的名稱保存在本地變量表,而后在這塊區(qū)域里面需要確定要與之對(duì)應(yīng)的棧內(nèi)存空間
通過變量表中的棧地址可以找到堆內(nèi)存
利用堆內(nèi)存的對(duì)象進(jìn)行本地方法的調(diào)用(方法區(qū))
對(duì)于所有引用數(shù)據(jù)類型的訪問實(shí)際上是存在有兩種模式的
-
通過句柄訪問
通過直接指針訪問
但是在Java之中它直接利用的是對(duì)象保存模式捻激,也就是說堆內(nèi)存里面不再需要保存句柄制轰,而直接保存具體的對(duì)象。就相當(dāng)于省略了句柄到對(duì)象間的查找胞谭。而后這個(gè)對(duì)象可以直接進(jìn)行Java方法區(qū)的調(diào)用垃杖。
總結(jié):引用數(shù)據(jù)類型在HotSpot中都是直接進(jìn)行的引用處理,沒有句柄池的概念丈屹。