-
棧區
-
棧區描述的是方法執行的內存模型。每個方法在執行時都會創建一個棧幀(存儲局部變量、操作數棧、動態鏈接、方法出口等)
-
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; //這里不能使用私有類
}
-
java MainMemory,系統收到指令,啟動一個java虛擬機進程
-
進程首先從classpath中找到MainMemory.class文件,讀取該文件的二進制 數據,就是將類信息存放到運行時數據去的方法區中,整個過程是類加載過程,將其加載到方法區中
-
Java虛擬機定位到方法區中MainMemory類的main()方法的字節碼,執行了方法,會分配一個棧幀
-
創建一個實例對象,也就是在堆區分配一個對象的內存,給對象屬性賦值
-
創建一個Data類對象,先加載該類,然后再分配對象內存,再給該對象賦值
-
調用store()方法,分配棧幀
-
調用release()方法,分配棧幀