日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java 程序执行过程的内存流程图(结合类加载器 ClassLoader 讲解)

發(fā)布時(shí)間:2023/12/3 java 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 程序执行过程的内存流程图(结合类加载器 ClassLoader 讲解) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Student s = new Student(); s.play(); Student s2 = new Student();

以上代碼的執(zhí)行流程如下:

JVM 作為操作系統(tǒng)的一個(gè)迚程在系統(tǒng)中執(zhí)行,那么系統(tǒng)會(huì)為 JVM 分配一塊內(nèi)存空間,這塊內(nèi)存空 間被 JVM 分為 3 大塊(棧區(qū)、堆區(qū)、方法區(qū))

一般而言,對象在堆(Heap)中創(chuàng)建,但是一些特殊的對象會(huì)在方法區(qū)中創(chuàng)建。

第一步
當(dāng) JVM 執(zhí)行第一行代碼“Student s = new Student();”時(shí)
JVM 先碰到了 Student 類,“Student s = new Student();”
此時(shí),JVM 將查看方法區(qū)中是否有 Student 對應(yīng)的 Class 對象(我們學(xué)習(xí)過反射,都知道 Class
對象,在同一個(gè) JVM 中,可以有很多的 Student 實(shí)例,但是 Student 的 Class 對象只有一個(gè))。

因?yàn)槭堑谝淮螆?zhí)行,方法區(qū)中沒有 Student 的 Class 對象,此時(shí) JVM 就會(huì)調(diào)用類加載器 (ClassLoader)。

類加載器有 2 大類:
第 1 種是虛擬機(jī)本身提供的,第 2 種是程序員自定義的(像 Tomcat 本身也有自己的類加載器)

類加載器(ClassLoader)要加載 Student 類的過程,就是要在物理位置找到 Student 類的字節(jié)碼文件(如 D:/workspace/web03/classes/Student.class)。
怎么才能找到? JVM 會(huì)根據(jù) ClassPath 搜索。

當(dāng) JVM 找到 Student 類的字節(jié)碼文件后,JVM 會(huì)將該字節(jié)碼文件轉(zhuǎn)換為一個(gè) Student 的 Class 對 象,放入方法區(qū)

當(dāng)這個(gè) Student 的 Class 對象構(gòu)造完畢,類加載過程就完成了。

第二步

將 Sutdent 類型的變量 s 放入棧(Stack)中; “Student s = new Student();”

第三步

“Student s = new Student();” 在堆(heap)中創(chuàng)建一個(gè) Student 對象,變量 s 指向該對象。

第四步

play()方法放在代碼區(qū)中 Student 的 Class 對象中,對象的方法在 JVM 中只有 1 份,對象的屬性(每
個(gè)對象都有獨(dú)有的屬性)可以有多份。

執(zhí)行“s.play();”方法時(shí),Student 對象到方法區(qū)中找到 play()方法并執(zhí)行。

第五步

執(zhí)行“Student s2 = new Student();”時(shí),JVM 到方法區(qū)中找到了 Student 的 Class 對象,所以 JVM 不再調(diào)用 ClassLoader 加載 Class 對象。
將直接在堆中創(chuàng)建。

總結(jié)

以上是生活随笔為你收集整理的Java 程序执行过程的内存流程图(结合类加载器 ClassLoader 讲解)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。