java 內存分佈

首先明白,java創建一個對象,就是分配一塊內存區域,然後把這個對象的一些具體信息,存放在這個區域裏面。
 虛擬機會把計算機中的許多內存管理起來。相當於一個大管家,不同的區域也有不同的應用。因此,也就構成了java的內存分配區域。
第一種:寄存器。
由於寄存器位於cpu內部,他的存取速度是最快的。當然,如果把對象存放在寄存器裏面,這樣對象的訪問速度當然是最高的。但是隻是我們一相情願,對於寄存器的內存分配,是java編譯器來自動分配的,我們是無法用程序來控制的。所以,只能望而卻步。
第二種: 棧
首先明白,java對象的創建分爲兩個時期。第一個時期,java應用程開發過程中創建。第二個事情,是代碼運行的時候,運用New關鍵字創建對象。雖然對象不能存放在寄存器中,但是我們知道通過棧指針,可以通過獲得處理器的支持,指針向上移動則釋放原有對象的內存,指針向下移動,則爲對象分配內存。相比而言,效率也是很高的。但是由於有些java的對象都是在運行的時候就才創建對象,因此不能把對象存放在棧裏面。
這裏我們需要明白一些概念,因爲java是面向對象的語言,所以對於一些基礎變量也可以把它看做對象。這些對象是java提供能夠的標準對象,我們是無法修改的。這就是對象創建第一個時期。即這些基礎變量在程序開發過程中即可創建。下面繼續迴歸到爲什麼棧中不適合存放我們自己創建的對象。由於我們在棧中創建對象的時候必須預先知道這些對象佔多大字節,生命週期是多少等等一些信息。而對於基礎變量來說自己數根據變量類型都是可以確定,因此可以把這些所謂的對象存放在棧裏面。而用戶自己創建的對象由於並不知道需要分配多少的內存纔可以完整的記錄下對象的信息,這樣棧指針也無法知道便宜多少。所以就不適合存放在棧中。


第三種: 棧、堆
由於堆中沒有棧指針,所以就不能獲得處理器的支持,所以相比而言效率就不是太高。和棧相比就有一定的差距。因此new出來的對象都保存在堆中。因爲java編譯器不需要知道從堆裏分配多少內存給對象,所以也是最靈活的,不需要記錄太多的分配內存信息。系統會自動給對象分配一個內存。當然,最大的不足之處就是,在堆中創建對象和分配內存區域比棧中要慢的很多。


第三種: 靜態區域
java中一些特殊的區域,也就是用static修飾的變量,都存放在這些靜態區域。必須明確,所謂的靜態區域就是java虛擬機會在一些固定的一篇內存上面存放一些數據。由於它是在固定的位置上面,因此當需要這個數據的時候就可以直接訪問,因此效率會很高。所以,我們要儘量使用static定義一些變量,因爲他的訪問速度是很高的。




 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章