大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

Java教程
Java標識符與關(guān)鍵字
Java變量
Java數(shù)據(jù)類型
Java運算符
Java控制語句
Java方法

Java方法執(zhí)行過程中內(nèi)存的變化

以上內(nèi)容中講解了方法是什么,怎么定義,怎么調(diào)用,目前來說大家實際上掌握這些內(nèi)容就行了,接下來的內(nèi)容大家盡量去學,實在是掌握不了,也沒有關(guān)系,后期的內(nèi)容會對這一部分的知識點進行不斷的講解,慢慢的大家就會了,其實在學習編程的過程中會遇到很多這樣的情況,沒事,大家不要心急,學習后面內(nèi)容的過程中你會對前面的內(nèi)容豁然開朗。

以下要講解的是程序的內(nèi)存,例如:代碼片段被存儲在什么位置?方法調(diào)用的時候,在哪里開辟內(nèi)存空間等等。所以這一部分內(nèi)容還是很高端大氣上檔次的。不過話又說回來,要想真正掌握java,內(nèi)存的分析是必要的。一旦掌握內(nèi)存的分配,在程序沒有運行之前我們就可以很精準的預測到程序的執(zhí)行結(jié)果。

好了,接下來我們開始學習方法執(zhí)行過程中內(nèi)存是如何變化的?我們先來看一張圖片:

JVM內(nèi)存結(jié)構(gòu)圖

圖7-9:JVM內(nèi)存結(jié)構(gòu)圖

上圖是一張標準的java虛擬機內(nèi)存結(jié)構(gòu)圖,目前我們只看其中的“棧”和“方法區(qū)”,其它的后期研究,方法區(qū)中存儲類的信息,或者也可以理解為代碼片段,方法在執(zhí)行過程中需要的內(nèi)存空間在棧中分配。java程序開始執(zhí)行的時候先通過類加載器子系統(tǒng)找到硬盤上的字節(jié)碼(class)文件,然后將其加載到java虛擬機的方法區(qū)當中,開始調(diào)用main方法,main方法被調(diào)用的瞬間,會給main方法在“棧”內(nèi)存中分配所屬的活動空間,此時發(fā)生壓棧動作,main方法的活動空間處于棧底。

也就是說,方法只定義不去調(diào)用的話,只是把它的代碼片段存儲在方法區(qū)當中,java虛擬機是不會在棧內(nèi)存當中給該方法分配活動空間的,只有在調(diào)用的瞬間,java虛擬機才會在“棧內(nèi)存”當中給該方法分配活動空間,此時發(fā)生壓棧動作,直到這個方法執(zhí)行結(jié)束的時候,這個方法在棧內(nèi)存中所對應的活動空間就會釋放掉,此時發(fā)生彈棧動作。由于棧的特點是先進后出,所以最先調(diào)用的方法(最先壓棧)一定是最后結(jié)束的(最后彈棧)。比如:main方法最先被調(diào)用,那么它一定是最后一個結(jié)束的。換句話說:main方法結(jié)束了,程序也就結(jié)束了(目前來說是這樣)。

接下來我們來看一段代碼,同時畫出內(nèi)存結(jié)構(gòu)圖,以及使用文字描述該程序的內(nèi)存變化:

public class MethodTest {
	public static void main(String[] args) {
		System.out.println("main begin");
		m1();
		System.out.println("main over");
	}
	public static void m1() {
		System.out.println("m1 begin");
		m2();
		System.out.println("m1 over");
	}
	public static void m2() {
		System.out.println("m2 begin");
		System.out.println("m2 over");
	}
}

運行結(jié)果如下圖所示:

方法執(zhí)行過程中內(nèi)存變化測試程序

圖7-10:方法執(zhí)行過程中內(nèi)存變化測試程序

