java學習筆記(4):記憶體管理,java學習筆記
在記憶體的方面,Java自身帶有垃圾運行機制,表面上好像我們可以忽略不計,但是如果我們對其加以理解的話,說不定有時會達到事半功倍的效果。
所以自己花些時間整理一些此類的資料。
一.基本概念
1.棧
對於棧的理解,可以把它想象成一個只有一個入口的空桶,有一個原則就是“先進後出”原則,現在往裡面放東西,比如放進的順序是P,I,N,S,I,L,Y,等下如果要把字母拿出來的話,順序就變成了Y,L,I,S,N,I,P,可以想象的話,就簡單很多了。
在Java程式中,棧的作用主要是存放由基礎類型產生的變數,像int,char等這些基本類型,還有一個作用是存放對象的引用變數,但是這裡不存放產生的對象。
2.堆
堆在Java中的作用,就是存放由程式new出來的對象和數組。比如當把棧中存放的一個變數賦值時,這個值就被放在了堆中,簡單來說,程式的執行,就是棧和堆的相互關聯。
3.資料共用
代碼:int a = 3; int b = 3;
處理的時候,先處理a變數。程式在棧中尋找有沒有變數a,沒有的話就建立一個引用變數a,然後在堆中找有沒有3這個值,沒有的話就建立分配記憶體建立3的空間,a指向3;接下來處理b = 3,棧中建立b,然後在堆中找尋有沒有3,有了,就直接指向3這個地址了。這樣就出現了a,b共用一個地址的情況了,這就是所謂的資料共用了,這樣做的話就節省了記憶體的空間,提高了Java的運行品質。
但需要注意的是,上面所描述到的只是堆中的資料共存,也是只有堆中的資料才能實現共用,因為棧中的資料是現成私人的,不能實現共用。
4.靜態記憶體
靜態記憶體,指的是確定記憶體空間大小的記憶體,所以這樣的記憶體一開始的時候記憶體就可以直接根據他的大小直接分配空間了。
5.動態記憶體
之所以稱之為動態,就是他的大小是隨機的,要用到多少就分配多少,視情況而定,所以,程式一開始啟動並執行時候摸不著頭腦,只能在他要用到的時候才能達到一個確定的值,隨即才分配記憶體給他。
二.記憶體機制
1.基本理解:可以想象成C語言中的指標來看,從棧中找到變數,指向變數所對應的地址,也就是他們的值。
在分配上,靜態變數直接在類的載入中就分配好記憶體位置給他們,但是動態變數的分配上,就只是在要用到的時候才分配到的。