栈(stack)和堆(heap)
棧(stack)和堆(heap),
Java程序在運行時都要開辟空間,任何軟件在運行時都要在內(nèi)存中開辟空間,Java虛擬機運行時也是要開辟空間的。JVM運行時在內(nèi)存中開辟一片內(nèi)存區(qū)域,啟動時在自己的內(nèi)存區(qū)域中進行更細致的劃分,因為虛擬機中每一片內(nèi)存處理的方式都不同,所以要單獨進行管理。
????? JVM內(nèi)存的劃分有五片:
???? ? 1.???寄存器;
? ? ?? 2.???本地方法區(qū);
?? ? ? 3.???方法區(qū);
?????? 4.???棧內(nèi)存;
?????? 5.???堆內(nèi)存;
棧內(nèi)存:棧內(nèi)存首先是一片內(nèi)存區(qū)域,存儲的都是局部變量,凡是定義在方法中的都是局部變量(方法外的是全局變量),for循環(huán)內(nèi)部定義的也是局部變量,是先加載函數(shù)才能進行局部變量的定義,所以方法先進棧,然后再定義變量,變量有自己的作用域,一旦離開作用域,變量就會被釋放。棧內(nèi)存的更新速度很快,因為局部變量的生命周期都很短;
堆內(nèi)存:存儲的是數(shù)組和對象(其實數(shù)組就是對象),凡是new建立的都是在堆中,堆中存放的都是實體(對象),實體用于封裝數(shù)據(jù),而且是封裝多個(實體的多個屬性),如果一個數(shù)據(jù)消失,這個實體也沒有消失,還可以用,所以堆是不會隨時釋放的,但是棧不一樣,棧里存放的都是單個變量,變量被釋放了,那就沒有了。堆里的實體雖然不會被釋放,但是會被當成垃圾,Java有垃圾回收機制不定時的收取;
二者得關系簡單實例:
? 如果當int [] arr=null;
? arr不做任何指向,null的作用就是取消引用數(shù)據(jù)類型的指向。
? 當一個實體,沒有引用數(shù)據(jù)類型指向的時候,它在堆內(nèi)存中不會被釋放,而被當做一個垃圾,在不定時的時間內(nèi)自動回收,因為Java有一個自動回收機制;
?
堆與棧的區(qū)別:
1.棧內(nèi)存存儲的是局部變量而堆內(nèi)存存儲的是實體;
2.棧內(nèi)存的更新速度要快于堆內(nèi)存,因為局部變量的生命周期很短;
3.棧內(nèi)存存放的變量生命周期一旦結束就會被釋放,而堆內(nèi)存存放的實體會被垃圾回收機制不定時的回收
?
參考地址:https://blog.csdn.net/jianghao233/article/details/82777789
轉載于:https://www.cnblogs.com/wmqiang/p/10608392.html
總結
以上是生活随笔為你收集整理的栈(stack)和堆(heap)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ------------------字节
- 下一篇: Codeforces Round #49