程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> java內存的思考與總結

java內存的思考與總結

編輯:J2ME

1. Java中堆與棧

在Java程序運行時,有6個處所可以用於保留數據:
(1) 存放器。最快的保留區域,位於處理器內部,數目十分有限,它是根據需要由編譯器分配。我們對此沒有直接的把持權.

(2)棧(stack)。駐留於慣例RAM(隨機拜訪存儲器)區域,這是一種特別快、特別有效的數據保留方法,僅次於存放器。創立程序時,Java編譯器必需准確地知道堆棧內保留的所有數據的“長度”以及“存在時間”。這失往了必定的機動性,因此對象句柄是存放在棧中,但Java對象並不放到其中。

(3)堆(heap)。保留了Java對象。和棧不同,它最吸引人的處所在於編譯器不必知道要從堆裡分配多少存儲空間,也不必知道存儲的數據要在堆裡停留多長的時間。因此,用堆保留數據時會得到更大的機動性。請求創立一個對象時,只需用new命令編制相干的代碼即可。履行這些代碼時,會在堆裡主動進行數據的保留。當然,為達到這種機動性,必定會付出必定的代價:在堆裡分配存儲空間時會花掉更長的時間!

(4) 靜態存儲。這兒的“靜態”(Static)是指“位於固定地位”(盡管也在RAM裡)。程序運行期間,靜態存儲的數據將隨時等候調用。可用static要害字指出一個對象的特定元素是靜態的。但Java對象本身永遠都不會置進靜態存儲空間。

(5) 常數存儲。常數值通常直接置於程序代碼內部。這樣做是安全的,由於它們永遠都不會轉變。有的常數需要嚴格地保護,所以可考慮將它們置進只讀存儲器(ROM)。

(6) 非RAM存儲。數據完整獨立於一個程序之外,則程序不運行時仍可存在,並在程序的把持范疇之外。

2.堆和棧的差別

棧與堆都是Java用來在Ram中存放數據的處所。與C 不同,Java主動治理棧和堆,程序員不能直接地設置棧或堆。

Java的堆是一個運行時數據區,類的(對象從中分配空間。這些對象通過new、newarray、anewarray和multianewarray等指令建立,它們不需要程序代碼來顯式的開釋。堆是由垃圾回收來負責的,堆的上風是可以動態地分配內存大小,生存期也不必事先告訴編譯器,由於它是在運行時動態分配內存的,Java的垃圾收集器會主動收走這些不再應用的數據。但毛病是,由於要在運行時動態分配內存,存取速度較慢。

棧的上風是,存取速度比堆要快,僅次於存放器,棧數據可以共享。但毛病是,存在棧中的數據大小與生存期必需是斷定的,缺乏機動性。棧中重要存放一些基礎類型的變量(,int, short, long, byte, float, double, boolean, char)和對象句柄。

棧有一個很重要的特別性,就是存在棧中的數據可以共享。假設我們同時定義:


int a = 3;
int b = 3;
編譯器先處理int a =3;首先它會在棧中創立一個變量為a的引用,然後查找棧中是否有3這個值,假如沒找到,就將3存放進來,然後將a指向3。接著處理int b =3;在創立完b的引用變量後,由於在棧中已經有3這個值,便將b直接指向3。這樣,就呈現了a與b同時均指向3的情況。

這時,假如再令a=4;那麼編譯器會重新搜索棧中是否有4值,假如沒有,則將4存放進來,並令a指向4;假如已經有了,則直接將a指向這個地址。因此a值的轉變不會影響到b的值。

要留心這種數據的共享與兩個對象的引用同時指向一個對象的這種共享是不同的,由於這種情況a的修正並不會影響到b, 它是由編譯器完成的,它有利於節儉空間。而一個對象引用變量修正了這個對象的內部狀態,會影響到另一個對象引用變量。

String是一個特別的包裝類數據。可以用:
String str = new String(

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved