Java中的堆棧
堆和棧是內(nèi)存中兩處不一樣的地方
- 基本類型错英,引用類型變量入撒,方法,main()存在棧中椭岩,棧的優(yōu)勢是茅逮,存取速度比堆要快,僅次于寄存器判哥,棧數(shù)據(jù)可以共享献雅。但缺點是,存在棧中的數(shù)據(jù)大小與生存期必須是確定的塌计,缺乏靈活性挺身。
- 存放實例對象、由new創(chuàng)建的對象和數(shù)組锌仅。在堆中分配的內(nèi)存章钾,由Java虛擬機自動垃圾回收器來管理。在堆中產(chǎn)生了一個數(shù)組或者對象后技扼,還可以在棧中定義一個特殊的變量伍玖,這個變量的取值等于數(shù)組或者對象在堆內(nèi)存中的首地址,在棧中的這個特殊的變量就變成了數(shù)組或者對象的引用變量剿吻,以后就可以在程序中使用棧內(nèi)存中的引用變量來訪問堆中的數(shù)組或者對象窍箍,引用變量相當(dāng)于為數(shù)組或者對象起的一個別名,或者代號丽旅。引用變量是普通變量椰棘,定義時在棧中分配內(nèi)存,引用變量在程序運行到作用域外釋放榄笙。而數(shù)組&對象本身在堆中分配邪狞,即使程序運行到使用new產(chǎn)生數(shù)組和對象的語句所在地代碼塊之外,數(shù)組和對象本身占用的堆內(nèi)存也不會被釋放茅撞,數(shù)組和對象在沒有引用變量指向它的時候帆卓,才變成垃圾巨朦,不能再被使用,但是仍然占著內(nèi)存剑令,在隨后的一個不確定的時間被垃圾回收器釋放掉糊啡。這個也是java比較占內(nèi)存的主要原因,實際上吁津,棧中的變量指向堆內(nèi)存中的變量棚蓄,這就是 Java 中的指針!
class Person {
int age;
}
public class LearnHeap {
public static void main(String args[]){
int a=10;
Person person = new Person();
person.age =20;
change(a,person);
System.out.println("a="+ a+",and person.age = "+person.age);
}
static void change(int a1, Person person){
a1 = 11;
person.age= 21;
System.out.println("a1="+ a1+",and age1 = "+person);
}
}
jmx 連接未釋放
使用Groovy return 不能跳出each 循環(huán)