欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

簡(jiǎn)述JAVA中堆內(nèi)存與棧內(nèi)存的區(qū)別

 更新時(shí)間:2020年07月18日 10:23:58   作者:zsq_fengchen  
這篇文章主要介紹了JAVA中堆內(nèi)存與棧內(nèi)存的區(qū)別,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

Java把內(nèi)存劃分成兩種:一種是棧內(nèi)存,一種是堆內(nèi)存。

一、棧內(nèi)存

      存放基本類型的變量,對(duì)象的引用和方法調(diào)用,遵循先入后出的原則。
      棧內(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)存空間可以立即被另作他用。

        Java中的代碼是在函數(shù)體中執(zhí)行的,每個(gè)函數(shù)主體都會(huì)被放在棧內(nèi)存中,比如main函數(shù)。假如main函數(shù)里調(diào)用了其他的函數(shù),比如add(),那么在棧里面的的存儲(chǔ)就是最底層是main,mian上面是add。棧的運(yùn)行時(shí)后入先出的,所以會(huì)執(zhí)行時(shí)會(huì)先銷毀add,再銷毀main。

        棧的優(yōu)勢(shì)是,棧內(nèi)存與堆內(nèi)存相比是非常小的,存取速度比堆要快,僅次于寄存器,棧數(shù)據(jù)可以共享。但缺點(diǎn)是,存在棧中的數(shù)據(jù)大小與生存期必須是確定的,缺乏靈活性。棧中主要存放一些基本類型的變量(int, short, long, byte, float, double, boolean, char)和對(duì)象句柄。棧有一個(gè)很重要的特殊性,就是存在棧中的數(shù)據(jù)可以共享。

