1. 程式人生 > >4.3-全棧Java筆記:面向對象的內存分析

4.3-全棧Java筆記:面向對象的內存分析

java

面向對象的內存分析

為了讓大家對於面向對象編程有更深入的了解,我們要對程序的執行過程中,內存到底發生了什麽變化,進行剖析,讓大家做到心中有數,通過更加形象的方式理解程序的執行方式。

老鳥建議:

本節是為了讓初學者更深入了解程序底層執行情況,為了完整的體現內存分析流程,會有些新的名詞,比如:線程、Class對象。大家暫時可以不求甚解的了解,後期學了這兩個概念再回頭來看我們這篇內存分析,肯定收獲會更大。

Java虛擬機的內存可以分為三個區域:棧stack、堆heap、方法區method area

棧的特點如下

1. 棧描述的是方法執行的內存模型。每個方法被調用都會創建一個棧幀(存儲局部變量、操作數、方法出口等)

2. JVM為每個線程創建一個棧,用於存放該線程執行方法的信息(實際參數、局部變量等)

3. 棧屬於線程私有,不能實現線程間的共享!

4. 棧的存儲特性是“先進後出,後進先出”

5. 棧是由系統自動分配,速度快!棧是一個連續的內存空間!

堆的特點如下

1. 堆用於存儲創建好的對象和數組(數組也是對象)

2. JVM只有一個堆,被所有線程共享

3. 堆是一個不連續的內存空間,分配靈活,速度慢!

方法區(又叫靜態區)特點如下

1. JVM只有一個方法區,被所有線程共享!

2. 方法區實際也是堆,只是用於存儲類、常量相關的信息!

3. 用來存放程序中永遠是不變或唯一的內容。(類信息【Class對象】、靜態變量、字符串常量等)

內存分析圖(4.2章節中示例2)

對象的使用及內存分析

【示例1】編寫Person

public class Person{

String name;

int age;

public void setAge(int age){

this.age=age;

}

}

【示例2】創建Person類的對象並使用

public static void main(String [] args){

//必須使用new關鍵字創建對象

Person person=new Person();

//使用對象(引用).成員變量來引用對象的成員變量

person.age=24;

//使用對象(引用).方法(參數列表)來調用對象的方法

person.setAge(23);

}

【示例3】創建Person類對象的提升

public static void main(String [] args){

//創建p1對象

Person p1=new Person();

p1.age=24;

p1.name="張三";

p1.show();

//創建p2對象

Person p2=new Person();

p2.age=35;

p2.name="李四";

p2.show();

}

示例3 運行效果圖

示例3 內存分析圖


內存分析圖可以得出如下結論:

· 同一類的每個對象有不同的成員變量存儲空間。

· 同一類的每個對象共享該類的方法。




「全棧Java筆記」是一部能幫大家從零到一成長為全棧Java工程師系列筆記。筆者江湖人稱 Mr. G,10年Java研發經驗,曾在神州數碼、航天院某所研發中心從事軟件設計及研發工作,從小白逐漸做到工程師、高級工程師、架構師。精通Java平臺軟件開發,精通JAVAEE,熟悉各種流行開發框架。


筆記包含從淺入深的六大部分:

A-Java入門階段

B-數據庫從入門到精通

C-手刃移動前端和Web前端

D-J2EE從了解到實戰

E-Java高級框架精解

F-Linux和Hadoop




本文出自 “12931675” 博客,請務必保留此出處http://12941675.blog.51cto.com/12931675/1942376

4.3-全棧Java筆記:面向對象的內存分析