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

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

Java虛擬機(jī)內(nèi)存管理

為了更好的理解上面的程序,先來看看java虛擬機(jī)是如何管理它的內(nèi)存的,請(qǐng)看下圖:

java虛擬機(jī)內(nèi)存管理

圖9-2:java虛擬機(jī)內(nèi)存管理

● 程序計(jì)數(shù)器:

概念:可以看做當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器。

特點(diǎn):線程私有的內(nèi)存

● java虛擬機(jī)棧(重點(diǎn)):

概念:描述的是java方法執(zhí)行的內(nèi)存模型。(每個(gè)方法在執(zhí)行的時(shí)候會(huì)創(chuàng)建一個(gè)棧幀,用于存儲(chǔ)局部變量表,操作數(shù)棧,動(dòng)態(tài)鏈接,方法出口等信息。每個(gè)方法從調(diào)用直至完成的過程,就對(duì)應(yīng)一個(gè)棧幀從入棧到出棧的過程。)

特點(diǎn):線程私有,生命周期和線程相同。這個(gè)區(qū)域會(huì)出現(xiàn)兩種異常:StackOverflowError異常:若線程請(qǐng)求的深度大于虛擬機(jī)所允許的深度。OutOfMemoryError異常:若虛擬機(jī)可以動(dòng)態(tài)擴(kuò)展,如果擴(kuò)展是無法申請(qǐng)到足夠的內(nèi)存。

● 本地方法棧:

概念:它與虛擬機(jī)棧所發(fā)揮的作用是相似的,區(qū)別是java虛擬機(jī)棧為執(zhí)行java方法服務(wù),而本地方法棧是為本地方法服務(wù)。

特點(diǎn):線程私有,也會(huì)拋出兩類異常:StackOverflowError和OutOfMemoryError。

● java堆(重點(diǎn)):

概念:是被所有線程共享的一塊區(qū)域,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建。

特點(diǎn):線程共享,存放的是對(duì)象實(shí)例(所有的對(duì)象實(shí)例和數(shù)組),GC管

理的主要區(qū)域。可以處于物理上不連續(xù)的內(nèi)存空間。

● 方法區(qū)(重點(diǎn)):

概念:存儲(chǔ)已被虛擬機(jī)加載的類信息、常量、靜態(tài)變量,即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。

特點(diǎn):線程共享的區(qū)域,拋出異常OutOfMemory異常:當(dāng)方法區(qū)無法滿足內(nèi)存分配需求的時(shí)候。

以上所描述內(nèi)容,有看得懂的,也有看不懂的,例如:線程、本地方法等,這個(gè)需要大家在學(xué)習(xí)后面內(nèi)容之后,返回來再看一看,那個(gè)時(shí)候你就全部明白了。針對(duì)于目前來說,大家必須要知道java虛擬機(jī)有三塊主要的內(nèi)存空間,分別是“虛擬機(jī)棧(后面簡(jiǎn)稱棧)”、“方法區(qū)”、“堆區(qū)”,方法區(qū)存儲(chǔ)類的信息,棧中存儲(chǔ)方法執(zhí)行時(shí)的棧幀以及局部變量,堆區(qū)中主要存儲(chǔ)new出來的對(duì)象,以及對(duì)象內(nèi)部的實(shí)例變量。其中垃圾回收器主要針對(duì)的是堆內(nèi)存,方法區(qū)中最先有數(shù)據(jù),因?yàn)槌绦驁?zhí)行之前會(huì)先進(jìn)行類加載。棧內(nèi)存活動(dòng)最頻繁,因?yàn)榉椒ú粩嗟膱?zhí)行并結(jié)束,不斷的進(jìn)行壓棧彈棧操作。將目前階段需要掌握的內(nèi)存空間使用一張簡(jiǎn)單的圖表示出來,這個(gè)圖是大家需要掌握的:

java虛擬機(jī)內(nèi)存管理

圖9-3:java虛擬機(jī)內(nèi)存管理簡(jiǎn)圖

大概了解了java虛擬機(jī)內(nèi)存分配之后,來看看以下代碼在執(zhí)行過程中,內(nèi)存是如何變化的:

public class StudentTest {
	public static void main(String[] args) {
		int i = 10;
		Student s1 = new Student();
	}
}

以上代碼在執(zhí)行過程中內(nèi)存的變化如下圖所示:

Java虛擬機(jī)內(nèi)存管理

圖9-4:第一步進(jìn)行類加載

Java編程

圖9-5:第二步main方法調(diào)用,給main方法分配棧幀(壓棧)

Java技術(shù)架構(gòu)

圖9-6:第三步執(zhí)行int i = 10,局部變量

Java技術(shù)架構(gòu)

圖9-7:第四步執(zhí)行new Student(),在堆中創(chuàng)建對(duì)象,同時(shí)初始化實(shí)例變量

Java編程

圖9-8:第五步將堆區(qū)中學(xué)生對(duì)象的內(nèi)存地址賦值給局部變量s1

注意:上圖所描述內(nèi)存圖有些地方為了幫助大家更好的理解,有些位置畫的不是很精確,隨著后面內(nèi)容的學(xué)習(xí)我們?cè)龠M(jìn)一步修改,目前上圖已經(jīng)夠大家用了。

