jvm元空間與堆和棧的區別?
1內存分配策略
1)靜態存儲:在編譯時確定每個數據目標在運行時的存儲空間需求(沒有可改變的數據結構,代碼中沒有嵌套遞歸)。
2)堆棧存儲:編譯時數據需求未知,確定運行時模塊入口,動態分配存儲。當在操作過程中進入一個程序模塊時,在分配其內存之前,必須知道該程序模塊所需的數據區的大小。
3)堆存儲:編譯時和運行時的模塊條目無法確定,是動態分配的。
2Java內存模型中的堆和棧
1)兩者的關系:引用對象和數組時,棧中定義的變量存儲的是堆中目標的第一個地址。
2)兩者的區別:
(1)管理模式:棧自動釋放(對應方法完成),棧需要GC(垃圾收集機制)。
(2)空間大小:堆大于棧。
(3):堆產生的碎片比堆產生的碎片小得多。
(4)分配棧支持靜態和動態分配,堆只能動態分配。
(5)效率:堆比棧效率低。
(6)棧是線程私有的,堆是線程共享的。
C語言中有哪些存儲類型?
C語言中有四種存儲類型:auto、extern、register、static。存儲類型表示變量應該在進程的哪個段分配內存空間,數據區、BBS區、堆棧區、堆區都可以為變量分配內存存儲空間。
1.自動存儲類型
Auto只能用于標識局部變量的存儲類型。對于局部變量,auto是默認的存儲類型,不需要由display指定。因此,由auto標識的變量存儲在堆棧區域。
2.外部存儲類型
Extern用于聲明在當前項目的其他文件中定義的全局變量在當前文件中被引用。如果全局變量沒有初始化,它會被存儲在BBS區,編譯時它的值會自動賦為0。如果它已經被初始化,它將被存儲在數據區。全局變量的生命周期,無論是否初始化,都是整個程序運行的過程。為了節省內存空間,在當前文件中使用extern聲明其他文件中定義的全局變量時,不會為它們分配內存空間。
3.寄存器存儲類型
聲明為寄存器的變量從內存轉移到CPU寄存器后,會停留在CPU寄存器中,所以訪問寄存器變量會大大提高效率,因為在將變量從內存轉移到寄存器的過程中節省了幾個指令周期。
4.靜態存儲類型
聲明為靜態類型的變量,不管是全局的還是局部的,都存儲在數據區,它們的生命周期就是整個程序。如果它們是靜態局部變量,它們的作用域在一對{}內。如果它們是靜態全局變量,那么它們的作用域是。對于當前文件。靜態變量如果沒有初始化,會自動初始化為0。靜態變量只能初始化一次。