堆:先進(jìn)先出,存放在二級(jí)緩存中,速度慢,只有一個(gè),被所有線程共享,用來(lái)存放對(duì)象和數(shù)組,可以動(dòng)態(tài)分配內(nèi)存大小,生命周期不確定。(靈活、速度慢)
棧:后進(jìn)先出,存放在一級(jí)緩存中,速度快,每個(gè)線程都包含一個(gè)棧區(qū),數(shù)據(jù)私有,其他棧不能訪問(wèn),用來(lái)執(zhí)行程序,不能動(dòng)態(tài)分配內(nèi)存,生命周期確定。(速度快、不靈活)
方法區(qū)/靜態(tài)區(qū):被所有線程共享,存放所有的方法和靜態(tài)變量,全局變量與靜態(tài)變量放一起,初始化與未初始化的分開(kāi)。
棧的組成:基本類型變量區(qū)、執(zhí)行環(huán)境上下文、操作指令區(qū)(存放操作指令)
為什么要有堆和棧?這樣設(shè)計(jì)有什么好處?
①Java自動(dòng)管理堆和棧,程序員不能直接地設(shè)置棧和堆。
②Java的堆是一個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū)。堆是由JVM的垃圾回收器自動(dòng)管理的。堆的優(yōu)勢(shì)是可以在程序運(yùn)行時(shí),動(dòng)態(tài)地分配內(nèi)存
大小,但是正是由于這個(gè)原因,它的存取速度較慢。
③棧的優(yōu)勢(shì)是,存取速度比堆要快,僅次于寄存器,棧數(shù)據(jù)可以共享。但缺點(diǎn)是,存在棧中的數(shù)據(jù)大小和生存期是必須確定的,缺乏靈活性。