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