棧區
- 棧區描述的是方法執行的內存模型。每一個方法在執行時都會建立一個棧幀(存放存儲局部變量、操做數棧、動態連接、方法出口等)
- 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()方法,分配棧幀
參考:面向對象內存分析
Java堆區、棧區、方法區html