1. 程式人生 > >java數據存儲

java數據存儲

所有 heap 改變 只有一個 ref 變量 think left 內存池

記錄一下java中的數據存儲:

這是我參考的文章:

https://blog.csdn.net/futurech/article/details/73699652、

https://blog.csdn.net/zhangbaoanhadoop/article/details/82193497、

https://blog.csdn.net/qq_32127759/article/details/80725115

在《thinking in java》這本書的第二章也有提到,因為涉及到jvm(我還沒看),這個等我之後再補充。

一、六種不同的數據存儲

1. 寄存器(register)。這是最快的存儲區,因為它位於不同於其他存儲區的地方——處理器內部。但是寄存器的數量極其有限,所以寄存器由編譯器根據需求進行分配。你不能直接控制,也不能在程序中感覺到寄存器存在的任何跡象。(寄存器的使用是在JVM中討論的,等我看到這部分的時候再進行補充,用於管理系統堆棧。)

2. 堆棧(stack)。位於通用RAM中,但通過它的“堆棧指針”可以從處理器哪裏獲得支持。堆棧指針若向下移動,則分配新的內存;若向上移動,則釋放那些內存。這是一種快速有效的分配存儲方法,僅次於寄存器。創建程序時候,JAVA編譯器必須知道存儲在堆棧內所有數據的確切大小和生命周期,因為它必須生成相應的代碼,以便上下移動堆棧指針。這一約束限制了程序的靈活性,所以雖然某些JAVA數據存儲在堆棧中——特別是對象引用和基本數據類型,但是JAVA對象不存儲其中。

3. 堆(heap)。一種通用性的內存池(也存在於RAM中),用於存放所以的JAVA對象。堆不同於堆棧的好處是:編譯器不需要知道要從堆裏分配多少存儲區域,也不必知道存儲的數據在堆裏存活多長時間。因此,在堆裏分配存儲有很大的靈活性。當你需要創建一個對象的時候,只需要new寫一行簡單的代碼,當執行這行代碼時,會自動在堆裏進行存儲分配。當然,為這種靈活性必須要付出相應的代碼。用堆進行存儲分配比用堆棧進行存儲存儲需要更多的時間。

4. 靜態存儲(static storage)。也叫方法區,包含整個程序中永遠唯一的元素,比如static和class。

這裏的“靜態”是指“在固定的位置”。靜態存儲裏存放程序運行時一直存在的數據。你可用關鍵字static來標識一個對象的特定元素是靜態的,但JAVA對象本身從來不會存放在靜態存儲空間裏。

註意,static不能修飾局部變量。static final 修飾的成員變量在常量存儲區,僅僅static修飾的成員變量在靜態存儲區。

5. 常量存儲(constant storage)。常量值通常直接存放在程序代碼內部,這樣做是安全的,因為它們永遠不會被改變。有時,在嵌入式系統中,常量本身會和其他部分分割離開,所以在這種情況下,可以選擇將其放在ROM中

6. 非RAM存儲。如果數據完全存活於程序之外,那麽它可以不受程序的任何控制,在程序沒有運行時也可以存在。比如流對象和持久化對象(存儲在磁盤,磁帶上的數據)

就速度來說,有如下關系:
寄存器 > 堆棧 > 堆 > 其他

二、棧、堆、方法區存儲的內容

堆區:
1.存儲的全部是對象,每個對象都包含一個與之對應的class的信息。(class的目的是得到操作指令)

2.jvm只有一個堆區(heap)被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身 。

3.動態內存,其中的內存在不需要時可以回收,以分配給新的內存請求,其內存中的數據是無序的,即先分配的和隨後分配的內存並沒有什麽必然的位置關系,釋放時也可以沒有先後順序。不需要知道數據的生存周期。

棧區:
1.每個線程包含一個棧區(可以理解為為每個方法分配了一個小的棧,存儲局部變量,當方法結束時釋放棧),棧中只保存基礎數據類型的值和對象以及基礎數據的引用

2.每個棧中的數據(基礎數據類型和對象引用)都是私有的,其他棧不能訪問。

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

4.棧中的數據生存周期時編譯器已知的

5.棧中的數據時共享的,即兩個基礎類型變量如果值相同的話,實際上是可以指向同一塊數據塊(eg:int a=3,int b=3;a,b指向同一地址),但是不會產生對象引用帶來的一個引用修改另外的引用同時修改(eg,a=4,會重新在棧中尋找是否有一塊內存塊值為4)。

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

2.方法區中包含的都是在整個程序中永遠唯一的元素,如class,static變量。

技術分享圖片

技術分享圖片

java數據存儲