java大數(shù)據(jù)棧和堆的區(qū)別,搞 Java 最重要的是什么?毫不夸張地說,掌握和了解java中堆和棧的區(qū)別!!!!??,基本就能走遍天下都不怕了!
1.java中堆和棧的區(qū)別!!!!
堆: 是大家共有的空間,分全局堆和局部堆。全局堆就是所有沒有分配的空間,局部堆就是用戶分配的空間。堆在操作系統(tǒng)對進程初始化的時候分配,運行過程中也可以向系統(tǒng)要額外的堆,但是記得用完了要還給操作系統(tǒng),要不然就是內(nèi)存泄漏。棧:是個線程獨有的,保存其運行狀態(tài)和局部自動變量的。棧在線程開始的時候初始化,每個線程的棧互相獨立,因此,棧是 thread safe的。每個C ++對象的數(shù)據(jù)成員也存在在棧中,每個函數(shù)都有自己的棧,棧被用來在函數(shù)之間傳遞參數(shù)。操作系統(tǒng)在切換線程的時候會自動的切換棧,就是切換 SS/ESP寄存器。棧空間不需要在高級語言里面顯式的分配和釋放。1、棧區(qū)(stack)- 由編譯器自動分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。2、堆區(qū)(heap) - 一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時可能由OS回收 。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,分配方式倒是類似于鏈表,呵呵。3、全局區(qū)(靜態(tài)區(qū))(static)-,全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域, 未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。 - 程序結(jié)束后有系統(tǒng)釋放 4、文字常量區(qū)-常量字符串就是放在這里的。 程序結(jié)束后由系統(tǒng)釋放5、程序代碼區(qū)-存放函數(shù)體的二進制代碼。2.1申請方式stack:由系統(tǒng)自動分配。例如,聲明在函數(shù)中一個局部變量 int b; 系統(tǒng)自動在棧中為b開辟空間heap:需要程序員自己申請,并指明大小,在c中malloc函數(shù)如p1 = (char *)malloc(10);在C++中用new運算符如p2 = (char *)malloc(10);但是注意p1、p2本身是在棧中的。全局變量是在所有函數(shù)之外聲明的變量,局部變量則是在函數(shù)體內(nèi)聲明的變量。全局變量放在內(nèi)存的全程數(shù)據(jù)區(qū),局部變量在棧上申請。全局數(shù)據(jù)區(qū)分為兩部分全局數(shù)據(jù)區(qū)和靜態(tài)數(shù)據(jù)區(qū),靜態(tài)數(shù)據(jù)區(qū)專門存放static變量。static的全局變量只在該文件范圍內(nèi)可見,不能用extern聲明為外部變量。 編譯器會自動初始化全局變量。堆和棧的區(qū)別可以用如下的比喻來看出: 使用棧就象我們?nèi)ワ堭^里吃飯,只管點菜(發(fā)出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。 使用堆就象是自己動手做喜歡吃的菜肴,比較麻煩,但是比較符合自己的口味,而且自由度大。
雖說掌握和了解了java中堆和棧的區(qū)別!!!!??,能走遍天下,但也要不斷去學(xué)習(xí)新的知識,更多的Java知識,請聯(lián)系客服獲取。