什么是堆棧?
Java把內(nèi)存分成兩種,一種叫做棧內(nèi)存舵稠,一種叫做堆內(nèi)存。
棧內(nèi)存:
在函數(shù)中定義的一些基本類型的變量和對(duì)象的引用變量都是在函數(shù)的棧內(nèi)存中分配乳讥。當(dāng)在一段代碼塊中定義一個(gè)變量時(shí)柱查,java就在棧中為這個(gè)變量分配內(nèi)存空間,當(dāng)超過(guò)變量的作用域后云石,java會(huì)自動(dòng)釋放掉為該變量分配的內(nèi)存空間,該內(nèi)存空間可以立刻被另作他用研乒。
堆內(nèi)存:
堆內(nèi)存用于存放由new創(chuàng)建的對(duì)象和數(shù)組汹忠。在堆中分配的內(nèi)存,由java虛擬機(jī)自動(dòng)垃圾回收器來(lái)管理雹熬。在堆中產(chǎn)生了一個(gè)數(shù)組或者對(duì)象后宽菜,還可以在棧中定義一個(gè)特殊的變量,這個(gè)變量的取值等于數(shù)組或者對(duì)象在堆內(nèi)存中的首地址竿报,在棧中的這個(gè)特殊的變量就變成了數(shù)組或者對(duì)象的引用變量铅乡,以后就可以在程序中使用棧內(nèi)存中的引用變量來(lái)訪問(wèn)堆中的數(shù)組或者對(duì)象,引用變量相當(dāng)于為數(shù)組或者對(duì)象起的一個(gè)別名烈菌,或者代號(hào)阵幸。
引用變量是普通變量,定義時(shí)在棧中分配內(nèi)存芽世,引用變量在程序運(yùn)行到作用域外釋放挚赊。而數(shù)組&對(duì)象本身在堆中分配,即使程序運(yùn)行到使用new產(chǎn)生數(shù)組和對(duì)象的語(yǔ)句所在地代碼塊之外济瓢,數(shù)組和對(duì)象本身占用的堆內(nèi)存也不會(huì)被釋放荠割,數(shù)組和對(duì)象在沒(méi)有引用變量指向它的時(shí)候,才變成垃圾旺矾,不能再被使用蔑鹦,但是仍然占著內(nèi)存夺克,在隨后的一個(gè)不確定的時(shí)間被垃圾回收器釋放掉。這個(gè)也是java比較占內(nèi)存的主要原因嚎朽,實(shí)際上懊直,棧中的變量指向堆內(nèi)存中的變量,這就是 Java 中的指針!
文章引用自博客園 @蠱惑Into:Java中堆內(nèi)存和棧內(nèi)存詳解