上圖中i變量和s1變量都是局部變量,都在棧內(nèi)存當(dāng)中,只不過i變量是基本數(shù)據(jù)類型int,而s1變量是引用數(shù)據(jù)類型Student。

上圖中堆區(qū)當(dāng)中的稱為“對(duì)象”,該“對(duì)象”內(nèi)部no、name、age、sex都是實(shí)例變量/屬性,這些變量在new對(duì)象的時(shí)候初始化,如果沒有手動(dòng)賦值,系統(tǒng)會(huì)賦默認(rèn)值。

上圖堆區(qū)中“對(duì)象”創(chuàng)建完成之后,該對(duì)象在堆區(qū)當(dāng)中的內(nèi)存地址是:0x1111,程序中的“=”將0x1111這個(gè)堆內(nèi)存地址賦值給s1變量,也就是說s1變量保存了堆內(nèi)存對(duì)象的內(nèi)存地址,我們對(duì)于這種變量有一種特殊的稱呼,叫做“引用”。也就是說對(duì)于Student s1 = new Student()代碼來說,s1不是對(duì)象,是一個(gè)引用,對(duì)象實(shí)際上是在堆區(qū)當(dāng)中,s1變量持有這個(gè)對(duì)象的內(nèi)存地址。

java中沒有指針的概念(指針是C語(yǔ)言當(dāng)中的機(jī)制),所以java程序員沒有權(quán)利直接操作堆內(nèi)存,只能通過“引用”去訪問堆內(nèi)存中的對(duì)象,例如:s1.no、s1.name、s1.sex、s1.age。訪問一個(gè)對(duì)象的內(nèi)存,其實(shí)就是訪問該對(duì)象的實(shí)例變量,而訪問實(shí)例變量通常包括兩種形式,要么就是讀取數(shù)據(jù),要么就是修改數(shù)據(jù),例如:System.out.println(s1.no)這就是讀取數(shù)據(jù),s1.no = 100這就是修改數(shù)據(jù)。請(qǐng)看以下代碼:

public class StudentTest {
	public static void main(String[] args) {
		int i = 10;
		Student s1 = new Student();
		s1.no = 100;
		s1.name = "zhangsan";
		s1.sex = true;
		s1.age = 20;
		System.out.println("學(xué)號(hào) = " + s1.no);
		System.out.println("姓名 = " + s1.name);
		System.out.println("性別 = " + s1.sex);
		System.out.println("年齡 = " + s1.age);
}
}

運(yùn)行結(jié)果如下所示:

Java應(yīng)用

圖9-9:修改實(shí)例變量之后的執(zhí)行結(jié)果

執(zhí)行了以上程序之后,堆內(nèi)存對(duì)象的實(shí)例變量發(fā)生了變化,如下圖所示:

圖9-10:實(shí)例變量執(zhí)行賦值運(yùn)算之后的內(nèi)存圖

如果基于以上的代碼再創(chuàng)建一個(gè)對(duì)象,內(nèi)存圖會(huì)是怎么的呢?先看代碼:

public class StudentTest {
	public static void main(String[] args) {
		int i = 10;
		Student s1 = new Student();
		Student s2 = new Student();
	}
}

JVM內(nèi)存結(jié)構(gòu)圖如下所示:

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

圖9-11:創(chuàng)建多個(gè)對(duì)象的內(nèi)存結(jié)構(gòu)圖

通過上圖的學(xué)習(xí),可以看出假設(shè)new出100個(gè)學(xué)生對(duì)象,會(huì)有100個(gè)no,100個(gè)age...是這樣吧。

通過以上內(nèi)容的學(xué)習(xí),需要每位同學(xué)掌握:局部變量存儲(chǔ)在哪里?實(shí)例變量存儲(chǔ)在哪里?實(shí)例變量在什么時(shí)候初始化?對(duì)象和引用有什么區(qū)別?在java中怎么訪問堆內(nèi)存當(dāng)中的對(duì)象?這些你都掌握了嗎。

主站蜘蛛池模板: 青青青免费在线视频 | 国产成人综合欧美精品久久 | 九九视频在线观看视频6偷拍 | 一级毛片中文字幕 | 亚洲美女在线观看播放 | 四虎影视永久在线精品免费 | 欧美高清视频www夜色资源网 | 国产精品午夜高清在线观看 | 国产1区2区三区不卡 | 欧美一区二区高清 | 成年女人aaaaa毛片 | 成人亚洲 | 国产一国产一级毛片视频在线 | 伊人a.v在线| 国内精品小视频在线 | 欧美综合久久 | 久久欧美精品欧美九久欧美 | 人人乳乳香蕉大免费 | 四虎永久在线精品视频播放 | 美女色影院 | 久久中文娱乐网 | 国产香蕉精品视频 | 日本高清一道本 | 色综合久久久久久久 | 亚洲综合网在线 | 97人人视频 | 四虎成人免费视频 | 久久精品国产免费 | 91正在播放极品白嫩在线观看 | 久久鸭综合久久国产 | 国产成人久久一区二区三区 | 特级毛片在线大全免费播放 | 日韩精品一区二区三区高清 | 日韩三级一区二区 | 成人毛片网| 久久综合九色综合97_ 久久久 | 成人欧美精品久久久久影院 | 午夜精品久久久久久久四虎 | 欧美成a| 亚洲激情网站 | 成人三级视频在线观看 |