通過上圖的執(zhí)行結(jié)果我們了解到,main方法最先被調(diào)用,但是它是最后結(jié)束的,其中m2方法最后被調(diào)用,但它是最先結(jié)束的。大家別忘了調(diào)用的時候分配內(nèi)存是壓棧,結(jié)束的時候是釋放內(nèi)存彈棧哦。為什么會是上圖的結(jié)果呢,我們來看看它執(zhí)行的內(nèi)存變化,請看下圖:

方法執(zhí)行過程中內(nèi)存的變化

圖7-11:方法執(zhí)行過程中內(nèi)存的變化

通過上圖的分析,可以很快明白,為什么輸出結(jié)果是這樣的順序,接下來我們再采用文字的方式描述它的內(nèi)存變化:

● 類加載器將class文件加載到方法區(qū)。

● 開始調(diào)用main方法,在棧內(nèi)存中給main方法分配空間,開始執(zhí)行main方法,輸出”main begin”。

● 調(diào)用m1()方法,在棧內(nèi)存中給m1()方法分配空間,m1()方法處于棧頂,具備活躍權(quán),輸出”m1 begin”。

● 調(diào)用m2()方法,在棧內(nèi)存中給m2()方法分配空間,m2()方法處于棧頂,具備活躍權(quán),輸出”m2 begin”,繼續(xù)輸出”m2 over”。

● m2()方法執(zhí)行結(jié)束,內(nèi)存釋放,彈棧。

● m1()方法這時處于棧頂,具備活躍權(quán),輸出”m1 over”。

● m1()方法執(zhí)行結(jié)束,內(nèi)存釋放,彈棧。

● main()方法這時處于棧頂,具備活躍權(quán),輸出”main over”。

● main()方法執(zhí)行結(jié)束,內(nèi)存釋放,彈棧。

● ??樟?,程序結(jié)束。

大家是否還記得之前的課程中曾經(jīng)提到方法體當中的代碼是有執(zhí)行順序的,必須遵循自上而下的順序依次逐行執(zhí)行,當前行代碼必須執(zhí)行結(jié)束之后,下一行代碼才能執(zhí)行,不能跳行執(zhí)行,還記得嗎?現(xiàn)在再和棧數(shù)據(jù)結(jié)構(gòu)一起聯(lián)系起來思考一下,為什么要采用棧數(shù)據(jù)結(jié)構(gòu)呢?是不是只有采用這種先進后出的棧數(shù)據(jù)結(jié)構(gòu)才可以保證代碼的執(zhí)行順序呢!此時,你是不是感覺程序的設(shè)計者在此處設(shè)計的非常巧妙呢!

主站蜘蛛池模板: 综合久色 | 久久99久久精品国产只有 | 中文字幕免费视频精品一 | 奇米777888| 99精品在线免费观看 | 手机看片99 | 国产99视频精品免费视频免里 | 久久国产片 | 中文字幕一区二区三区在线观看 | 日韩免费福利视频 | 九九精品99 | 亚洲欧美日韩在线中文一 | 在线观看视频91 | 国产免费专区 | 亚洲性夜夜综合久久麻豆 | 亚洲国产日韩欧美综合久久 | 鲁丝丝国产一区二区 | 亚洲国产一区二区a毛片日本 | 久久久久久穴 | 黄色影院7755 | 日韩一级不卡 | 青草精品视频 | 久久频这里精品99香蕉久网址 | 色综合久久久久久久久久久 | 免费可以直接观看的毛片 | 九色福利视频 | 日韩一级黄色录像 | 人人揉揉香蕉大免费不卡 | 人成午夜欧美大片免费视频 | 三级不卡| 国产精品久久自在自线观看 | 四虎地址8848在线观看 | 日韩免费高清 | 在线观看免费亚洲 | 亚洲精品久久 | 欧美激情精品久久久久久久九九九 | 亚洲国产精品线观看不卡 | 高清一区二区三区 | 国产精品久久现线拍久青草 | 国产精品久久久久久影视 | 国产色综合天天综合网 |