Posted on 2009-01-20 11:59
Astro.Qi 閱讀(614)
評論(0) 編輯 收藏 所屬分類:
Java
在中文里,Stack可以翻譯為“堆棧”,計(jì)算機(jī)術(shù)語里面堆和棧開頭的詞語有:
堆存儲(chǔ): heapstorage 堆存儲(chǔ)分配: heapstorage allocation 堆存儲(chǔ)管理: heap storage management
棧編址: stack addressing 棧變換:stack transformation 棧存儲(chǔ)器:stack memory 棧單元: stack cell
接著,總結(jié)在Java里面Heap和Stack分別存儲(chǔ)數(shù)據(jù)的不同。
|
Heap(堆) |
Stack(棧) |
JVM中的功能 |
內(nèi)存數(shù)據(jù)區(qū) |
內(nèi)存指令區(qū) |
存儲(chǔ)數(shù)據(jù) |
對象實(shí)例(1) |
基本數(shù)據(jù)類型, 指令代碼,常量,對象的引用地址(2) |
1. 保存對象實(shí)例,實(shí)際上是保存對象實(shí)例的屬性值,屬性的類型和對象本身的類型標(biāo)記等,并不保存對象的方法(方法是指令,保存在stack中)。
對象實(shí)例在heap中分配好以后,需要在stack中保存一個(gè)4字節(jié)的heap內(nèi)存地址,用來定位該對象實(shí)例在heap中的位置,便于找到該對象實(shí)例。
2. 基本數(shù)據(jù)類型包括byte、int、char、long、float、double、boolean和short。
函數(shù)方法屬于指令.
=======================
引用網(wǎng)上廣泛流傳的“Java堆和棧的區(qū)別”里面對堆和棧的介紹;
"Java
的堆是一個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū),類的(對象從中分配空間。這些對象通過new、newarray、anewarray和multianewarray等指令建
立,它們不需要程序代碼來顯式的釋放。堆是由垃圾回收來負(fù)責(zé)的,堆的優(yōu)勢是可以動(dòng)態(tài)地分配內(nèi)存大小,生存期也不必事先告訴編譯器,因?yàn)樗窃谶\(yùn)行時(shí)動(dòng)態(tài)分
配內(nèi)存的,Java的垃圾收集器會(huì)自動(dòng)收走這些不再使用的數(shù)據(jù)。但缺點(diǎn)是,由于要在運(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存,存取速度較慢。"
“棧的優(yōu)勢是,存取速度比堆要快,僅次于寄存器,棧數(shù)據(jù)可以共享。但缺點(diǎn)是,存在棧中的數(shù)據(jù)大小與生存期必須是確定的,缺乏靈活性。棧中主要存放一些基本
類型的變量(,int, short, long, byte, float, double, boolean, char)和對象句柄。 ”
可見,垃圾回收GC是針對堆Heap的,而棧因?yàn)楸旧硎荈ILO - first in, last out. 先進(jìn)后出,能夠自動(dòng)釋放。 這樣就能明白到new創(chuàng)建的,都是放到堆Heap!