面向對象的內存分析
為了讓大家對于面向對象編程有更深入的了解,我們要對程序的執(zhí)行過程中庆尘,內存到底發(fā)生了什么變化驶忌,進行剖析位岔,讓大家做到“心中有數”杨刨,通過更加形象的方式理解程序的執(zhí)行方式擦剑。
老鳥建議:????????
本節(jié)是為了讓初學者更深入了解程序底層執(zhí)行情況惠勒,為了完整的體現內存分析流程纠屋,會有些新的名詞售担,比如:線程族铆、Class對象。大家暫時可以不求甚解的了解,后期學了這兩個概念再回頭來看我們這篇內存分析逝淹,肯定收獲會更大箩做。
Java虛擬機的內存可以分為三個區(qū)域:棧stack、堆heap醉蚁、方法區(qū)method area网棍。
棧的特點如下
1.??棧描述的是方法執(zhí)行的內存模型氏身。每個方法被調用都會創(chuàng)建一個棧幀(存儲局部變量、操作數如贷、方法出口等)
2.??JVM為每個線程創(chuàng)建一個棧尚猿,用于存放該線程執(zhí)行方法的信息(實際參數凿掂、局部變量等)
3.??棧屬于線程私有庄萎,不能實現線程間的共享!
4.??棧的存儲特性是“先進后出脱羡,后進先出”
5.??棧是由系統(tǒng)自動分配,速度快脓规!棧是一個連續(xù)的內存空間侨舆!
堆的特點如下
1.??堆用于存儲創(chuàng)建好的對象和數組(數組也是對象)
2.??JVM只有一個堆,被所有線程共享
3.??堆是一個不連續(xù)的內存空間臭笆,分配靈活愁铺,速度慢茂洒!
方法區(qū)(又叫靜態(tài)區(qū))特點如下
1.??JVM只有一個方法區(qū)获黔,被所有線程共享!
2.??方法區(qū)實際也是堆,只是用于存儲類赞辩、常量相關的信息辨嗽!
3.??用來存放程序中永遠是不變或唯一的內容糟需。(類信息【Class對象】洲押、靜態(tài)變量、字符串常量等)
? ?內存分析圖(4.2章節(jié)中示例2)
對象的使用及內存分析
【示例1】編寫Person類
public class Person{
??? String name;
??? int age;
??? public void setAge(int age){
?????? this.age=age;
??? }
}
【示例2】創(chuàng)建Person類的對象并使用
public static void ? main(String [] args){
???????//必須使用new關鍵字創(chuàng)建對象
?????? Person person=new Person();
???????//使用對象(引用).成員變量來引用對象的成員變量
?????? person.age=24;
???????//使用對象(引用).方法(參數列表)來調用對象的方法
?????? person.setAge(23);
}
【示例3】創(chuàng)建Person類對象的提升
public static void ? main(String [] args){
??? ????//創(chuàng)建p1對象
?????? Person p1=new Person();
?????? p1.age=24;
?????? p1.name="張三";
?????? p1.show();
?????? //創(chuàng)建p2對象
?????? Person p2=new Person();
?????? p2.age=35;
?????? p2.name="李四";
?????? p2.show();
}
示例3?運行效果圖
?示例3?內存分析圖
內存分析圖可以得出如下結論:
??·?同一類的每個對象有不同的成員變量存儲空間回怜。
??·?同一類的每個對象共享該類的方法翔试。
「全棧Java筆記」是一部能幫大家從零到一成長為全棧Java工程師系列筆記。筆者江湖人稱 Mr. G,10年Java研發(fā)經驗怔球,曾在神州數碼竟坛、航天院某所研發(fā)中心從事軟件設計及研發(fā)工作,從小白逐漸做到工程師崭歧、高級工程師、架構師普泡。精通Java平臺軟件開發(fā)歧匈,精通JAVAEE,熟悉各種流行開發(fā)框架。
筆記包含從淺入深的六大部分:
A-Java入門階段
B-數據庫從入門到精通
C-手刃移動前端和Web前端
D-J2EE從了解到實戰(zhàn)
E-Java高級框架精解
F-Linux和Hadoop?