国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 簡述JAVA中堆內(nèi)存與棧內(nèi)存的區(qū)別

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

2020-07-18 12:19zsq_fengchen Java教程

這篇文章主要介紹了JAVA中堆內(nèi)存與棧內(nèi)存的區(qū)別,文中講解非常細致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

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

一、棧內(nèi)存

      存放基本類型的變量,對象的引用和方法調(diào)用,遵循先入后出的原則。
      棧內(nèi)存在函數(shù)中定義的“一些基本類型的變量和對象的引用變量”都在函數(shù)的棧內(nèi)存中分配。當在一段代碼塊定義一個變量時,Java就在棧中為這個變量分配內(nèi)存空間,當超過變量的作用域后,Java會自動釋放掉為該變量所分配的內(nèi)存空間,該內(nèi)存空間可以立即被另作他用。

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

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

二、堆內(nèi)存

     存放所有new出來的對象和數(shù)組

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

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

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

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

       棧與堆都是Java用來在Ram中存放數(shù)據(jù)的地方。與C ++不同,Java自動管理棧和堆,程序員不能直接設(shè)置棧或堆

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

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

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

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

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

總結(jié):

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

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

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

以上就是簡述JAVA中堆內(nèi)存與棧內(nèi)存的區(qū)別的詳細內(nèi)容,更多關(guān)于JAVA中堆內(nèi)存與棧內(nèi)存的資料請關(guān)注服務(wù)器之家其它相關(guān)文章!

原文鏈接:https://www.cnblogs.com/zhaosq/p/10039739.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久久精品综合 | 国产精品中文字幕在线 | 亚洲一区二区在线看 | 伊人网站 | 亚洲精品久久久久久久久久久久久 | 欧美日韩国产免费 | 久久精品日韩 | 成人在线免费电影 | 色综合久久久久 | 久久综合亚洲精品 | 免费看的毛片 | 久久久久久91 | 国产精品成人一区二区三区夜夜夜 | 99久久精品国产一区二区三区 | 午夜色福利 | 亚洲播放 | 日本视频在线 | 九九九久久久久久 | 久久99精品国产麻豆婷婷洗澡 | 成年人在线免费观看视频网站 | 91正在播放| 国产亚洲精品女人久久久久久 | 日韩成人在线播放 | 久久久精品一区二区 | 久久精品中文字幕 | 日韩精品久久久久 | 久久99久久久久久 | 91精品国产一区二区三区四区在线 | 成人高清视频在线观看 | 日本在线中文 | 亚洲午夜网站 | 成人免费一区二区三区视频网站 | 欧美中文字幕一区二区 | 青青草国产精品 | 久久黄色 | a∨色狠狠一区二区三区 | 九九热在线视频观看这里只有精品 | 亚洲wu码| 一区二区蜜桃 | 亚洲第一视频网站 | 黄色免费在线视频 |