色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

簡述JAVA中堆內存與棧內存的區別

瀏覽:2日期:2022-08-28 18:20:32

Java把內存劃分成兩種:一種是棧內存,一種是堆內存。

一、棧內存

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

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

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

二、堆內存

存放所有new出來的對象和數組

特此強調,堆內存和數據結構中的堆完全是兩碼事,分配方式倒是類似于鏈表

堆內存是區別于棧區、全局數據區和代碼區的另一個內存區域。堆允許程序在運行時動態地申請某個大小的內存空間,堆內存實際上指的就是(滿足堆內存性質的)優先隊列的一種數據結構,第1個元素有最高的優先權。

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

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

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

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

三、其他數據存儲

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

堆內存和棧內存的區別:

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

總結:

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

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

3 靜態存儲區:內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。它主要存放靜態數據、全局數據和常量。

以上就是簡述JAVA中堆內存與棧內存的區別的詳細內容,更多關于JAVA中堆內存與棧內存的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 999久久久精品视频在线观看 | 精品99视频 | 国产精品欧美一区二区三区不卡 | 欧洲美女与男人做爰 | 欧美xxxxbbb| 国产日韩欧美视频 | 国产精品国产三级国产普通 | 亚洲香蕉一区二区三区在线观看 | 高清 国产 日韩 欧美 | 久久精品免费观看 | 亚洲综合一 | 欧美一区二区三区免费高 | 日本三级香港三级少妇 | www.色片| 日韩三级视频 | 欧美毛片a级毛片免费观 | 日本一本久道 | 黄色美女毛片 | 精品久久网 | 国产盗摄精品一区二区三区 | 日韩中文精品亚洲第三区 | 日本免费的一级绿象 | 国产亚洲免费观看 | 操她视频网站 | 亚洲系列中文字幕一区二区 | 久久视频在线观看免费 | 欧美成成人免费 | 日韩一区二区三区在线播放 | 九九精品激情在线视频 | 在线视频一区二区三区四区 | 欧美国产伦久久久久 | 韩国一级特黄清高免费大片 | 精品一区视频 | 热热涩热热狠狠色香蕉综合 | 天天黄色片 | 欧美刺激午夜性久久久久久久 | 国产一二区 | 成人亚洲欧美综合 | 免费一级欧美片片线观看 | 中文字幕亚洲欧美 | 萌白酱福利视频在线网站 |