1 圖解JVM內存三大核心區域java
2 JVM內存使用案例剖析jvm
public class HelloJVM { /** * JVM 運行的時候會經過反射的方式到Method區域找到入口類的入口的main * @param args */ public static void main(String args[]){ /** JVM啓動的時候會從類加載路徑中加載包含main方法的入口類HelloJVM這個類 * 找到後會讀取該文件中的二進制數據,並把該類的信息放到Method Area中而後會定位到HelloJVM的main方 * 法的字節碼中並開始執行main方法中的的指令: * Student s = new Student("imf");此時會建立Student對象,而且使用s來引用該對象 * 第一步:JVM會到Method區域中去查找Student類的信息,此時發現沒有Student類的信息,就經過類加載器 * 加載該Student類文件; * 第二步:JVM的Method區域加載並找到了Student類以後會在Heap區域中爲Student類實例對象分配內存 * 而且在Student的實例的對象中持有指向方法區域中的Student類的引用(內存地址) * 第三步:JVM實例化完成後會在當前線程中Stack中的reference創建實際的引用關係,此值會賦值給s * 在JVM中方法的調用是屬於線程的行爲,也就是說方法調用自己會發生在調用線程的方法調用棧; * 線程的方法調用棧(Method Stack Frames),每個方法的調用自己就是方法調用棧中的一個Frame,該 * Frame包含了方法的參數,臨時數據,局部變量等。 * * s 是放在主線程的Stack 區域中的 * Student 對象實例是放在全部線程共享的Heap區域中 */ Student s = new Student("imf"); /** * 首先會經過s 指針(句柄【有一箇中間Handler】)找到s 所指向的對象 * 找到對象後會經過對象內部指向方法區域中的指針來調用具體的方法來執行任務 */ s.sayHello("jvm"); } } class Student{ private String name;//name 自己做爲成員是放在Stack 中的,可是name指向的String對象是放在堆中的 /** * sayHello 方法放在Method Area * @param msg */ public void sayHello(String msg){ System.out.println("hello:"+ name + msg); } public Student(String name){ this.name = name; } }