java堆棧 常量池 方法區

程序中存放數據的內存分爲四塊,另有一塊存放代碼。java

1. 方法區:存放全局變量和靜態變量函數

2.常量池:存放常量字符串對象

3.棧:存放函數的參數值,局部變量的值生命週期

4.堆:存放成員變量(實例變量),通常內存泄漏會發生內存

堆:存放全部new 出來的對象字符串

棧:存放基本類型的變量數據和對象的引用,對象(new 出來的對象)自己並不存在棧中,而是存放在堆中或者常量池中(字符串常量對象)編譯器

常量池:存放基本類型常量和字符串常量編譯

對於棧和常量池中的對象能夠共享,對於堆中的對象不能夠共享。棧中的數據大小和生命週期是能夠肯定的,當沒有引用指向數據時,這個數據就會消失。堆中的對象的垃圾回事器負責回收,所以大小和聲明週期不須要肯定,具備很大的靈活性變量

對於字符串來講,其對象的引用都是存儲在棧中的, 若是是編譯期已經建立好的(用雙引號定義的)就存儲在常量池中,若是是運行期(new 出來的對象) 則存儲在堆中。對於equals相等的字符串,在常量池中也只有一份,在堆中有多份。內存泄漏

java的堆是一個運行時數據區,類的(對象從中分配空間,堆由垃圾回收機制來負責的,堆的優點就是能夠動態的分配內存大小,生存期沒必要實現告訴編譯器,由於他是在運行時動態分配內存的,java的垃圾收集器會自動收走這些再也不使用的數據,但缺點是因爲要在運行時動態分配內存,存取速比較慢)

棧:存取速度比寄存器快,棧數據能夠共享,但缺點是 棧中的數據大小和生存期必須是肯定的,缺少靈活性。棧中存放的是一些基本類型的變量(int short byte long float double boolean char )和對象把柄。

相關文章
相關標籤/搜索