- 相關(guān)推薦
JAVA對象創(chuàng)造及內(nèi)存布局介紹
下面是百分網(wǎng)小編收集整理的關(guān)于JAVA對象創(chuàng)造及內(nèi)存布局介紹d的相關(guān)內(nèi)容,歡迎閱讀!
進程簡略介紹:
計算機對于內(nèi)存的分配是以進程為單位的,每個進程在邏輯上是隔離的,每個進程都認為自己是這臺電腦上的唯一程序,自己面對所有的內(nèi)存空間,(如,你的電腦有2G內(nèi)存,那么一個進程認為自己可以申請到2G的內(nèi)存空間)這種技術(shù)叫做進程隔離技術(shù),保證了系統(tǒng)不會因為一個進程的失敗,導(dǎo)致系統(tǒng)崩潰。一個進程可以向操作系統(tǒng)申請內(nèi)存,(操作系統(tǒng)是系統(tǒng)資源的調(diào)度者,進程要使用資源必須向操作系統(tǒng)打報告)進程申請到的內(nèi)存一般以兩種形式使用,一種是棧(stack)的形式,另一種是堆(heap)的形式。一個進程可以有多個棧,但只有一個堆。一個棧對應(yīng)一個線程(thread),一個進程至少需要一個線程,即至少有一個棧。
現(xiàn)在有一個student類,如下
class student{
String name;
int age;
void gotoSchool(){
System.out.print("Let's go to school !");
}
void eat(){
System.out.print("Let's go to eat !");
}
}
現(xiàn)在來創(chuàng)建一個學(xué)生對象 Student stu = new Student();
該語句實際是Student stu = new Student student()的縮寫版,只是人們發(fā)現(xiàn)那樣寫很累,于是就把兩個student合二為一了。
下面分析一下該語句是如何執(zhí)行的。 進程申請到內(nèi)存空間,按照兩種方式分配,有的內(nèi)存分配給棧,有的分配給堆。棧空間比較狹小,有大小限制,堆空間可以很大,大到和內(nèi)存的容量一致。編譯器是從左到右進行編譯的,程序也是如此執(zhí)行。
首先是碰到Student這樣一個符號(token),系統(tǒng)會馬上看下Student是什么東西,不久它發(fā)現(xiàn)那是一個類,然后把整個類的代碼加載(class loading)到內(nèi)存中。程序的代碼必須從磁盤上加載到內(nèi)存中才能執(zhí)行,其實cpu只跟內(nèi)存打交道。只是因為一斷電什么都沒了,所以后面才發(fā)明了硬盤,軟盤等。在堆中有一個代碼區(qū)(code area),用來存放Student類的代碼。因為棧的空間狹小,而類代碼可能很大,所以要把類代碼加載到堆中。
然后,遇到stu符號,即創(chuàng)建一個引用變量(或句柄),其數(shù)據(jù)類型是Student,因為Student類已經(jīng)加載了,所以系統(tǒng)也知道了stu是什么東西。因為引用變量指向一個地址(說白了就是保存地址的變量而已,相當于C語言中的指針),所占空間不大,所以把其創(chuàng)建在棧中即可。
接著從=右邊開始,先讀到new Student,即創(chuàng)建一個裸對象(naked object),或者說空白對象。因為類對象可能很大(如繼承),所以應(yīng)創(chuàng)建在堆中。這個裸對象主要保存自己的屬性,代碼區(qū)中的代碼只是指導(dǎo)如何去做,而真正申請內(nèi)存空間是在對象中。每個對象都有一個隱藏屬性,叫做代碼指針,指向?qū)ο笏幍念,每個對象只要保存自己個性化的特征就行了,這樣可以減少內(nèi)存的開銷,。方法可以共用,而屬性不可以,才能體現(xiàn)出個性化。就像你不想和別人共用一個名字一樣,但行為可以是一致的,可以一起上學(xué)、一起吃飯。每個對象還有另一個隱藏屬性,this指針,保存了本對象在內(nèi)存中的位置(俗稱為指向自己)。
ps:一個對象的大小只跟屬性的多少有關(guān),而和代碼的數(shù)量無關(guān)。屬性是主人,方法是仆人,為屬性服務(wù)。一個裸對象通過初始化,使其內(nèi)部的空白對象屬性獲得對應(yīng),體現(xiàn)出個性化,然后才能進入正式使用。就像人一樣,有名字、年齡、要上學(xué)等,從嬰兒到成人,其初 始化是一個漫長的過程。
再接著遇到student ( ),這是一個構(gòu)造方法(constructor),調(diào)用該方法為空白對象提供初始化服務(wù)。
ps:構(gòu)造方法地位重要,所以被特批能使用類名作為自己的名字,即與類同名。如果一個類沒有顯示書寫一個構(gòu)造方法,系統(tǒng)會自動為其添加一個,該方法是一個無參空實現(xiàn)的構(gòu)造方法。構(gòu)造方法不能有返回值,而不是沒有返回值(沒有即為void).
最后把創(chuàng)建完的對象的地址通過=賦值給stu,以后對對象的的操作,只要通引用變量stu就可以了。我們可以把stu想像成是一根套住對象的繩子,繩子的數(shù)據(jù)類型決定了該繩子能套住什么樣的對象。通過繩子對對象發(fā)號施令(就如我們用遙控器[引用]去操控電視機[對象]一樣),對象收到命令后會訪問其的代碼指針,找到代碼區(qū)中相應(yīng)的代碼并執(zhí)行,人只能和棧打交道,而棧再和堆打交道。
至此語句Student stu = new Student( )就執(zhí)行完了,接下去就是使用stu工作了。
ps:附件是對象創(chuàng)建內(nèi)存布局圖。
【JAVA對象創(chuàng)造及內(nèi)存布局介紹】相關(guān)文章:
Java的內(nèi)存模型11-28
Java內(nèi)存回收11-25
如何解決java內(nèi)存泄漏的問題03-03
java面向?qū)ο缶幊讨v解04-02
Java編程節(jié)省內(nèi)存的方法有哪些11-21
java序列化對象的技巧03-27
java對象持久化的使用技巧03-28