天天看點

java棧方法_java棧、堆、方法區詳解

1、java中的棧(stack)和堆(heap)是java在記憶體(ram)中存放資料的地方

2、堆區

存儲的全部是對象,每個對象都包含一個與之對應的class的資訊。(class的目的是得到操作指令);

jvm隻有一個heap區,被所有線程共享,不存放基本類型和對象引用,隻存放對象本身。

堆的優劣勢:堆的優勢是可以動态的配置設定記憶體大小,生存期也不必事先告訴編譯器,java的垃圾收集器會自動收取這些不在使用的數

據,但缺點是,由于要在運作時動态配置設定記憶體,存取速度慢。

3、棧區

每一個線程包含一個stack區,隻儲存基本資料類型的對象和自定義對象的引用(不是對象),對象都存放在共享heap中;

每個棧中的資料(基本資料類型和對象引用)都是私有的,其他棧不能通路;

棧分為3部分:基本類型變量區、執行環境上下文、操作指令區(存放操作指令)

棧的優勢劣勢:存取速度比堆要快,僅次于直接位于CPU的寄存器,但必須确定的是存在stack中的資料大小與生存期必須是确定

的,缺乏靈活性。單個stack的資料可以共享。

stack:是一個先進後出的資料結構,通常儲存方法中的參數,局部變量。

在java中,所有基本類型和引用類型都在stack中儲存,棧中資料的生存空間一般在目前scopes内

4、方法區

1、又叫靜态區,跟堆一樣,被所有的線程共享。方法區包含所有的class和static變量;

2、方法區中包含的都是在程式中永遠的唯一的元素

5、在JAVA中,有六個不同的地方可以存儲資料:1. 寄存器(register)。這是最快的存儲區,因為它位于不同于其他存儲區的地方——處理器内部。但是寄存器的數量極其有限,所

以寄存器由編譯器根據需求進行配置設定。你不能直接控制,也不能在程式中感覺到寄存器存在的任何迹象。

2. 堆棧(stack)。位于通用RAM中,但通過它的“堆棧指針”可以從處理器哪裡獲得支援。堆棧指針若向下移動,則配置設定新的記憶體;

若向上移動,則釋放那些 記憶體。這是一種快速有效的配置設定存儲方法,僅次于寄存器。建立程式時候,JAVA編譯器必須知道存儲

在堆棧内所有資料的确切大小和生命周期,因為它必須生成 相應的代碼,以便上下移動堆棧指針。這一限制限制了程式的靈活

性,是以雖然某些JAVA資料存儲在堆棧中——特别是對象引用,但是JAVA對象不存儲其 中。

3. 堆(heap)。一種通用性的記憶體池(也存在于RAM中),用于存放是以的JAVA對象。堆不同于堆棧的好處是:編譯器不需要知

道要從堆裡配置設定多少存儲區 域,也不必知道存儲的資料在堆裡存活多長時間。是以,在堆裡配置設定存儲有很大的靈活性。當你需要

建立一個對象的時候,隻需要new寫一行簡單的代碼,當執行 這行代碼時,會自動在堆裡進行存儲配置設定。當然,為這種靈活性必

須要付出相應的代碼。用堆進行存儲配置設定比用堆棧進行存儲存儲需要更多的時間。

4. 靜态存儲(static storage)。這裡的“靜态”是指“在固定的位置”。靜态存儲裡存放程式運作時一直存在的資料。你可用關鍵字

static來辨別一個對象的特定元素是靜态的,但JAVA對象本身從來不會存放在靜态存儲空間裡。

5. 常量存儲(constant storage)。常量值通常直接存放在程式代碼内部,這樣做是安全的,因為它們永遠不會被改變。有時,在

嵌入式系統中,常量本身會和其他部分分割離開,是以在這種情況下,可以選擇将其放在ROM中

6. 非RAM存儲。如果資料完全存活于程式之外,那麼它可以不受程式的任何控制,在程式沒有運作時也可以存在。就速度來說,有如下關系:寄存器 < 堆棧 < 堆 < 其他

運作類過程:方法區找到方法--堆中執行個體化對象--調用棧(指向堆中執行個體)