溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中JVM、堆內(nèi)存和棧內(nèi)存的概念和區(qū)別是什么

發(fā)布時間:2022-02-23 15:56:03 來源:億速云 閱讀:179 作者:iii 欄目:開發(fā)技術

這篇文章主要介紹“Java中JVM、堆內(nèi)存和棧內(nèi)存的概念和區(qū)別是什么”,在日常操作中,相信很多人在Java中JVM、堆內(nèi)存和棧內(nèi)存的概念和區(qū)別是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java中JVM、堆內(nèi)存和棧內(nèi)存的概念和區(qū)別是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

JVM

JVM(全稱Java Virtual Machine),也就是Java虛擬機。

Java程序在運行的時候都要開辟一個空間,也就是說任何軟件在運行的時候都需要開辟空間,同樣JVM也不例外,也需要開辟空間。JVM運行時在內(nèi)存中開辟的內(nèi)存區(qū)域,啟動時在這片區(qū)域內(nèi)自己還會進行更細致的劃分,因為虛擬機中每片內(nèi)存處理的方式都不一樣,所以要分別單獨進行管理。

JVM內(nèi)存的劃分主要是下列五個:

  1. 寄存器

  2. 本地方法去

  3. 方法區(qū)

  4. 棧內(nèi)存

  5. 堆內(nèi)存

棧內(nèi)存

棧內(nèi)存里面存儲的都是局部變量。

什么是局部變量?凡是定義在方法中的都是局部變量,for循環(huán)內(nèi)定義的也是局部變量。

先加載函數(shù)才能進行局部變量的定義,所以在方法進棧后,然后再定義變量,變量是有自己的作用域,一旦離開這個作用域,變量就會馬上被釋放。也因此,棧內(nèi)存的更新速度非???,這也是因為局部變量的生命周期都很短。

堆內(nèi)存

堆內(nèi)存里面存儲的是數(shù)組和對象。(數(shù)組也算是對象的一種。)

什么是對象?凡是new建立的都是在堆中,堆中存放的都是實體(也就是對象)。

實體用于封裝數(shù)據(jù),而是封裝了多個,如果一個數(shù)據(jù)消失,這個實體卻沒消失,則還可以使用。所以堆是不會隨時釋放的,但是棧就不一樣了,棧里面存放的都是單個變量,變量被釋放了,就消失了。堆里的實體雖然不會被釋放,但會被Java垃圾回收機制當做垃圾不定時的收取。

例子:

int[] arr = new int[3];在內(nèi)存中是怎樣被定義的?

如圖所示,主函數(shù)首先進入了棧中,在棧中定義了一個arr的變量,但右邊不是一個具體值,是一個實體。

實體是被創(chuàng)建在堆內(nèi)存里面的,在堆里面首先通過new開辟了空間。內(nèi)存在存儲數(shù)據(jù)的時候,都是通過地址值來體現(xiàn)的,地址值是一塊連續(xù)的二進制,然后給這個實體分配了一個內(nèi)存地址。

數(shù)組都是有一個索引,數(shù)組這個實體在堆內(nèi)存中產(chǎn)生后每一個空間都會進行默認的初始化,不同的類型初始化的值不一樣。

所以在棧和堆當中分別創(chuàng)建了變量和實體。

    

那么棧內(nèi)存和堆內(nèi)存要怎么聯(lián)系起來?

前文提到,每個實體進入堆內(nèi)存后,都被分配一個內(nèi)存地址。把這個內(nèi)存地址賦給變量arr,arr就可以通過地址找到數(shù)組。所以arr想要操縱數(shù)組,就得通過地址,而不是直接把實體都賦給它。所以,這種我們不再稱呼為基本數(shù)據(jù)類型,而是引用數(shù)據(jù)類型,稱為arr引用了堆內(nèi)存當中的實體。

如果當 int[] arr = null;

arr不做任何指向,null的作用就是取消引用數(shù)據(jù)類型的指向。

當一個實體沒有引用數(shù)據(jù)類型指向的時候,是不會被釋放掉,而是會被當做垃圾。

Java有一個自動回收機制,會自動檢測堆里是否存有垃圾,如果有,那么就會回收垃圾,但是至于什么時候回收就不一定了。

堆內(nèi)存和棧內(nèi)存的區(qū)別

通過以上內(nèi)容,可以得出以下幾點不同:

  • 棧內(nèi)存存儲的是局部變量;堆內(nèi)存存儲的是實體。

  • 棧內(nèi)存的更新速度要快于堆內(nèi)存,是因為局部變量的生命周期短。

  • 棧內(nèi)存存放的變量一旦結(jié)束就會釋放;堆內(nèi)存存放的實體會被垃圾回收機制不定時回收。

到此,關于“Java中JVM、堆內(nèi)存和棧內(nèi)存的概念和區(qū)別是什么”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI