Java 程序执行过程的内存流程图(结合类加载器 ClassLoader 讲解)
以上代碼的執(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux的测试版本(linux的测试)
- 下一篇: Java 程序执行过程的内存流程图(手写