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