本文目錄一覽:
- 1、java中堆和棧有什麼區別?
- 2、北大青鳥java培訓:堆和棧的區別?
- 3、java堆棧是什麼意思?
- 4、請簡單通俗易懂的解釋一下在Java中什麼叫堆 什麼叫棧 謝謝
- 5、北大青鳥java培訓:增加java堆空間方法?
java中堆和棧有什麼區別?
堆:(對象)
引用類型的變數,其內存分配在堆上或者常量池(字元串常量、基本數據類型常量),需要通過new等方式來創建。
堆內存主要作用是存放運行時創建(new)的對象。
(主要用於存放對象,存取速度慢,可以運行時動態分配內存,生存期不需要提前確定)
棧:(基本數據類型變數、對象的引用變數)
基本數據類型的變數(int、short、long、byte、float、double、boolean、char等)以及對象的引用變數,其內存分配在棧上,變數出了作用域就會自動釋放。
棧內存的主要作用是存放基本數據類型和引用變數。棧的內存管理是通過棧的”後進先出”模式來實現的。
(主要用來執行程序,存取速度快,大小和生存期必須確定,缺乏靈活性)
北大青鳥java培訓:堆和棧的區別?
棧:在編譯過程中分配的內存空間是由操作系統(編譯器)自動分配和釋放的,而堆棧上的空間是有限的。
在編譯過程中,程序在堆棧上同時為變數和函數分配內存,並且在堆棧上執行運行時函數調用的參數傳遞。
堆:在程序運行期間動態分配的內存空間,您可以根據程序運行的方式來確定要分配的堆內存的大小。
發行版通常由程序員分配。
內存函數的分配,如new和malloc,分配給堆。
棧是機器系統提供的數據結構,堆由C/c++函數庫提供。
棧是系統提供的功能,其特點是快速高效,缺點是有限的,數據不靈活;該堆棧是函數庫的函數,具有靈活性和方便性的特點,數據被廣泛使用,但效率可以降低。
棧是系統數據結構,它是流程/線程的唯一。
堆是函數庫的內部數據結構,不一定是唯一的。
不同堆分配的內存不能相互操作。
堆棧空間有兩種靜態分布和動態分配。
靜態分配由編譯器完成,例如自動變數(自動)分布。
動態分配由alloca函數完成。
棧的動態分配不需要釋放(自動),也沒有釋放函數。
對於便攜程序,不鼓勵動態分配堆棧。
堆空間分配是動態的,雖然在程序的末尾,所有的數據空間都將被釋放回系統中,但是精確的應用程序內存/空閑內存匹配是良好應用程序的基本要素。
堆內存用於保存由新分配的內存在堆中創建的對象和數組,並由虛擬機的自動垃圾收集器管理。
創建了一個數組或對象在堆中,堆棧可以也是一個特殊的變數,讓棧中這個變數的值等於數組或對象在堆內存地址,棧中的變數是一個數組或對象的引用變數,它可用於程序後引用變數來訪問堆中的堆棧數組或對象,引用變數是一個數組或對象名稱。
引用變數是在定義時在堆棧中分配的普通變數,並且在程序超出其範圍後會釋放引用的變數。
江西電腦培訓發現和數組在堆中分配和對象本身,即使您的應用程序是使用新的數組或對象聲明的一個代碼塊,數組和對象本身佔用內存不會被釋放,數組和對象沒有引用變數指向它,成為一種浪費,不在使用,但仍佔據內存空間,其次是垃圾收集器在一個不確定的時間。
java堆棧是什麼意思?
簡單的說:Java把內存劃分成兩種:一種是棧內存,一種是堆內存。\x0d\x0a \x0d\x0a在函數中定義的一些基本類型的變數和對象的引用變數都在函數的棧內存中分配。當在一段代碼塊定義一個變數時,Java就在棧中為這個變數分配內存空間,當超過變數的作用域後,Java會自動釋放掉為該變數所分配的內存空間,該內存空間可以立即被另作他用。\x0d\x0a \x0d\x0a堆內存用來存放由new創建的對象和數組。在堆中分配的內存,由Java虛擬機的自動垃圾回收器來管理。在堆中產生了一個數組或對象後,還可以在棧中定義一個特殊的變數,讓棧中這個變數的取值等於數組或對象在堆內存中的首地址,棧中的這個變數就成了數組或對象的引用變數。引用變數就相當於是為數組或對象起的一個名稱,以後就可以在程序中使用棧中的引用變數來訪問堆中的數組或對象
請簡單通俗易懂的解釋一下在Java中什麼叫堆 什麼叫棧 謝謝
堆:也叫動態內存,相當於一個內存池子,在java中創建對象的時候,就從堆裡面拿出一塊來存放對象;當GC(垃圾回收)回收對象的時候,又把對象佔用的內容還給堆。
舉個例子:堆就好比一個麵糰,類就好比一個饅頭印子,用印子從麵糰中取出一小塊麵糰,印成饅頭,這個饅頭就是這個饅頭印子類產生的對象了。當無限的創建饅頭的時候,這個麵糰總會被用光的,這個時候就不能在創建新的饅頭了。
所有GC就有存在的必要了,當對象不被持有的時候,GC就會把對象還給堆。也就是,當這個饅頭沒有被使用,這個饅頭就變成小麵糰,還給麵糰。
棧:也是一段內存,但是這段內存比較有特點,遵循一個先進後出的規則。
舉個例子:吃過罐裝的薯片吧,薯片一片一片的放到罐裡面去,想想,最先放進去的是不是放在罐的最底部。現在一片片把薯片取出來,是不是要從最頂部開始去,也就是最後放進去的,最先取出來。這個薯片放進去和取出來的這個過程,就是棧的工作原理啦(先進入的後出來,後進入的先出來)
在java中的棧:棧的原理明白了,其實只要是計算機只要是編程語言,什麼堆什麼棧都是一樣的,基本作用也一樣。java中可以認為,棧用來存放局部變數的。
public void fun(){
int i=0; //i 是一個局部變數,存放在棧裡面的
Object obj = new Objec(); //obj 是一個對象應用,同樣也是一個局部變數,存放在站裡面的,但是obj指向的對象,在存在堆中
}
北大青鳥java培訓:增加java堆空間方法?
在大多數32位機、Sun的JVM上,Java的堆空間默認的大小為128MB,但也有例外,例如在32未Solaris操作系統(SPARC平台版本)上,默認的最大堆空間和起始堆空間大小為-Xms=3670K和-Xmx=64M。
對於64位操作系統,一般堆空間大小增加約30%。
但你使用Java1.5的throughput垃圾回收器,默認最大的堆大小為物理內存的四分之一,而起始堆大小為物理內存的十六分之一。
要想知道默認的堆大小的方法,可以用默認的設置參數打開一個程序,使用JConsole(JDK1.5之後都支持)來查看,在VMSummary頁面可以看到最大的堆大小。
用這種方法你可以根據你的程序的需要來改變堆內存大小,我強烈建議採用這種方法而不是默認值。
如果你的程序很大,有很多對象需要被創建的話,你可以用-Xmsand-Xmx這兩個參數來改變堆內存的大小。
Xms表示起始的堆內存大小,Xmx表示最大的堆內存的大小。
另外有一個參數-Xmn,它表示newgeneration(後面會提到)的大小。
陝西電腦培訓認為有一件事你需要注意,你不能任意改變堆內存的大小,你只能在啟動JVM時設定它。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/284928.html