棧區(qū)
- 棧區(qū)描述的是方法執(zhí)行的內(nèi)存模型踊赠。每個(gè)方法在執(zhí)行時(shí)都會(huì)創(chuàng)建一個(gè)棧幀(存放存儲(chǔ)局部變量呵扛、操作數(shù)棧、動(dòng)態(tài)鏈接筐带、方法出口等)
- JVM為每個(gè)線程創(chuàng)建一個(gè)棧今穿,棧屬于線程私有,不能實(shí)現(xiàn)線程間的共享!用于存放該線程執(zhí)行方法的信息(實(shí)際參數(shù)伦籍、局部變量等)
- 基本類型變量去蓝晒,執(zhí)行環(huán)境上下文,操作指令區(qū)(存放操作指令).
堆區(qū)
- 堆用于存儲(chǔ)創(chuàng)建好的對(duì)象和數(shù)組(數(shù)組也是對(duì)象)
- JVM只有一個(gè)堆帖鸦,被所有線程共享
- 堆是一個(gè)不連續(xù)的內(nèi)存空間芝薇,分配靈活,速度慢!
方法區(qū)
- Jvm只有一個(gè)方法區(qū)作儿,被所有線程公用
- 存放整個(gè)程序中唯一的元素洛二。用于存放已被虛擬機(jī)加載的類信息、常量立倍、靜態(tài)變量灭红、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)侣滩。如class static 變量.
內(nèi)存分配
public class MainMemory {
int id;
String name;
int size;
Data data;
void store() {
System.out.println("執(zhí)行存儲(chǔ)中口注,存儲(chǔ)數(shù)據(jù)類型:" + data.type);
}
void release() {
System.out.println("釋放內(nèi)存中");
}
// 構(gòu)造方法
MainMemory(){
}
public static void main(String [] args) {
MainMemory memory = new MainMemory(); // 創(chuàng)建一個(gè)對(duì)象
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,系統(tǒng)收到指令,啟動(dòng)一個(gè)java虛擬機(jī)進(jìn)程
- 進(jìn)程首先從classpath中找到MainMemory.class文件君珠,讀取該文件的二進(jìn)制 數(shù)據(jù)寝志,就是將類信息存放到運(yùn)行時(shí)數(shù)據(jù)去的方法區(qū)中,整個(gè)過(guò)程是類加載過(guò)程策添,將其加載到方法區(qū)中
- Java虛擬機(jī)定位到方法區(qū)中MainMemory類的main()方法的字節(jié)碼材部,執(zhí)行了方法,會(huì)分配一個(gè)棧幀唯竹。
- 創(chuàng)建一個(gè)實(shí)例對(duì)象乐导,也就是在堆區(qū)分配一個(gè)對(duì)象的內(nèi)存,給對(duì)象屬性賦值
- 創(chuàng)建一個(gè)Data類對(duì)象浸颓,先加載該類物臂,然后再分配對(duì)象內(nèi)存,再給該對(duì)象賦值
- 調(diào)用store()方法产上,分配棧幀
- 調(diào)用release()方法棵磷,分配棧幀
3224483841-5d172ebd6b0ae_articlex.png