堆、棧、方法區的區別


基礎數據類型(Value type)直接在棧(stack)空間分配,方法的形式參數,直接在棧空間分配,當方法調用完成后從棧空間回收。

引用數據類型,需要用new來創建,既在棧空間分配一個地址空間(reference),又在堆空間分配對象的類變量(object)。

方法的引用參數,在棧空間分配一個地址空間,並指向堆空間的對象區,當方法調用完成后從棧空間回收。

局部變量 new出來時,在棧空間和堆空間中分配空間,當局部變量生命周期結束后,棧空間立刻被回收,堆空間區域等待GC回收。

字符串常量在方法區分配 ,this在堆空間分配。數組既在棧空間分配數組名稱, 又在堆空間分配數組實際的大小!

 

JAVA的JVM的內存可分為3個區:堆(heap)、棧(stack)和方法區(method)

 

堆:1. 用於存放創建的對象本身和數組(數組也是對象)

  2. JVM只有一個堆,被所有線程共享

  3. 堆是一個不連續的內存空間,分配靈活,速度慢

  

 

棧:1. 描述方法執行的內存模型,每個方法都會建一個棧幀(存儲局部變量、操作數、方法出口等)

  2. JVM為每個進程創建一個棧,用於存放該線程執行方法的信息  (實際參數、局部變量)

  3. 還用於存放對象的引用  (例:A  a = new A() ,a即為對象new A()的引用)

  4. 棧屬於線程私有,不能實現線程間的共享 

  5. 棧是由系統自動分配,速度快,棧是一個連續的存儲空間

  6. 棧分為3個部分:基本類型變量區、執行環境上下文、操作指令區(存放操作指令)。

 

方法區(靜態區):1. JVM只有一個方法區,被所有線程共享

         2. 實際上也是堆,只是用於存儲類、常量相關信息

         3. 用來存放程序中永遠不變或唯一的內容(類信息、靜態變量、字符串常量等)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM