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