您好,登錄后才能下訂單哦!
本篇內容介紹了“java棧與堆是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
所有的java程序在運行時,都要在內存中開辟一個空間,并且在JVM(java虛擬機)運行的時候,會分得更加的細致,虛擬機中每一片內存的處理方式都是不一樣的,所以需要進行單獨的管理。
JVM的內存一共分為5種:
寄存器,本地方法區,方法區,堆內存,棧內存
今天我們主要講堆內存與棧內存。
棧內存:
棧內存主要儲存的是局部變量,也就是說,是定義在方法之內的,都叫局部變量。線程執行的時候調用方法的內存模型,當方法執行的時候,會創建一個叫“棧幀”的內存結構,棧幀會儲存該方法內用到的局部變量表,操作數棧、返回地址、動態連接等信息。(這里新手主要了解局部變量表與返回地址就好了,局部變量表顧名思義是用來儲存局部變量的,方法返回地址,是指方法在運行過程中,可能會正常退出,也可能會異常退出,但是不管哪種退出方式,都要讓調用者知道方法退出的位置,方法返回地址就是用來確定退出位置的。)一個方法從方法被調用開始,到方法執行結束,就是一個棧幀在java棧中從入棧到出棧的全過程。
堆內存:
堆內存儲存的是對象,也就是new出來的都在堆里,堆中存放的都是實體(對象),實體用于封裝數據,而且是封裝多個(實體的多個屬性),如果一個數據消失,這個實體也沒有消失,還可以用,所以堆是不會隨時釋放的,但是棧不一樣,棧里存放的都是單個變量,變量被釋放了,那就沒有了。堆里的實體雖然不會被釋放,但是會被當成垃圾,Java有垃圾回收機制不定時的收取。
通俗一點說堆和棧的區別:堆主要用來存放對象的,棧主要用來執行程序的。
那么棧和堆有什么不同呢,我們可以從幾個方面看待他們的不同!
順序:
棧是先進后出,堆是先進先出
緩存:
棧使用的是一級緩存, 他們通常都是被調用時處于存儲空間中,調用完畢立即釋放;
堆是存放在二級緩存中,生命周期由虛擬機的垃圾回收算法來決定(并不是一旦成為孤兒對象就能被回收)。所以調用這些對象的速度要相對來得低一些。
內存回收:
棧內存存放的變量生命周期一旦結束就會被釋放,而堆內存存放的實體會被垃圾回收機制不定時的回收。
申請效率:
棧:由系統自己分配,速度較快,但是程序員無法掌握。
堆:一般有兩種方法來申請內存,new和malloc,new是一種用算符而malloc是函數。由程序員申請出來的內存一般速度比較慢,而卻容易產生內存碎片,不過用起來比較方便,獲取的空間大,也相對較靈活。
“java棧與堆是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。