在內存的方面,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語言中的指針來看,從棧中找到變量,指向變量所對應的地址,也就是他們的值。
在分配上,靜態變量直接在類的加載中就分配好內存位置給他們,但是動態變量的分配上,就只是在要用到的時候才分配到的。