【Java】棧區、堆區和方法區的解析

棧區

  1. 棧區描述的是方法執行的內存模型。每一個方法在執行時都會建立一個棧幀(存放存儲局部變量、操做數棧、動態連接、方法出口等)
  2. JVM爲每一個線程建立一個棧,棧屬於線程私有,不能實現線程間的共享!用於存放該線程執行方法的信息(實際參數、局部變量等)
  3. 基本類型變量去,執行環境上下文,操做指令區(存放操做指令).

堆區

  1. 堆用於存儲建立好的對象和數組(數組也是對象)
  2. JVM只有一個堆,被全部線程共享
  3. 堆是一個不連續的內存空間,分配靈活,速度慢!

方法區

  1. Jvm只有一個方法區,被全部線程公用
  2. 存放整個程序中惟一的元素。用於存放已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。如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;        //這裏不能使用私有類
    }
  • java MainMemory,系統收到指令,啓動一個java虛擬機進程
  • 進程首先從classpath中找到MainMemory.class文件,讀取該文件的二進制 數據,就是將類信息存放到運行時數據去的方法區中,整個過程是類加載過程,將其加載到方法區中
  • Java虛擬機定位到方法區中MainMemory類的main()方法的字節碼,執行了方法,會分配一個棧幀。
  • 建立一個實例對象,也就是在堆區分配一個對象的內存,給對象屬性賦值
  • 建立一個Data類對象,先加載該類,而後再分配對象內存,再給該對象賦值
  • 調用store()方法,分配棧幀
  • 調用release()方法,分配棧幀

圖片描述

參考:面向對象內存分析
Java堆區、棧區、方法區html

相關文章
相關標籤/搜索