Java面向?qū)ο蠛蛢?nèi)存分析圖文詳解
一、Java類
類是面向?qū)ο缶幊讨凶罨镜膯挝弧?/p>
Java中的類包含三個(gè)內(nèi)容,分別是:
屬性
- 屬性又叫成員變量。
- 屬性用于定義類或類對(duì)象的數(shù)據(jù)(靜態(tài)特征)。
- 范圍為整個(gè)類體。
方法
- 方法用于定義類或類對(duì)象的行為特征(執(zhí)行動(dòng)作)(動(dòng)態(tài))。
- 方法類似于面向過(guò)程中的函數(shù),面向過(guò)程中的函數(shù)是最基本的單位;
- 而在面向?qū)ο笾?,最基本單位是類,方法從屬于類和?duì)象。
構(gòu)造方法
- 構(gòu)造方法分為無(wú)參構(gòu)造方法;有參構(gòu)造方法。
- 構(gòu)造方法要與類名保持一致。
- 如果不設(shè)置構(gòu)造方法,則系統(tǒng)自動(dòng)生成無(wú)參構(gòu)造方法。
屬性的定義格式:
[修飾符] 屬性類型 屬性名 = [默認(rèn)值]; //若不初始化則系統(tǒng)默認(rèn)給默認(rèn)值
方法定義格式:
[修飾符] 方法返回值類型 方法名(形參){
語(yǔ)句
}
有如下代碼進(jìn)行示例分析
public class Person{
public String name; //屬性,帶有修飾符
int age;
public void show(){ //方法
System.out.println("姓名:"+name+",年齡:"+age);
}
/*
Person(){ //構(gòu)造方法,手動(dòng),無(wú)參構(gòu)造方法,一個(gè)類里無(wú)參構(gòu)造方法只能有一個(gè)
}
*/
/*
Person(String name, int age){ //手動(dòng),有參構(gòu)造方法。
this.name = name;
this.age = age;
}
*/
public static void main (String[] args){
Person p1 = new Person("李四",18); //此時(shí)調(diào)用的是上面手動(dòng)有參的構(gòu)造方法
Person p2 = new Person(); //此時(shí)調(diào)用的是無(wú)參構(gòu)造方法
p2.name = "張三"; //無(wú)參構(gòu)造方法需要以下賦值
p2.age = 18;
p2.show();
}
}
二、內(nèi)存分析
上面介紹了類的基本知識(shí),那么我們接下來(lái)根據(jù)上面的代碼來(lái)進(jìn)行內(nèi)存分析。
JVM內(nèi)存模型很復(fù)雜,為了更好的理解面向?qū)ο蠛兔嫦驅(qū)ο蟠a,下面進(jìn)行對(duì)模型的簡(jiǎn)化。(此內(nèi)存分析并不是為了理解JVM內(nèi)存模型)

下面對(duì)上面三個(gè)內(nèi)存模型進(jìn)行特征介紹:
棧:
- 棧描述的是方法執(zhí)行的內(nèi)存模型,每個(gè)方法被調(diào)用時(shí)都會(huì)創(chuàng)建一個(gè)棧幀。
- JVM為每個(gè)線程創(chuàng)建一個(gè)棧。
- 棧是私有,在線程間不會(huì)共享。
- 棧是一段連續(xù)的存儲(chǔ)空間。
堆:
- 堆用于存儲(chǔ)創(chuàng)建好的對(duì)象。
- JVM只有一個(gè)堆。
- 堆被所有線程共享。
- 堆是不連續(xù)的空間,分配靈活。
方法區(qū):
- 方法區(qū)實(shí)際也是堆,用來(lái)專門(mén)存儲(chǔ)類、常量(static關(guān)鍵詞相關(guān))等相關(guān)信息。
- JVM只有一個(gè)方法區(qū)。
- 可共享。
- 存儲(chǔ)不變的信息。
下面我們來(lái)看代碼的運(yùn)行過(guò)程:
程序均是將main方法作為程序的入口,執(zhí)行第二條語(yǔ)句(第一條先忽略)
Person p2 = new Person();
此時(shí)會(huì)在棧中開(kāi)辟一個(gè)新的棧幀,為main方法棧幀;方法區(qū)會(huì)加載整個(gè)類模板,存儲(chǔ)類里面的相關(guān)信息;在堆處會(huì)產(chǎn)生一個(gè)新的類的對(duì)象。如圖

/*
小插曲:Java使用new關(guān)鍵字來(lái)調(diào)用構(gòu)造方法,從而返回該類的實(shí)例(對(duì)象)。但是這個(gè)對(duì)象不是完全由構(gòu)造方法來(lái)創(chuàng)建的。創(chuàng)建一個(gè)方法分4步:在堆中分配對(duì)象空間,并將對(duì)象的成員變量初始化默認(rèn)值執(zhí)行顯式初始化(比如int i = 3)執(zhí)行構(gòu)造方法返回對(duì)象地址
*/
當(dāng)Person()構(gòu)造方法調(diào)用完成后,出棧繼續(xù)執(zhí)行main中的下一條語(yǔ)句。如圖

下一條語(yǔ)句是
p2.name = "張三"; p2.age = 18;
此時(shí)是方法區(qū)的張三賦值給name;

我們繼續(xù)執(zhí)行下條語(yǔ)句
p2.show();

此時(shí)會(huì)執(zhí)行show方法,我們注意到show方法中有age和name。那么它們是誰(shuí)的name和age呢?我們可以看是p2.show()。p2的地址是0x11,指向的是堆中的0x11對(duì)象,所以show方法中的name和age就已知了。
那么當(dāng)方法執(zhí)行完后,show方法出棧,同時(shí)main方法也執(zhí)行完畢,也需要出棧,main方法執(zhí)行完后,對(duì)象和方法區(qū)中的類信息也就會(huì)清空。內(nèi)存就會(huì)回到最初的狀態(tài)。

總結(jié)
到此這篇關(guān)于Java面向?qū)ο蠛蛢?nèi)存分析的文章就介紹到這了,更多相關(guān)Java面向?qū)ο髢?nèi)存分析內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 關(guān)于Java中String創(chuàng)建的字符串對(duì)象內(nèi)存分配測(cè)試問(wèn)題
- 新手初學(xué)Java對(duì)象內(nèi)存構(gòu)成
- Java對(duì)象在內(nèi)存中的布局是如何實(shí)現(xiàn)的?
- 詳解Java對(duì)象創(chuàng)建的過(guò)程及內(nèi)存布局
- 詳解Java對(duì)象的內(nèi)存布局
- java各種類型對(duì)象占用內(nèi)存情況分析
- 深入理解JVM之Java對(duì)象的創(chuàng)建、內(nèi)存布局、訪問(wèn)定位詳解
- Java對(duì)象創(chuàng)建內(nèi)存案例解析
相關(guān)文章
使用Spring AOP實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)讀寫(xiě)分離案例分析(附demo)
分布式環(huán)境下數(shù)據(jù)庫(kù)的讀寫(xiě)分離策略是解決數(shù)據(jù)庫(kù)讀寫(xiě)性能瓶頸的一個(gè)關(guān)鍵解決方案,這篇文章主要介紹了使用Spring AOP實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)讀寫(xiě)分離案例分析(附demo),有興趣的可以了解一下。2017-01-01
java中InputStream獲取字節(jié)大小相關(guān)方法詳解
這篇文章主要給大家介紹了關(guān)于java中InputStream獲取字節(jié)大小相關(guān)方法的相關(guān)資料,在Java中要實(shí)現(xiàn)讀取文件大小,可以使用InputStream來(lái)讀取文件的內(nèi)容,并通過(guò)獲取讀取的字節(jié)數(shù)來(lái)得到文件的大小,需要的朋友可以參考下2023-11-11
java web支持jsonp的實(shí)現(xiàn)代碼
這篇文章主要介紹了java web支持jsonp的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11
詳解如何將已有項(xiàng)目改造為Spring Boot項(xiàng)目
本篇文章主要介紹了如何將已有項(xiàng)目改造為Spring Boot項(xiàng)目,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11
解決IDEA導(dǎo)入javaWeb項(xiàng)目注解爆紅的問(wèn)題
這篇文章主要介紹了解決IDEA導(dǎo)入javaWeb項(xiàng)目注解爆紅的問(wèn)題,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
Java ==,equals()與hashcode()的使用
本文主要介紹了Java ==,equals()與hashcode()的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
springboot接口多實(shí)現(xiàn)類選擇性注入解決方案
這篇文章主要為大家介紹了springboot接口多實(shí)現(xiàn)類選擇性注入解決方案的四種方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
java操作mongodb時(shí),對(duì)象bean和DBObject相互轉(zhuǎn)換的方法(推薦)
下面小編就為大家?guī)?lái)一篇java操作mongodb時(shí),對(duì)象bean和DBObject相互轉(zhuǎn)換的方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11

