標籤:java記憶體管理 數組儲存方式
首先感謝強大的網路資源,本博文是根據網路上的各種資源進行整合,然後加入自己的理解而成,可能會與其它網路資源有重複,望其他作者多多包涵。由於初學java,如有不準確的描述還請讀者指正。下面正式切入正題:
眾所周知,java和C++都是物件導向的程式設計語言,但是與C++相比,java上手比較容易,而且使用方便。小弟對c++瞭解不是很多,但是有一點是C++初學者最為頭痛的問題,那就是記憶體管理,這也正是C++和java之間很大的一個區別。在C++中,記憶體是依靠程式員自己來管理的,編寫程式過程中稍有不慎就會導致致命的錯誤————崩潰;而java中,記憶體是依靠java虛擬機器來管理的,叫做記憶體回收機制,程式員可以不用去過多關心這方面的東西,因此也剩下了不少的時間和精力。但是對於一個優秀的程式員而言,這種記憶體自動管理的機制並不是一件好事,就像手工製作的皮鞋遠比機器製作的皮鞋要好的多,舒服的多一樣。記憶體自動管理不僅會降低程式的運行效率,同時也降低了程式的可靠性,所以,java獲得了方便,易學的優勢是在犧牲了效率和程式可靠性的基礎之上的。既然java記憶體管理都是自動化的,那我們為啥還要去瞭解呢,原因很簡單:有助於個人能編寫出更加優秀的代碼。
下面就讓我們瞭解一下java記憶體的管理機制:
java記憶體的管理無非就是兩點:記憶體的分配和記憶體的回收。
其中記憶體配置包括堆和棧兩部分:堆中儲存的都是實體,而棧中儲存的是指向實體的引用;
例如:建立一個數組 int[] arr = new int[3];在記憶體中的分配是這樣的:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/5B/64/wKiom1UHu_rBQvhmAACTUcQeXvo501.jpg" title="數組在記憶體中的儲存" alt="wKiom1UHu_rBQvhmAACTUcQeXvo501.jpg" />
其中,棧中的資料不是長久存在的。arr位於棧中,其中存放的是數組的地址,一旦出了範圍,arr將被釋放掉,而堆中的資料不會被釋放,但是也沒有索引能夠擷取數組的資料。因為arr是找到數組資料的唯一一把鑰匙,鑰匙丟了,那麼資料也就無法被利用了,也就成了記憶體垃圾,在C++中,這部分垃圾是程式員自己去處理的,但是在java中有專門的記憶體回收機制,由虛擬機器來完成。
同樣,java程式運行中調用函數時,也是先載入到棧中,每一個函數形成一個幀,同樣遵循先進後出的原則,執行完後這部分記憶體就被釋放掉,這也是為什麼函數中局部變數為什麼會只在範圍中有效原因。
附圖:Java虛擬機器運行時的資料區
相關詳細知識參見:http://www.cnblogs.com/gw811/archive/2012/10/18/2730117.html
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/5B/64/wKiom1UHw-bCIRS9AAMUfiGQFZw302.jpg" title="image_5.png" alt="wKiom1UHw-bCIRS9AAMUfiGQFZw302.jpg" />
本文出自 “軟體開發交流” 部落格,請務必保留此出處http://smile2015.blog.51cto.com/9250194/1621428
java記憶體管理淺析