內(nèi)存:
內(nèi)存是計(jì)算機(jī)中的重要原件砾医,臨時(shí)存儲(chǔ)區(qū)域,作用是運(yùn)行程序衣厘。我們編寫的程序是存放在硬盤中的如蚜,在硬盤中的程序是不會(huì)運(yùn)行的压恒,必須放進(jìn)內(nèi)存中才能運(yùn)行,運(yùn)行完畢后會(huì)清空內(nèi)存错邦。
Java:
Java虛擬機(jī)要運(yùn)行程序探赫,必須要對內(nèi)存進(jìn)行空間的分配和管理。
為了提高運(yùn)算效率撬呢,就對空間進(jìn)行了不同區(qū)域的劃分伦吠,因?yàn)槊恳黄瑓^(qū)域都有特定的處理數(shù)據(jù)方式和內(nèi)存管理方式。
JVM的內(nèi)存劃分:
一個(gè)對象倾芝,調(diào)用一個(gè)方法內(nèi)存圖
通過上圖讨勤,我們可以理解,在棧內(nèi)存中運(yùn)行的方法晨另,遵循"先進(jìn)后出,后進(jìn)先出"的原則谱姓。變量p指向堆內(nèi)存中的空間借尿,尋找方法信息,去執(zhí)行該方法屉来。
但是路翻,這里依然有問題存在。創(chuàng)建多個(gè)對象時(shí)茄靠,如果每個(gè)對象內(nèi)部都保存一份方法信息茂契,這就非常浪費(fèi)內(nèi)存了,因?yàn)樗袑ο蟮姆椒ㄐ畔⒍际且粯拥目D敲慈绾谓鉀Q這個(gè)問題呢掉冶?請看如下圖解
兩個(gè)對象,調(diào)用同一方法內(nèi)存圖
對象調(diào)用方法時(shí)脐雪,根據(jù)對象中方法標(biāo)記(地址值)厌小,去類中尋找方法信息。這樣哪怕是多個(gè)對象战秋,方法信息只保存一份璧亚,節(jié)約內(nèi)存空間。
一個(gè)引用脂信,作為參數(shù)傳遞到方法中內(nèi)存圖
引用類型作為參數(shù)癣蟋,傳遞的是地址值。
PHP:
內(nèi)存從邏輯上說大體上是分為4 段狰闪,椃杞粒空間段、堆空間段尝哆、代碼段秉撇、初始化靜態(tài)段,程序里面不同的聲明放在不同的內(nèi)存段里面。
數(shù)據(jù)段(data segment)通常是指用來存放程序中已初始化且不為0的全局變量如:靜態(tài)變量和常量琐馆;
代碼段(code segment / text segment)通常是指用來存放程序執(zhí)行代碼的一塊內(nèi)存區(qū)域规阀,比如函數(shù)和方法;
検蒴铮空間段是存儲(chǔ)占用相同空間長度并且占用空間小的數(shù)據(jù)類型的地方谁撼,比如說整型1,10滋饲,100厉碟,1000,10000屠缭,100000 等等箍鼓,在內(nèi)存里面占用空間是等長的,都是64 位4 個(gè)字節(jié)呵曹。
堆內(nèi)存款咖,數(shù)據(jù)長度不定長,而且占有空間很大的數(shù)據(jù)類型的數(shù)據(jù)奄喂。如下圖:
棧內(nèi)存是可以直接存取的铐殃,而堆內(nèi)存不可以直接存取。
對于我們的對象來說就是一種大的數(shù)據(jù)類型而且是占用空間不定長的類型跨新,所以說對象是放在堆里面的富腊,但對象名稱是放在棧里面的,這樣通過對象名稱就可以使用對象了域帐。
一個(gè)類可以實(shí)例出多個(gè)對象赘被,每個(gè)對象都是獨(dú)立的,
實(shí)例出來3 個(gè)人來俯树,每個(gè)人之間是沒有聯(lián)系的帘腹,只能說明他們都是人類,每個(gè)人都有自己的姓名许饿,性別和年齡的屬性阳欲,每個(gè)人都有說話和走路的方法,只要是類里面體現(xiàn)出來的成員屬性和成員方法陋率,實(shí)例化出來的對象里面就包含了這些屬性和方法球化。
$p1=new Person(); $p2=new Person(); $p3=new Person();
對于這個(gè)條代碼,$p1 是對象名稱在棧內(nèi)存里面new Person()是真正的對象是在堆內(nèi)存 里面的瓦糟,具體的請看下圖:
從上圖可以看出$p1=new Person();等號右邊是真正的對象實(shí)例筒愚,在堆內(nèi)存里面的實(shí)體,?
上圖一共有3 次new Person()菩浙,所以會(huì)在堆里面開辟3 個(gè)空間巢掺,產(chǎn)生3 個(gè)實(shí)例對象句伶,每個(gè)對象之間都是相互獨(dú)立的,使用自己的空間陆淀,
在PHP 里面考余,只要有一個(gè)new 這個(gè)關(guān)鍵字出現(xiàn)就會(huì) 實(shí)例化出來一個(gè)對象,在堆里面開辟一塊自己的空間轧苫。?
每個(gè)在堆里面的實(shí)例對象是存儲(chǔ)屬性的楚堤,比如說,現(xiàn)在堆里面的實(shí)例對象里面都存有姓名含懊、性別和年齡身冬。每個(gè)屬性又都有一個(gè)地址。?
$p1=new Person();等號的右邊$p1 是一個(gè)引用變量岔乔,通過賦值運(yùn)算符“=”把對象的首地址 賦給“$p1”這個(gè)引用變量酥筝,所以$p1 是存儲(chǔ)對象首地址的變量,$p1 放在棧內(nèi)存里邊重罪,$p1 相當(dāng) 于一個(gè)指針指向堆里面的對象樱哼,所以我們可以通過$p1 這個(gè)引用變量來操作對象,通常我們也 稱對象引用為對象。