二、堆內(nèi)存

     存放所有new出來(lái)的對(duì)象和數(shù)組

     特此強(qiáng)調(diào),堆內(nèi)存和數(shù)據(jù)結(jié)構(gòu)中的堆完全是兩碼事,分配方式倒是類似于鏈表

     堆內(nèi)存是區(qū)別于棧區(qū)、全局?jǐn)?shù)據(jù)區(qū)和代碼區(qū)的另一個(gè)內(nèi)存區(qū)域。堆允許程序在運(yùn)行時(shí)動(dòng)態(tài)地申請(qǐng)某個(gè)大小的內(nèi)存空間,堆內(nèi)存實(shí)際上指的就是(滿足堆內(nèi)存性質(zhì)的)優(yōu)先隊(duì)列的一種數(shù)據(jù)結(jié)構(gòu),第1個(gè)元素有最高的優(yōu)先權(quán)。

      在堆內(nèi)存分配時(shí)首先應(yīng)該知道操作系統(tǒng)有一個(gè)記錄空閑內(nèi)存地址的鏈表,當(dāng)系統(tǒng)收到程序的申請(qǐng)時(shí),會(huì)遍歷該鏈表,尋找第一個(gè)空間大于所申請(qǐng)空間的堆結(jié)點(diǎn),然后將該結(jié)點(diǎn)從空閑結(jié)點(diǎn)鏈表中刪除,并將該結(jié)點(diǎn)的空間分配給程序,另外,對(duì)于大多數(shù)系統(tǒng),會(huì)在這塊內(nèi)存空間中的首地址處記錄本次分配的大小,這樣,代碼中的delete語(yǔ)句才能正確的釋放本內(nèi)存空間。

       另外,由于找到的堆結(jié)點(diǎn)的大小不一定正好等于申請(qǐng)的大小,系統(tǒng)會(huì)自動(dòng)的將多余的那部分重新放入空閑鏈表中。堆內(nèi)存是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域。這是由于系統(tǒng)是用鏈表來(lái)存儲(chǔ)的空閑內(nèi)存地址的,自然是不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址。堆內(nèi)存的大小受限于計(jì)算機(jī)系統(tǒng)中有效的虛擬內(nèi)存。由此可見(jiàn),堆內(nèi)存獲得的空間比較靈活,也比較大。堆內(nèi)存是由new分配的內(nèi)存,一般速度比較慢,而且容易產(chǎn)生內(nèi)存碎片,不過(guò)用起來(lái)最方便。

       棧與堆都是Java用來(lái)在Ram中存放數(shù)據(jù)的地方。與C ++不同,Java自動(dòng)管理?xiàng):投?,程序員不能直接設(shè)置?;蚨?/strong>

       Java的堆是一個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū),類的(對(duì)象從中分配空間。這些對(duì)象通過(guò)新的,newarray,anewarray和multianewarray等指令建立,它們不需要程序代碼來(lái)顯式的釋放。堆是由垃圾回收來(lái)負(fù)責(zé)的,堆的優(yōu)勢(shì)是可以動(dòng)態(tài)地分配內(nèi)存大小,生存期也不必事先告訴編譯器,因?yàn)樗窃谶\(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存的,Java的的垃圾收集器會(huì)自動(dòng)收走這些不再使用的數(shù)據(jù)。但缺點(diǎn)是,由于要在運(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存,存取速度較慢。

三、其他數(shù)據(jù)存儲(chǔ)

    1、常量池:存放基本類型常量和字符串常量(public static final)
    2、靜態(tài)域:存放靜態(tài)成員(static定義的)
    3、非RAM存儲(chǔ):硬盤等永久存儲(chǔ)空間

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

   1、應(yīng)用程序所有的部分都使用堆內(nèi)存,然后棧內(nèi)存通過(guò)一個(gè)線程運(yùn)行來(lái)使用。
   2、不論對(duì)象什么時(shí)候創(chuàng)建,他都會(huì)存儲(chǔ)在堆內(nèi)存中,棧內(nèi)存包含它的引用。棧內(nèi)存只包含原始值變量好和堆中對(duì)象變量的引用。
   3、存儲(chǔ)在堆中的對(duì)象是全局可以被訪問(wèn)的,然而棧內(nèi)存不能被其他線程所訪問(wèn)。
   4、棧中的內(nèi)存管理使用LIFO的方式完成,而堆內(nèi)存的管理要更復(fù)雜了,因?yàn)樗侨直辉L問(wèn)的。
   5、棧內(nèi)存是生命周期很短的,然而堆內(nèi)存的生命周期從程序的運(yùn)行開(kāi)始到運(yùn)行結(jié)束。
   6、我們可以使用-Xms和-Xmx JVM選項(xiàng)定義開(kāi)始的大小和堆內(nèi)存的最大值,我們可以使用-Xss定義棧的大小
   7、當(dāng)棧內(nèi)存滿的時(shí)候,Java拋出java.lang.StackOverFlowError異常而堆內(nèi)存滿的時(shí)候拋出java.lang.OutOfMemoryError: Java Heap Space錯(cuò)誤
   8、和堆內(nèi)存比,棧內(nèi)存要小的多,因?yàn)槊鞔_使用了內(nèi)存分配規(guī)則(LIFO),和堆內(nèi)存相比棧內(nèi)存非??臁?/p>

總結(jié):

   1 棧:為編譯器自動(dòng)分配和釋放,如函數(shù)參數(shù)、局部變量、臨時(shí)變量等等

   2 堆:為成員分配和釋放,由程序員自己申請(qǐng)、自己釋放。否則發(fā)生內(nèi)存泄露。典型為使用new申請(qǐng)的堆內(nèi)容。
        除了這兩部分,還有一部分是:

   3 靜態(tài)存儲(chǔ)區(qū):內(nèi)存在程序編譯的時(shí)候就已經(jīng)分配好,這塊內(nèi)存在程序的整個(gè)運(yùn)行期間都存在。它主要存放靜態(tài)數(shù)據(jù)、全局?jǐn)?shù)據(jù)和常量。

