⑴ JAVA中的類成員變數是存在堆還是棧裡面呀
類的成員變數都在堆上,只有方法裡面定義的基礎變數,在方法裡面定義的引用
其他對象的引用放在棧上(這個時候被引用的對象和它的成員變數還是在堆上)
也就是說,線程上下文的東西在棧上,其他統統在堆上。
⑵ c++的成員變數是在堆還是棧區
成員變數並不能決定自身的存儲空間位置。決定存儲位置的對象的創建方式。
即:
如果對象是函數內的非靜態局部變數,則對象,對象的成員變數保存在棧區。
如果對象是全局變數,則對象,對象的成員變數保存在靜態區。
如果對象是函數內的靜態局部變數,則對象,對象的成員變數保存在靜態區。
如果對象是new出來的,則對象,對象的成員變數保存在堆區。
⑶ java里的靜態成員變數是放在了堆內存還是棧內
這個要看對象是否為逃逸對象,如果為非逃逸對象,會根據標量替換來把對象分解成若干個被這個方法使用的成員變數所代替,這些代替的成員變數在棧幀或寄存器上分配空間
⑷ java中成員變數都儲存在棧內存中嗎
一個完整的Java程序運行過程會涉及以下內存區域:
寄存器:JVM內部虛擬寄存器,存取速度非常快,程序不可控制。
棧:保存局部變數的值,包括:1.用來保存基本數據類型的值;2.保存類的實例,即堆區對象的引用(指針)。也可以用來保存載入方法時的幀。
堆:用來存放動態產生的數據,比如new出來的對象。注意創建出來的對象只包含屬於各自的成員變數,並不包括成員方法。因為同一個類的對象擁有各自的成員變數,存儲在各自的堆中,但是他們共享該類的方法,並不是每創建一個對象就把成員方法復制一次。
常量池:JVM為每個已載入的類型維護一個常量池,常量池就是這個類型用到的常量的一個有序集合。包括直接常量(基本類型,String)和對其他類型、方法、欄位的符號引用。池中的數據和數組一樣通過索引訪問。由於常量池包含了一個類型所有的對其他類型、方法、欄位的符號引用,所以常量池在Java的動態鏈接中起了核心作用。常量池存在於堆中。
代碼段:用來存放從硬碟上讀取的源程序代碼。
數據段:用來存放static定義的靜態成員。
對於局部變數,如果是基本類型,會把值直接存儲在棧;如果是引用類型,比如String s = new String("william");會把其對象存儲在堆,而把這個對象的引用(指針)存儲在棧。
再如
String s1 = new String(「william」);
String s2 = s1;
s1和s2同為這個字元串對象的實例,但是對象只有一個,存儲在堆,而這兩個引用存儲在棧中。
類的成員變數在不同對象中各不相同,都有自己的存儲空間(成員變數在堆中的對象中),基本類型和引用類型的成員變數都在這個對象的空間中,作為一個整體存儲在堆。而類的方法卻是該類的所有對象共享的,只有一套,對象使用方法的時候方法才被壓入棧,方法不使用則不佔用內存。
⑸ 變數存儲位置和堆棧的區別
從而可以知道虛擬地址空間的分配:
棧空間存放局部變數,函數形參
堆空間存放malloc,relloc,calloc分配空間、
數據段裡面有BSS區,rodate區,date區,BSS存放未初始化全局變數,rodate存放常量,date存放全局變數和static修飾的變數
堆和棧的區別:
1 堆是先進先出,而棧是現金後出
2 堆的管理許可權是系統,而棧的是用戶
3 堆中未初始化的變數,為0,而棧中是隨機值
下面是網上的幾點區別:
4 申請空間的響應不同:
棧:只要棧的剩餘空間大於所申請空間,系統將為程序提供內存,否則將報異常提示棧溢出。
堆:首先應該知道操作系統有一個記錄空閑內存地址的鏈表,當系統收到程序的申請時,會遍歷該鏈表,尋找第一個空間大於所申請空間的堆結點,然後將該結點從空閑結點鏈表中刪除,並將該結點的空間分配給程序,另外,對於大多數系統,會在這塊內存空間中的首地址處記錄本次分配的大小,這樣,代碼中的 delete語句才能正確的釋放本內存空間。另外,由於找到的堆結點的大小不一定正好等於申請的大小,系統會自動的將多餘的那部分重新放入空閑鏈表中。
5 效率
棧由系統自動分配,速度較快。但程序員是無法控制的。
堆是由new分配的內存,一般速度比較慢,而且容易產生內存碎片,不過用起來最方便.
6 申請大小的限制
棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在 WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數),如果申請的空間超過棧的剩餘空間時,將提示overflow。因此,能從棧獲得的空間較小。
堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是由於系統是用鏈表來存儲的空閑內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。
7.堆和棧中的存儲內容
棧: 在函數調用時,第一個進棧的是主函數中函數調用後的下一條指令(函數調用語句的下一條可執行語句)的地址,然後是函數的各個參數,在大多數的C編譯器中,參數是由右往左入棧的,然後是函數中的局部變數。注意靜態變數是不入棧的。
當本次函數調用結束後,局部變數先出棧,然後是參數,最後棧頂指針指向最開始存的地址,也就是主函數中的下一條指令,程序由該點繼續運行。
堆:一般是在堆的頭部用一個位元組存放堆的大小。堆中的具體內容有程序員安排。
⑹ c語言里什麼變數存儲在堆中什麼變數存儲在棧中啊!
函數的局部變數、參數一般在棧中分配空間存儲
也不是絕對的,編譯器可能會優化使用寄存器傳遞參數
不過可以顯式地規定函數的參數傳遞方式,可以查一下stdcall,fastcall等宏的具體定義和作用
局部變數中的靜態變數的空間在數據段中,不在棧中
程序中動態分配的空間,如malloc分配的空間位於堆中
⑺ JAVA變數存放在棧中還是存放在堆中
靜態變數是在棧中, 對象變數在堆中