當前位置:首頁 » 服務存儲 » jvm將數組存儲在堆或棧中
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

jvm將數組存儲在堆或棧中

發布時間: 2022-05-09 07:33:05

⑴ java在存儲數組時棧內存和堆內存的聯系

先這樣分開寫,方便解釋
int[] a=null;//聲明數組,也是引用
a=new int[5];//分配內存地址。

好了,數組的引用,也就是a,當你在聲明的時候,他會在棧中開辟一個地址空間。也就是第一步
第二步的作用,是在堆中開辟一系統連續的地址,具體的需要根據你的類型還有數組長度。

總結下,也是,數組的引用保存在棧中,同時實例的時候在堆中開辟連續空間,棧中的空間指向堆的首地址。

再稍微說明一下,為什麼我們平常說不new不可以對數組進行操作呢??因為此時堆中沒有分配內存地址。所以你的數據沒有地方存放和操作。

⑵ JVM管理內存空間堆和棧的區別

1、棧區(stacksegment)—由編譯器自動分配釋放,存放函數的參數值,局部變數的值等,具體方法執行結束之後,系統自動釋放JVM內存資源;

2、堆區(heapsegment)—一般由程序員分配釋放,存放由new創建的對象和數組,jvm不定時查看這個對象,如果沒有引用指向這個對象就回收;

3、全局變數區(datasegment)—存放全局變數,靜態變數和字元串常量,不釋放;

4、代碼區(codesegment)—存放程序中方法的二進制代碼,而且是多個對象共享一個代碼空間區域。

⑶ java類中成員變數初始化後存放在堆內存中還是棧內存中

棧內存:某一個函數被調用時,這個函數會在棧內存裡面申請一片空間,以後在這個函數內部定義的變數,都會分配到這個函數所申請到的棧。當函數運行結束時,分配給函數的棧空間被收回,在這個函數中被定義的變數也隨之被釋放和消失。

堆內存:通過new產生的數組和對象分配在堆內存中。堆內存中分配的內存,由JVM提供的GC(垃圾回收機制)來管理。在堆內存中產生了一個數組對象後,我們還可以在棧中定義一個變數,這個棧中變數的取值等於堆中對象的首地址。棧內存中的變數就成了堆內存中數組或者對象的引用變數。我們以後就可以在程序中直接使用棧中的這個變數來訪問我們在堆中分配的數組或者對象,引用變數相當於數組或者對象起的一個別名,或者代號。

引用變數是一個普通的變數,定義時在棧中分配;引用變數在被運行到它的作用域之外時就被釋放,而我們的數組和對象本身是在堆中分配的,即使程序運行到使用new產生對象的語句所在的函數或者代碼之後,我們剛才被產生的數組和對象也不會被釋放。數組和對象只是在沒有引用變數指向它,也就是沒有任何引用變數的值等於它的首地址,它才會變成垃圾不會被使用,但是它任然占據著內存空間不放(這也就是我們Java比較吃內存的一個原因),在隨後一個不確定的時間被垃圾回收器收走。

⑷ Java數組中的元素存在棧中還是堆中

Java數組中的元素存在

⑸ java 哪些數據存放在棧中哪些存放在堆中

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

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

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

⑹ Java數組是存儲在內存中的什麼地方

因為我也不清楚你理解的內存指啥,說我的理解,猜測一下,但願符合你的理解:
對程序而言,內存分為:
a、靜態區塊或叫全局區塊,指程序載入的時候就分配的固定存儲區;
b、棧內存,代碼塊執行的時候動態分配的內存塊,代碼運行完後,操作系統或運行平台負責自動回收這部分使用的內存。
c、堆內存塊,由操作系統提供api程序自由分配管理的內存塊。
java的內存管理機制,我個人認為是黑盒的,寫java也很少有人去關心,但是如果看虛擬機的實現源碼還是能知道的。(樓主懂c由興趣自己看)。那麼從逆向工程的角度我們可以猜測到:
靜態類,靜態變數,存儲在,靜態區塊中。
類本身代碼需要時再載入到內存中,java的動態代理實現的根本。既然是動態載入肯定是在堆中,不過載入進來的類代碼可能永不會銷毀(虛擬機運行區間內,可以加快運行平台的處理速度,java屬於半編譯半解釋的一門語言,要解釋執行的是預先編譯好的指令,就是class類文件)。
我們創建的任何對象,時間是隨機的,創建的時候才會分配內存,必然在堆上。虛擬機的垃圾回收機制要管理的剛好是這部分內存。
類中的方法,或靜態代碼塊必定運行在占上,代碼運行完,內存立即回收。此處有個例外,不同於c語言或操作系統實現。在方法中返回的任何對象:c需要動態分配存儲空間,兵自行管理,或者申明為全局局部靜態存儲,代碼運行完,對象才能保留下來。java可以直接保留下來。說明虛擬機自動給我們申請了動態內存保存對象。此處分配的內存也需要垃圾回收機制管理。沒門語言都有原始類型,方法或函數中返回的原始類型不需要從堆上分配內存,直接復制給接收變數,或代碼運行的形參所分配的空間中即可。
從操作系統理解,內存分為內核使用的內存與程序使用的內存,java運行在虛擬機上,虛擬機運行在操作系統上,內核內存屬於操作系統自用內存,由操作系統負責管理,運用程序不能直接管理分配內核內存。應用程序可管理的是分配給自己的運行空間。因此java使用內存屬於應用程序內存。內核內存管理方式windows與unix實現管理方式不一樣,最大差別windows的每一個程序,內核需要使用掉一部分地址空間,餘下的留給應用程序。如32位系統,總共可以使用的地址空間是4G內核要用掉其中1G或者2G。但是unix實現的系統應用程序可以直接使用4G地址空間。有興趣請參考操作系統內核相關書籍。

⑺ 數組保存在堆里還是棧里

保存在棧里的
new或malloc操作才會從堆申請內存

⑻ 分享帖供菜鳥看一下:數組到底是在棧中還是在堆中的

數組的值在堆中保存,數組變數本身在棧中保存,引用指向第一個元素