以上就是簡(jiǎn)述JAVA中堆內(nèi)存與棧內(nèi)存的區(qū)別的詳細(xì)內(nèi)容,更多關(guān)于JAVA中堆內(nèi)存與棧內(nèi)存的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 關(guān)于@Controller和@Restcontroller的那點(diǎn)奇葩事

    關(guān)于@Controller和@Restcontroller的那點(diǎn)奇葩事

    這篇文章主要介紹了關(guān)于@Controller和@Restcontroller的那點(diǎn)奇葩事,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • SpringBoot開(kāi)發(fā)中的組件和容器詳解

    SpringBoot開(kāi)發(fā)中的組件和容器詳解

    這篇文章主要介紹了SpringBoot開(kāi)發(fā)中的組件和容器詳解,SpringBoot 提供了一個(gè)內(nèi)嵌的 Tomcat 容器作為默認(rèn)的 Web 容器,同時(shí)還支持其他 Web 容器和應(yīng)用服務(wù)器,需要的朋友可以參考下
    2023-09-09
  • java實(shí)現(xiàn)開(kāi)根號(hào)的運(yùn)算方式

    java實(shí)現(xiàn)開(kāi)根號(hào)的運(yùn)算方式

    這篇文章主要介紹了java實(shí)現(xiàn)開(kāi)根號(hào)的運(yùn)算方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • java反射深入剖析(推薦)

    java反射深入剖析(推薦)

    下面小編就為大家?guī)?lái)一篇java反射深入剖析。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-07-07
  • Java代碼讀取文件緩存問(wèn)題解決

    Java代碼讀取文件緩存問(wèn)題解決

    最近遇到了一個(gè)Java文件讀取的緩存問(wèn)題,打遠(yuǎn)程斷點(diǎn)出現(xiàn)的也是原來(lái)的老代碼參數(shù),本文就介紹一下解決方法,感興趣的可以了解一下
    2021-05-05
  • 簡(jiǎn)單了解synchronized和lock的區(qū)別

    簡(jiǎn)單了解synchronized和lock的區(qū)別

    這篇文章主要介紹了簡(jiǎn)單了解synchronized和lock的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Spring Cloud OAuth2中/oauth/token的返回內(nèi)容格式

    Spring Cloud OAuth2中/oauth/token的返回內(nèi)容格式

    Spring Cloud OAuth2 生成access token的請(qǐng)求/oauth/token的返回內(nèi)容就需要自定義,本文就詳細(xì)介紹一下,感興趣的可以了解一下
    2021-07-07
  • 使用feign客戶端傳參接收不到的問(wèn)題及解決

    使用feign客戶端傳參接收不到的問(wèn)題及解決

    這篇文章主要介紹了使用feign客戶端傳參接收不到的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2022-03-03
  • Java Map集合用法詳解

    Java Map集合用法詳解

    Map用于保存具有映射關(guān)系的數(shù)據(jù),Map集合里保存著兩組值,一組用于保存Map的ley,另一組保存著Map的value;Map集合和查字典類似,通過(guò)key找到對(duì)應(yīng)的value,通過(guò)頁(yè)數(shù)找到對(duì)應(yīng)的信息。用學(xué)生類來(lái)說(shuō),key相當(dāng)于學(xué)號(hào),value對(duì)應(yīng)name,age,sex等信息。用這種對(duì)應(yīng)關(guān)系方便查找
    2021-10-10
  • java創(chuàng)建txt文件并寫入內(nèi)容的方法代碼示例

    java創(chuàng)建txt文件并寫入內(nèi)容的方法代碼示例

    這篇文章主要介紹了java創(chuàng)建txt文件并寫入內(nèi)容的兩種方法,分別是使用java.io.FileWriter和BufferedWriter,以及使用Java7的java.nio.file包中的Files和Path類,需要的朋友可以參考下
    2025-01-01

最新評(píng)論