黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

Java教程
Java標識符與關鍵字
Java變量
Java數據類型
Java運算符
Java控制語句
Java方法
Java面向對象
Java對象的創建和使用
Java封裝
Java中static和this
Java繼承
Java方法覆蓋和多態
Java super
Java基礎練習題

Java方法執行過程中內存的變化

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

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

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

JVM內存結構圖

圖7-9:JVM內存結構圖

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

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

接下來我們來看一段代碼,同時畫出內存結構圖,以及使用文字描述該程序的內存變化:

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");
	}
}

運行結果如下圖所示:

方法執行過程中內存變化測試程序

圖7-10:方法執行過程中內存變化測試程序

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

方法執行過程中內存的變化

圖7-11:方法執行過程中內存的變化

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

● 類加載器將class文件加載到方法區。

● 開始調用main方法,在棧內存中給main方法分配空間,開始執行main方法,輸出”main begin”。

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

● 調用m2()方法,在棧內存中給m2()方法分配空間,m2()方法處于棧頂,具備活躍權,輸出”m2 begin”,繼續輸出”m2 over”。

● m2()方法執行結束,內存釋放,彈棧。

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

● m1()方法執行結束,內存釋放,彈棧。

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

● main()方法執行結束,內存釋放,彈棧。

● 棧空了,程序結束。

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

全部教程
主站蜘蛛池模板: 日韩免费在线观看 | 久久精品一区二区三区中文字幕 | 手机在线伦理片 | 欧美日韩免费在线观看 | 天天操天天谢 | 亚洲一欧洲中文字幕在线 | 欧美成人免费tv在线播放 | 日噜噜 | 99资源在线| 91情国产l精品国产亚洲区 | 污污视频在线播放 | 免费a一毛片 | 国产一级特黄高清免费大片 | xxx日本免费| 激情久久久久久久久久 | 国产在线视频你懂得 | 亚洲日本中文字幕 | 成人欧美视频在线看免费 | 免费在线日本 | 成人a视频高清在线观看 | 日韩在线观看视频网站 | 人人艹在线观看 | 国产欧美日韩网站 | 国产成人精品s8p视频 | 97色老99久久九九爱精品 | 波多野中文字幕s | 欧美 另类 精品一区视频 | 欧美日韩一区二区中文字幕视频 | 日韩中文字幕精品一区在线 | 亚洲视频在线免费播放 | 亚洲欧洲中文字幕 | 91麻豆精品一二三区在线 | 日本二三区 | 天天操天天碰 | 中文字幕 日韩在线 | 日本天堂免费观看 | 国产一区二区视频在线 | 日韩福利视频高清免费看 | 成人三级图片 | 亚洲最大的黄色网址 | 国产精品成人免费视频99 |