package JVM_app;
/**
* 從JVM調(diào)用的角度分析java程序?qū)?nèi)存空間的使用;
* 當(dāng)JVM進程啟動的時候三痰,會從類加載路徑中找到包含main方法的入口類HelloJVM
* 找到之后會直接讀取該文件中的二進制數(shù)據(jù),并且把該類的信息放到運行時的Method內(nèi)存區(qū)域中获搏;
* 然后會定位到HelloJVM中的main方法的字節(jié)碼中并開始執(zhí)行main方法中指令:
* Student student = new Student("joker");
* 此時會創(chuàng)建Student實例對象并且使用student來應(yīng)用該對象(或者說對該對象重命名)碱茁,其內(nèi)幕如下:
* 第一步:JVM會直接到Method區(qū)域中去查找Student類的信息纽竣,此時發(fā)現(xiàn)沒有Student類聋袋,就通過
*? ? ? ? ? 類加載器加載該Student類幽勒;
* 第二步:在JVM的Method區(qū)域加載并找到了Student類之后會在Heap區(qū)域中為Student實例對象分配內(nèi)存
*? ? ? ? ? 并且在Student的實例對象中持有指向方法區(qū)域中的Student類的應(yīng)用(內(nèi)存地址)代嗤;
* 第三步:JVM實例完后,會在當(dāng)前的線程中為stack中的referenc建立實際的應(yīng)用關(guān)系硝逢,此時會賦值給student
*
* 在JVM中的方法的調(diào)用一定是屬于線程的行為,也就是說方法調(diào)用本身會發(fā)生在調(diào)用線程的方法調(diào)用棧:
* 線程的方法調(diào)用棧(Method Stack Frames),每一個方法的調(diào)用就是方法調(diào)用棧中的一個frame排宰,該
* frame包含了方法的參數(shù)那婉、局部變量板甘、臨時數(shù)據(jù)等;student.sayHello();
*? */
public classHello JVM {
/**
* 在JVM運行的時候會通過反射的方式找到Method區(qū)域找到入口類的入口方法main
*@paramargs
*/
public static void main(String args[]) {
/**
* student是放在主線程中的stack區(qū)域中的详炬;
* Student對象實例是放在所有線程共享的Heap區(qū)域中的盐类;
*/
Student student = new Student("joker");
/**
* 首先
*/
student.sayHello();
}
}
classStudent {
private String name;//name本身作為成員是放在stack區(qū)域的,
//但是name指向的String對象是放在Heap中呛谜;
public Student(String name) {
this.name = name;
}
public void sayHello() {//sayHello這個方法是放在方法區(qū)域中的在跳;
System.out.println("hello, this is" + this.name);
}
}