1. 程式人生 > >第2課:全球詳細圖解jvm記憶體三大核心區域及其jvm記憶體案例實戰剖析

第2課:全球詳細圖解jvm記憶體三大核心區域及其jvm記憶體案例實戰剖析

內容:

    1.圖解JVM記憶體的三大核心區     2.JVM記憶體使用案例剖析

一、圖解JVM記憶體的三大核心區

二、VM記憶體使用案例剖析

從JVM呼叫的角度分析Java程式對記憶體空間的使用:     1.當JVM程序啟動的時候,會從類載入路徑中找到包含main 法的入口類JVM;     2.找到JVM後會直接讀取該檔案中的二進位制資料並且把該類的資訊放到執行的Method記憶體區域中;     3.然後會定位代JVM中的main方法的位元組碼並開始執行main方法中的指令;      4.Student student = new Student("ombey");     此時會建立Student例項並且使用student來應用該物件(或者說對該物件命名)     5. 其內幕如下:          第一步:JVM會直接代Method區域中區查詢Student類的資訊,此時發現滅有Student類, 就通過類載入器載入該Student類檔案;          第二步:在JVM的Method區域載入到了Student類之後會在Heap區中為Stdudent例項物件分配記憶體並且在Student例項物件中持有指向方法區域中的Student類的應用(記憶體地址)          第三步:JVM例項完後在當前執行緒中的Stack中的reference建立實際的應用物件關係,此時會賦值給Student     6. 在JVM中方法呼叫一定是執行緒的行為,也就是說方法呼叫本身會在呼叫執行緒的方法呼叫棧,執行緒的方法呼叫棧(Method Stack Frames)每一個方法呼叫就是方法呼叫棧中的一個Frame, 該frame包含了方法的引數,區域性變數,臨時資料等     7.程式碼示例

package JVM;

/**
 * FileName: JVM
 * Author:   hadoop
 * Email:    [email protected]
 * Date:     18-10-28 上午11:09
 * Description:
 */

/**
 * 從JVM呼叫的角度分析Java程式對記憶體空間的使用
 * 當JVM程序啟動的時候,會從類載入路徑中找到包含main
 * 方法的入口類jvm,找到JVM後會直接讀取該檔案中的二進位制
 * 資料並且把該類的資訊放到執行的Method記憶體區域中;
 * 然後會定位代JVM中的main方法的位元組碼並開始執行main方
 * 法中的指令; Student student = new Student("ombey");
 * 此時會建立Student例項並且使用student來應用該物件(或者說對該物件命名)
 * 其內幕如下:
 * 第一步:JVM會直接代Method區域中區查詢Student類的資訊,此時發現滅有Student類,
 * 就通過類載入器載入該Student類檔案;
 * 第二步:在JVM的Method區域載入到了Student類之後會在Heap區中為Stdudent例項物件
 * 分配記憶體並且在Student例項物件中持有指向方法區域中的Student類的應用(記憶體地址)
 * 第三步:JVM例項完後在當前執行緒中的Stack中的reference建立實際的應用物件關係,此時會賦值給Student
 *
 * 在JVM中方法呼叫一定是執行緒的行為,也就是說方法呼叫本身會在呼叫執行緒的方法呼叫棧;
 * 執行緒的方法呼叫棧(Method Stack Frames)每一個方法呼叫就是方法呼叫棧中的一個Frame,
 * 該frame包含了方法的引數,區域性變數,臨時資料等
 */
public class JVM {
    /**
     * 在JVm執行的時候會通過反射到Method區域找到入口類的入口方法main
     * @param args
     */
    //main方法放在Method方法區中的
    public static void main(String[] args){
        /**
         * student是放在主執行緒的Stack區域中的
         * Student物件例項是放在所有執行緒共享的Heap區域中的
         */
        Student student = new Student("ombey");
        /**
         * 首先會通過studen指標(控制代碼)找Student物件,當找
         * 到該物件後會通過物件內部區域中的指標來呼叫具體的
         * 方法去執行任務
         */
        student.sayHello();
    }
}
class Student{
    //name本身作為成員是放在Stack區域的,但是name指向的String物件是放在堆(Heap)中的
    private String name;
    //建構函式
    public Student(String name){
        this.name = name;
    }
    //sayHello這個方法是放在方法區域中的
    public void sayHello(){
        System.out.println("Hello,This is "+ this.name);
    }
}