JVM 棧堆和方法區


  • 棧區

    • 棧區描述的是方法執行的內存模型。每個方法在執行時都會創建一個棧幀(存儲局部變量、操作數棧、動態鏈接、方法出口等)

    • JVM為每個線程創建一個棧,棧屬於線程私有,不能實現線程間的共享,用於存放該線程執行方法的信息(實際參數、局部變量等)

    • 基本類型變量去,執行環境上下文,操作指令區(存放操作指令)

  • 堆區

    • 堆用於存儲創建好的對象和數組(數組也是對象)

    • JVM只有一個堆,被所有線程共享

    • 堆是一個不連續的內存空間,分配靈活,速度慢!

  • 方法區

    • Jvm只有一個方法區,被所有線程公用

    • 存放整個程序中唯一的元素。用於存放已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據。如class static 變量

  • 內存分配

public class MainMemory { int id; String name; int size; Data data; void store() { System.out.println("執行存儲中,存儲數據類型:" + data.type); } void release() { System.out.println("釋放內存中"); } // 構造方法
 MainMemory(){ } public static void main(String [] args) { MainMemory memory = new MainMemory();   // 創建一個對象
            memory.id=1; memory.name = "test"; memory.size = 1024; Data data = new Data(); data.type = "字符串"; memory.data = data; memory.store(); memory.release(); } } class Data{ public String type;        //這里不能使用私有類
    }

 

  1. java MainMemory,系統收到指令,啟動一個java虛擬機進程

  2. 進程首先從classpath中找到MainMemory.class文件,讀取該文件的二進制 數據,就是將類信息存放到運行時數據去的方法區中,整個過程是類加載過程,將其加載到方法區中

  3. Java虛擬機定位到方法區中MainMemory類的main()方法的字節碼,執行了方法,會分配一個棧幀

  4. 創建一個實例對象,也就是在堆區分配一個對象的內存,給對象屬性賦值

  5. 創建一個Data類對象,先加載該類,然后再分配對象內存,再給該對象賦值

  6. 調用store()方法,分配棧幀

  7. 調用release()方法,分配棧幀

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM